diff --git a/resources/config_model/locales.toml b/resources/config_model/locales.toml new file mode 100644 index 0000000..7435b72 --- /dev/null +++ b/resources/config_model/locales.toml @@ -0,0 +1,44 @@ +[en] + id = "en" + [en.itms] + html_title = "Doc Server" + html_header = "" + html_footer = "" + req_expired = "Request expired" + expired_in = "Expired in" + seconds = "seconds" + try_again = "try again !" + principal = "Doc Server" + log_req = "Log Req" + log_data = "Log Data" + sign_in = "Sign In" + list = "List" + profiles = "Profiles" + reload = "Reload" + search = "Search" + done = "Done" + info = "Info" + log = "Log" + trace = "Trace" + debug = "Debug" + error = "Error" + warn = "Warn" + rust = "Rust" + unknown = "Unknown" + all = "All" + view_settings = "View Conf." + documentation = "Documentation" + logfrmt_sel_enter = "Sel.Enter" + logfrmt_rev_data = "Last" + log_timestamp = "Time" + log_loglevel = "Level" + log_where = "Where" + log_source = "Source" + log_line = "Line" + log_note = "Note" + view_other_options = "More-Ops." + main = "Main" + ogs_list = "Logs List" + curr_env = "Environment" + curr_env_aut = "Env. Auth" + howitwasmade = "How was made" diff --git a/resources/config_model/menu_items.toml b/resources/config_model/menu_items.toml new file mode 100644 index 0000000..8672bc5 --- /dev/null +++ b/resources/config_model/menu_items.toml @@ -0,0 +1,35 @@ +[[web_menu_items]] +# ~home text part will be removed, it is to indicate it is a home link +text = "~home" +url = "/" +roles = [] + +[[web_menu_items]] +typ = "icon" +srctyp = "mdbook" +text = "DocServer" +url = "/docserver" +roles = ["dev"] +[[web_menu_items.items]] +typ = "icon" +srctyp = "mdbook" +text = "Documentation" +url = "/docserver" +roles = ["dev"] +[[web_menu_items.items]] +typ = "icon" +srctyp = "source" +text = "Source Docs" +url = "/srcdocserver" +roles = ["dev"] +[[web_menu_items.items]] +typ = "icon" +srctyp = "git" +text = "Git Repo" +url = "docserver" +roles = ["dev"] + +[[web_menu_items]] +text = "Users" +url = "/users" +roles = ["admin"] diff --git a/resources/config_model/serv_paths.toml b/resources/config_model/serv_paths.toml new file mode 100644 index 0000000..92ac55e --- /dev/null +++ b/resources/config_model/serv_paths.toml @@ -0,0 +1,45 @@ +[[serv_paths]] +src_path = "assets" +url_path = "/assets" +not_found = "" +not_auth = "/" +is_restricted = false + +[[serv_paths]] +src_path = "html" +url_path = "/html" +not_found = "" +not_auth = "/" +is_restricted = false + +[[serv_paths]] +src_path = "docs" +url_path = "/docs" +not_found = "" +not_auth = "/login" +is_restricted = true + +[[serv_paths]] +src_path = "dist" +url_path = "/dist" +not_found = "" +not_auth = "/dist" +is_restricted = false + +[[serv_paths]] +src_path = "docserver" +url_path = "/docserver" +not_found = "" +roles = "dev" +redirect_to = "/login" +not_auth = "/login" +is_restricted = true + +[[serv_paths]] +src_path = "srcdocserver" +url_path = "/srcdocserver" +not_found = "" +roles = "dev,cl" +redirect_to = "/login" +not_auth = "/login" +is_restricted = true diff --git a/resources/config_model/site.toml b/resources/config_model/site.toml new file mode 100644 index 0000000..af18db9 --- /dev/null +++ b/resources/config_model/site.toml @@ -0,0 +1,155 @@ +## Root path for filea and relative path settings +root_path = "sitehome" +# Sever name +name = "docserver" +org = "org" +# Show verbose info from 0 to 2 +verbose = 0 +# Main root path for all rest +home_path = "" +prefix = "" +resources_path = "resources" + +## Certs for SSL only for protocol = "https" +cert_file = "sitehome/certs/fullchain.pem" +key_file = "sitehome/certs/privkey.pem" + +## Templates path +templates_path = "templates" +defaults_path = "resources/defaults" + +## Main URLs +html_url = "/html" +assets_url = "/assets" + +## Origin allowed for CORS requests +allow_origin = ["http://localhost:3000"] + +## HOST ip or name for Web service +hostport = "localhost:3000" + +## IP address to bind web service +bind = "0.0.0.0" + +## PORT for Web service +port = 8800 +## PROTOCOL for Web service: "http" or "https" (will do bind_rustls with cert_file and key_file) +protocol = "http" + +## Availables Langs +langs = ["en","es"] +dflt_lang = "en" +## Setting path for locales +path_locales_config = "config/locales.toml" + +## How to signup by "invitation" or "open" +signup_mode = "open" +## Exporation time for invitations in seconds +invite_expire = 900 # in seconds + +## Use of TOTP Mode: "mandatory", "optional", "no" (default) +totp_mode = "optional" +## Number of TOTP digits: 6 (default) or 8 +totp_digits = 6 +## TOTP Algorithm: "sha1" (default), "sha256", "sha512"" +totp_algorithm = "sha256" + +## Password score value from 0 to 3 +password_score = 0 +## Defaul ADMIN fields +admin_fields = "roles,otp_base32,status" + +## Token use: true or false +use_token = false + +## Main use for notifications: true or false +use_mail = false +## SMTP host +smtp = "mailserver.example" +## SMTP auth can be text as: "user@domain|password" but for safety is much better to generate via "tools/get_mail_token.sh" after setting "sitehome/srv" token keys +smtp_auth = "v4.public...." +## Mails from address +mail_from ="docserver@mydomain.com" + +## Users Storage URI + +#users_store_uri = "file:///data/users" +users_store_uri = "sqlite:sitehome/data/users.db" + +## Log user store access +user_store_access = "access" + +## CASBIN authorizations and access control files settings +authz_model_path = "srvc/model.conf" +authz_policy_path = "srvc/policy.csv" + +## Defaul auth roles +auth_roles = ["dev"] + +## Store trace values: +trace_store_uri = "file:///logs/trace" +trace_level = 1 + +## Sessions store URI +#session_store_uri = "file:///data/sessions" +session_store_uri = "sqlite:sitehome/data/sessions.db" + +## Sessions store file +session_store_file = "session" +## Expiration session time in seconds if sessions is not used +session_expire = 300 + +## Menu Items settings path +path_menu_items = "config/menu_items.toml" +## Serv path settings file, where path are defined: url, auth, is_restricted ... +path_serv_paths = "config/serv_paths.toml" + +## Templates path and settings +[tpls] + url = "http://localhost:8800/" + main = "home.html.j2" + info = "info.html.j2" + help = "help.html.j2" + notfound = "notfound.html.j2" + notauth = "notauth.html.j2" + login = "login.html.j2" + logout = "logout.html.j2" + signup = "signup.html.j2" + user_settings = "user_settings.html.j2" + invite_create = "invite_create.html.j2" + invite_output = "invite_output.html.j2" + invite_mail_html = "invite_mail.html.j2" + invite_mail_txt = "invite_mail.txt.j2" + reset_password_mail_html = "reset_password_mail.html.j2" + reset_password_mail_txt = "reset_password_mail.txt.j2" + logs = "logs.html.j2" + users = "users.html.j2" + trylater = "trylater.j2" + session = "session.j2" + js = "js" + css = "" + +## Paseto Tokens settings +[paseto] + public_path = "srvc/public.ky" + secret_path = "srvc/secret.ky" + is_bin = false + assert_val = "" + expire = true +[paseto.map_footer] +[paseto.data] + + +## UI settings: css and links paths +[ui] +main_name = "

Doc Server

" +title = "Doc Libraries" +#title = "
A Cryptographic Library
You can TRust
" +#subtitle = "

Fast, Secure, Agile

Customizable to contexts and needs

" +subtitle = "Documentations" +css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" +js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime" +main_js_link = "/assets/js/main.js" +utils_js_link = "/assets/js/utils.js" +other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css" +other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js" diff --git a/resources/sitehome_model/assets/css/._flowbite.min.css b/resources/sitehome_model/assets/css/._flowbite.min.css new file mode 100644 index 0000000..4b30aae Binary files /dev/null and b/resources/sitehome_model/assets/css/._flowbite.min.css differ diff --git a/resources/sitehome_model/assets/css/flowbite.min.css b/resources/sitehome_model/assets/css/flowbite.min.css new file mode 100644 index 0000000..10caf21 --- /dev/null +++ b/resources/sitehome_model/assets/css/flowbite.min.css @@ -0,0 +1 @@ +/*! tailwindcss v3.3.0 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#1c64f2;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}select:not([size]){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-width:1px;color:#1c64f2;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}.dark [type=checkbox]:checked,.dark [type=radio]:checked,[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:transparent}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px auto inherit}input[type=file]::file-selector-button{-webkit-margin-start:-1rem;-webkit-margin-end:1rem;background:#1f2937;border:0;color:#fff;cursor:pointer;font-size:.875rem;font-weight:500;margin-inline-end:1rem;margin-inline-start:-1rem;padding:.625rem 1rem .625rem 2rem}input[type=file]::file-selector-button:hover{background:#374151}.dark input[type=file]::file-selector-button{background:#4b5563;color:#fff}.dark input[type=file]::file-selector-button:hover{background:#6b7280}input[type=range]::-webkit-slider-thumb{appearance:none;-moz-appearance:none;-webkit-appearance:none;background:#1c64f2;border:0;border-radius:9999px;cursor:pointer;height:1.25rem;width:1.25rem}input[type=range]:disabled::-webkit-slider-thumb{background:#9ca3af}.dark input[type=range]:disabled::-webkit-slider-thumb{background:#6b7280}input[type=range]:focus::-webkit-slider-thumb{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1px;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity));box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);outline:2px solid transparent;outline-offset:2px}input[type=range]::-moz-range-thumb{appearance:none;-moz-appearance:none;-webkit-appearance:none;background:#1c64f2;border:0;border-radius:9999px;cursor:pointer;height:1.25rem;width:1.25rem}input[type=range]:disabled::-moz-range-thumb{background:#9ca3af}.dark input[type=range]:disabled::-moz-range-thumb{background:#6b7280}input[type=range]::-moz-range-progress{background:#3f83f8}input[type=range]::-ms-fill-lower{background:#3f83f8}input[type=range].range-sm::-webkit-slider-thumb{height:1rem;width:1rem}input[type=range].range-lg::-webkit-slider-thumb{height:1.5rem;width:1.5rem}input[type=range].range-sm::-moz-range-thumb{height:1rem;width:1rem}input[type=range].range-lg::-moz-range-thumb{height:1.5rem;width:1.5rem}.toggle-bg:after{background:#fff;border-color:#d1d5db;border-radius:9999px;border-width:1px;box-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);content:"";height:1.25rem;left:.125rem;position:absolute;top:.125rem;transition-duration:.15s;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;width:1.25rem}input:checked+.toggle-bg:after{border-color:#fff;transform:translateX(100%);}input:checked+.toggle-bg{background:#1c64f2;border-color:#1c64f2}.tooltip-arrow,.tooltip-arrow:before{background:inherit;height:8px;position:absolute;width:8px}.tooltip-arrow{visibility:hidden}.tooltip-arrow:before{content:"";transform:rotate(45deg);visibility:visible}[data-tooltip-style^=light]+.tooltip>.tooltip-arrow:before{border-color:#e5e7eb;border-style:solid}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-left-width:1px;border-top-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-right-width:1px;border-top-width:1px}.tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.tooltip.invisible>.tooltip-arrow:before{visibility:hidden}[data-popper-arrow],[data-popper-arrow]:before{background:inherit;height:8px;position:absolute;width:8px}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:after,[data-popper-arrow]:before{content:"";transform:rotate(45deg);visibility:visible}[data-popper-arrow]:after{background:inherit;height:9px;position:absolute;width:9px}[role=tooltip]>[data-popper-arrow]:before{border-color:#e5e7eb;border-style:solid}.dark [role=tooltip]>[data-popper-arrow]:before{border-color:#4b5563;border-style:solid}[role=tooltip]>[data-popper-arrow]:after{border-color:#e5e7eb;border-style:solid}.dark [role=tooltip]>[data-popper-arrow]:after{border-color:#4b5563;border-style:solid}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:before{border-bottom-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:before{border-bottom-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:before{border-left-width:1px;border-top-width:1px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:before{border-right-width:1px;border-top-width:1px}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-5px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-5px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:-5px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-5px}[role=tooltip].invisible>[data-popper-arrow]:after,[role=tooltip].invisible>[data-popper-arrow]:before{visibility:hidden}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{bottom:0;top:0}.-left-1{left:-.25rem}.-left-1\.5{left:-.375rem}.-left-14{left:-3.5rem}.-left-3{left:-.75rem}.-left-4{left:-1rem}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.-top-\[140px\]{top:-140px}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-2\.5{bottom:.625rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-6{bottom:1.5rem}.bottom-\[\*px\]{bottom:*px}.bottom-\[60px\]{bottom:60px}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-5{left:1.25rem}.left-6{left:1.5rem}.left-7{left:1.75rem}.left-8{left:2rem}.left-auto{left:auto}.right-0{right:0}.right-1\/2{right:50%}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-24{right:6rem}.right-3{right:.75rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.right-auto{right:auto}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-2\.5{top:.625rem}.top-2\/4{top:50%}.top-28{top:7rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-6{top:1.5rem}.-z-10{z-index:-10}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-6{grid-column:span 6/span 6}.m-4{margin:1rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.-my-1{margin-bottom:-.25rem;margin-top:-.25rem}.-my-1\.5{margin-bottom:-.375rem;margin-top:-.375rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-12{margin-bottom:3rem;margin-top:3rem}.my-2{margin-bottom:.5rem;margin-top:.5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.my-4{margin-bottom:1rem;margin-top:1rem}.my-6{margin-bottom:1.5rem;margin-top:1.5rem}.my-7{margin-bottom:1.75rem;margin-top:1.75rem}.my-8{margin-bottom:2rem;margin-top:2rem}.-mb-5{margin-bottom:-1.25rem}.-mb-px{margin-bottom:-1px}.-ml-0{margin-left:0}.-ml-0\.5{margin-left:-.125rem}.-ml-1{margin-left:-.25rem}.-ml-px{margin-left:-1px}.-mr-1{margin-right:-.25rem}.-mt-1{margin-top:-.25rem}.-mt-5{margin-top:-1.25rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-8{margin-bottom:2rem}.mb-px{margin-bottom:1px}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-8{margin-right:2rem}.mr-auto{margin-right:auto}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.mt-px{margin-top:1px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.flow-root{display:flow-root}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0{height:0}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-36{height:9rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[52px\]{height:52px}.h-\[56px\]{height:56px}.h-\[calc\(100\%-1rem\)\]{height:calc(100% - 1rem)}.h-\[calc\(100vh-5rem\)\]{height:calc(100vh - 5rem)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-72{max-height:18rem}.max-h-full{max-height:100%}.w-1{width:.25rem}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/4{width:50%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[52px\]{width:52px}.w-\[56px\]{width:56px}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-2xl{max-width:42rem}.max-w-2xs{max-width:16rem}.max-w-4xl{max-width:56rem}.max-w-7xl{max-width:80rem}.max-w-8xl{max-width:90rem}.max-w-\[128px\]{max-width:128px}.max-w-\[300px\]{max-width:300px}.max-w-\[330px\]{max-width:330px}.max-w-\[360px\]{max-width:360px}.max-w-\[380px\]{max-width:380px}.max-w-\[400px\]{max-width:400px}.max-w-\[440px\]{max-width:440px}.max-w-\[450px\]{max-width:450px}.max-w-\[460px\]{max-width:460px}.max-w-\[480px\]{max-width:480px}.max-w-\[48px\]{max-width:48px}.max-w-\[500px\]{max-width:500px}.max-w-\[540px\]{max-width:540px}.max-w-\[640px\]{max-width:640px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-screen-md{max-width:768px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.origin-\[0\]{transform-origin:0}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x:-100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.-translate-y-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-3{--tw-translate-y:-0.75rem}.-translate-y-4{--tw-translate-y:-1rem}.-translate-y-4,.-translate-y-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-6{--tw-translate-y:-1.5rem}.-translate-y-full{--tw-translate-y:-100%}.-translate-y-full,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x:0px}.translate-x-1\/2{--tw-translate-x:50%}.translate-x-1\/2,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-1\/2{--tw-translate-y:50%}.translate-y-1\/2,.translate-y-1\/4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1\/4{--tw-translate-y:25%}.translate-y-full{--tw-translate-y:100%}.rotate-180,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-75{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-none{transform:none}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-3{row-gap:.75rem}.-space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-.75rem*var(--tw-space-x-reverse))}.-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1rem*var(--tw-space-x-reverse))}.-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.625rem*var(--tw-space-x-reverse))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.625rem*var(--tw-space-y-reverse));margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(2px*var(--tw-divide-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(209 213 219/var(--tw-divide-opacity))}.divide-gray-500>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(107 114 128/var(--tw-divide-opacity))}.place-self-center{place-self:center}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-b{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b-lg{border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem}.rounded-l-full{border-bottom-left-radius:9999px;border-top-left-radius:9999px}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-l-md{border-bottom-left-radius:.375rem;border-top-left-radius:.375rem}.rounded-r{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.rounded-r-full{border-bottom-right-radius:9999px;border-top-right-radius:9999px}.rounded-r-lg{border-bottom-right-radius:.5rem;border-top-right-radius:.5rem}.rounded-r-md{border-bottom-right-radius:.375rem;border-top-right-radius:.375rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-x{border-left-width:1px;border-right-width:1px}.border-y{border-top-width:1px}.border-b,.border-y{border-bottom-width:1px}.border-b-0{border-bottom-width:0}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-0{border-right-width:0}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.border-t-4{border-top-width:4px}.border-dashed{border-style:dashed}.\!border-blue-700{--tw-border-opacity:1!important;border-color:rgb(26 86 219/var(--tw-border-opacity))!important}.border-blue-100{--tw-border-opacity:1;border-color:rgb(225 239 254/var(--tw-border-opacity))}.border-blue-300{--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity))}.border-blue-400{--tw-border-opacity:1;border-color:rgb(118 169 250/var(--tw-border-opacity))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity))}.border-blue-800{--tw-border-opacity:1;border-color:rgb(30 66 159/var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.border-gray-500{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}.border-green-300{--tw-border-opacity:1;border-color:rgb(132 225 188/var(--tw-border-opacity))}.border-green-400{--tw-border-opacity:1;border-color:rgb(49 196 141/var(--tw-border-opacity))}.border-green-500{--tw-border-opacity:1;border-color:rgb(14 159 110/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(5 122 85/var(--tw-border-opacity))}.border-green-700{--tw-border-opacity:1;border-color:rgb(4 108 78/var(--tw-border-opacity))}.border-green-800{--tw-border-opacity:1;border-color:rgb(3 84 63/var(--tw-border-opacity))}.border-indigo-400{--tw-border-opacity:1;border-color:rgb(141 162 251/var(--tw-border-opacity))}.border-pink-400{--tw-border-opacity:1;border-color:rgb(241 126 184/var(--tw-border-opacity))}.border-purple-400{--tw-border-opacity:1;border-color:rgb(172 148 250/var(--tw-border-opacity))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(108 43 217/var(--tw-border-opacity))}.border-red-300{--tw-border-opacity:1;border-color:rgb(248 180 180/var(--tw-border-opacity))}.border-red-400{--tw-border-opacity:1;border-color:rgb(249 128 128/var(--tw-border-opacity))}.border-red-500{--tw-border-opacity:1;border-color:rgb(240 82 82/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(224 36 36/var(--tw-border-opacity))}.border-red-700{--tw-border-opacity:1;border-color:rgb(200 30 30/var(--tw-border-opacity))}.border-red-800{--tw-border-opacity:1;border-color:rgb(155 28 28/var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity))}.border-yellow-400{--tw-border-opacity:1;border-color:rgb(227 160 8/var(--tw-border-opacity))}.border-yellow-800{--tw-border-opacity:1;border-color:rgb(114 59 19/var(--tw-border-opacity))}.border-l-gray-100{--tw-border-opacity:1;border-left-color:rgb(243 244 246/var(--tw-border-opacity))}.border-l-gray-50{--tw-border-opacity:1;border-left-color:rgb(249 250 251/var(--tw-border-opacity))}.bg-\[\#050708\]{--tw-bg-opacity:1;background-color:rgb(5 7 8/var(--tw-bg-opacity))}.bg-\[\#1da1f2\]{--tw-bg-opacity:1;background-color:rgb(29 161 242/var(--tw-bg-opacity))}.bg-\[\#24292F\]{--tw-bg-opacity:1;background-color:rgb(36 41 47/var(--tw-bg-opacity))}.bg-\[\#2557D6\]{--tw-bg-opacity:1;background-color:rgb(37 87 214/var(--tw-bg-opacity))}.bg-\[\#3b5998\]{--tw-bg-opacity:1;background-color:rgb(59 89 152/var(--tw-bg-opacity))}.bg-\[\#4285F4\]{--tw-bg-opacity:1;background-color:rgb(66 133 244/var(--tw-bg-opacity))}.bg-\[\#F7BE38\]{--tw-bg-opacity:1;background-color:rgb(247 190 56/var(--tw-bg-opacity))}.bg-\[\#FF9119\]{--tw-bg-opacity:1;background-color:rgb(255 145 25/var(--tw-bg-opacity))}.bg-\[\#hex\]{background-color:#hex}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity))}.bg-blue-200{--tw-bg-opacity:1;background-color:rgb(195 221 253/var(--tw-bg-opacity))}.bg-blue-300{--tw-bg-opacity:1;background-color:rgb(164 202 254/var(--tw-bg-opacity))}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity))}.bg-blue-50{--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity))}.bg-blue-800{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity))}.bg-blue-900{--tw-bg-opacity:1;background-color:rgb(35 56 118/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-gray-900\/50{background-color:rgba(17,24,39,.5)}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity))}.bg-green-200{--tw-bg-opacity:1;background-color:rgb(188 240 218/var(--tw-bg-opacity))}.bg-green-300{--tw-bg-opacity:1;background-color:rgb(132 225 188/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(49 196 141/var(--tw-bg-opacity))}.bg-green-50{--tw-bg-opacity:1;background-color:rgb(243 250 247/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity))}.bg-green-700{--tw-bg-opacity:1;background-color:rgb(4 108 78/var(--tw-bg-opacity))}.bg-green-800{--tw-bg-opacity:1;background-color:rgb(3 84 63/var(--tw-bg-opacity))}.bg-green-900{--tw-bg-opacity:1;background-color:rgb(1 71 55/var(--tw-bg-opacity))}.bg-indigo-100{--tw-bg-opacity:1;background-color:rgb(229 237 255/var(--tw-bg-opacity))}.bg-indigo-200{--tw-bg-opacity:1;background-color:rgb(205 219 254/var(--tw-bg-opacity))}.bg-indigo-300{--tw-bg-opacity:1;background-color:rgb(180 198 252/var(--tw-bg-opacity))}.bg-indigo-400{--tw-bg-opacity:1;background-color:rgb(141 162 251/var(--tw-bg-opacity))}.bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(240 245 255/var(--tw-bg-opacity))}.bg-indigo-500{--tw-bg-opacity:1;background-color:rgb(104 117 245/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(88 80 236/var(--tw-bg-opacity))}.bg-indigo-700{--tw-bg-opacity:1;background-color:rgb(81 69 205/var(--tw-bg-opacity))}.bg-indigo-800{--tw-bg-opacity:1;background-color:rgb(66 56 157/var(--tw-bg-opacity))}.bg-indigo-900{--tw-bg-opacity:1;background-color:rgb(54 47 120/var(--tw-bg-opacity))}.bg-orange-100{--tw-bg-opacity:1;background-color:rgb(254 236 220/var(--tw-bg-opacity))}.bg-orange-300{--tw-bg-opacity:1;background-color:rgb(253 186 140/var(--tw-bg-opacity))}.bg-pink-100{--tw-bg-opacity:1;background-color:rgb(252 232 243/var(--tw-bg-opacity))}.bg-pink-200{--tw-bg-opacity:1;background-color:rgb(250 209 232/var(--tw-bg-opacity))}.bg-pink-300{--tw-bg-opacity:1;background-color:rgb(248 180 217/var(--tw-bg-opacity))}.bg-pink-400{--tw-bg-opacity:1;background-color:rgb(241 126 184/var(--tw-bg-opacity))}.bg-pink-50{--tw-bg-opacity:1;background-color:rgb(253 242 248/var(--tw-bg-opacity))}.bg-pink-500{--tw-bg-opacity:1;background-color:rgb(231 70 148/var(--tw-bg-opacity))}.bg-pink-600{--tw-bg-opacity:1;background-color:rgb(214 31 105/var(--tw-bg-opacity))}.bg-pink-700{--tw-bg-opacity:1;background-color:rgb(191 18 93/var(--tw-bg-opacity))}.bg-pink-800{--tw-bg-opacity:1;background-color:rgb(153 21 75/var(--tw-bg-opacity))}.bg-pink-900{--tw-bg-opacity:1;background-color:rgb(117 26 61/var(--tw-bg-opacity))}.bg-purple-100{--tw-bg-opacity:1;background-color:rgb(237 235 254/var(--tw-bg-opacity))}.bg-purple-200{--tw-bg-opacity:1;background-color:rgb(220 215 254/var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity:1;background-color:rgb(202 191 253/var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity:1;background-color:rgb(172 148 250/var(--tw-bg-opacity))}.bg-purple-50{--tw-bg-opacity:1;background-color:rgb(246 245 255/var(--tw-bg-opacity))}.bg-purple-500{--tw-bg-opacity:1;background-color:rgb(144 97 249/var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(126 58 242/var(--tw-bg-opacity))}.bg-purple-700{--tw-bg-opacity:1;background-color:rgb(108 43 217/var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity:1;background-color:rgb(85 33 181/var(--tw-bg-opacity))}.bg-purple-900{--tw-bg-opacity:1;background-color:rgb(74 29 150/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(253 232 232/var(--tw-bg-opacity))}.bg-red-200{--tw-bg-opacity:1;background-color:rgb(251 213 213/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(248 180 180/var(--tw-bg-opacity))}.bg-red-400{--tw-bg-opacity:1;background-color:rgb(249 128 128/var(--tw-bg-opacity))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(253 242 242/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity))}.bg-red-700{--tw-bg-opacity:1;background-color:rgb(200 30 30/var(--tw-bg-opacity))}.bg-red-800{--tw-bg-opacity:1;background-color:rgb(155 28 28/var(--tw-bg-opacity))}.bg-red-900{--tw-bg-opacity:1;background-color:rgb(119 29 29/var(--tw-bg-opacity))}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(6 148 162/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-white\/30{background-color:hsla(0,0%,100%,.3)}.bg-white\/50{background-color:hsla(0,0%,100%,.5)}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(253 246 178/var(--tw-bg-opacity))}.bg-yellow-200{--tw-bg-opacity:1;background-color:rgb(252 233 106/var(--tw-bg-opacity))}.bg-yellow-300{--tw-bg-opacity:1;background-color:rgb(250 202 21/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(227 160 8/var(--tw-bg-opacity))}.bg-yellow-50{--tw-bg-opacity:1;background-color:rgb(253 253 234/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(194 120 3/var(--tw-bg-opacity))}.bg-yellow-600{--tw-bg-opacity:1;background-color:rgb(159 88 10/var(--tw-bg-opacity))}.bg-yellow-700{--tw-bg-opacity:1;background-color:rgb(142 75 16/var(--tw-bg-opacity))}.bg-yellow-800{--tw-bg-opacity:1;background-color:rgb(114 59 19/var(--tw-bg-opacity))}.bg-yellow-900{--tw-bg-opacity:1;background-color:rgb(99 49 18/var(--tw-bg-opacity))}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-\[url\(\'https\:\/\/flowbite\.s3\.amazonaws\.com\/docs\/jumbotron\/conference\.jpg\'\)\]{background-image:url(https://flowbite.s3.amazonaws.com/docs/jumbotron/conference.jpg)}.bg-\[url\(\'https\:\/\/flowbite\.s3\.amazonaws\.com\/docs\/jumbotron\/hero-pattern\.svg\'\)\]{background-image:url(https://flowbite.s3.amazonaws.com/docs/jumbotron/hero-pattern.svg)}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:#ebf5ff var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(235,245,255,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from:#3f83f8 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(63,131,248,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-cyan-400{--tw-gradient-from:#22d3ee var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(34,211,238,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(6,182,212,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-green-400{--tw-gradient-from:#31c48d var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(49,196,141,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-lime-200{--tw-gradient-from:#d9f99d var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:hsla(81,88%,80%,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-pink-400{--tw-gradient-from:#f17eb8 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(241,126,184,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-pink-500{--tw-gradient-from:#e74694 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(231,70,148,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from:#9061f9 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(144,97,249,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-purple-600{--tw-gradient-from:#7e3af2 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(126,58,242,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-red-200{--tw-gradient-from:#fbd5d5 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:hsla(0,83%,91%,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-red-400{--tw-gradient-from:#f98080 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:hsla(0,91%,74%,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-sky-400{--tw-gradient-from:#38bdf8 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(56,189,248,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-200{--tw-gradient-from:#afecef var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(175,236,239,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-300{--tw-gradient-from:#7edce2 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(126,220,226,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400{--tw-gradient-from:#16bdca var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(22,189,202,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-blue-600{--tw-gradient-via-position: ;--tw-gradient-to:rgba(28,100,242,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#1c64f2 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-cyan-500{--tw-gradient-via-position: ;--tw-gradient-to:rgba(6,182,212,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#06b6d4 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-green-500{--tw-gradient-via-position: ;--tw-gradient-to:rgba(14,159,110,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#0e9f6e var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-lime-400{--tw-gradient-via-position: ;--tw-gradient-to:rgba(163,230,53,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#a3e635 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-pink-500{--tw-gradient-via-position: ;--tw-gradient-to:rgba(231,70,148,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#e74694 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-purple-600{--tw-gradient-via-position: ;--tw-gradient-to:rgba(126,58,242,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#7e3af2 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-red-300{--tw-gradient-via-position: ;--tw-gradient-to:hsla(0,83%,84%,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#f8b4b4 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-red-500{--tw-gradient-via-position: ;--tw-gradient-to:rgba(240,82,82,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#f05252 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-teal-500{--tw-gradient-via-position: ;--tw-gradient-to:rgba(6,148,162,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#0694a2 var(--tw-gradient-via-position),var(--tw-gradient-to)}.to-blue-500{--tw-gradient-to:#3f83f8 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-blue-600{--tw-gradient-to:#1c64f2 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-blue-700{--tw-gradient-to:#1a56db var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-cyan-600{--tw-gradient-to:#0891b2 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-emerald-600{--tw-gradient-to:#059669 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-green-600{--tw-gradient-to:#057a55 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-lime-200{--tw-gradient-to:#d9f99d var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-lime-300{--tw-gradient-to:#bef264 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-lime-500{--tw-gradient-to:#84cc16 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-orange-400{--tw-gradient-to:#ff8a4c var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-pink-500{--tw-gradient-to:#e74694 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-pink-600{--tw-gradient-to:#d61f69 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-purple-700{--tw-gradient-to:#6c2bd9 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-red-600{--tw-gradient-to:#e02424 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-teal-600{--tw-gradient-to:#047481 var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-to-position: }.to-yellow-200{--tw-gradient-to:#fce96a var(--tw-gradient-to-position);--tw-gradient-to-position: }.bg-cover{background-size:cover}.bg-local{background-attachment:local}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-center{background-position:50%}.bg-no-repeat{background-repeat:no-repeat}.fill-blue-600{fill:#1c64f2}.fill-current{fill:currentColor}.fill-gray-600{fill:#4b5563}.fill-green-500{fill:#0e9f6e}.fill-pink-600{fill:#d61f69}.fill-purple-600{fill:#7e3af2}.fill-red-600{fill:#e02424}.fill-yellow-400{fill:#e3a008}.object-cover{-o-object-fit:cover;object-fit:cover}.\!p-0{padding:0!important}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-bottom:0;padding-top:0}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-3\.5{padding-bottom:.875rem;padding-top:.875rem}.py-4{padding-bottom:1rem;padding-top:1rem}.py-48{padding-bottom:12rem;padding-top:12rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-px{padding-bottom:1px;padding-top:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-48{padding-bottom:12rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-96{padding-bottom:24rem}.pl-0{padding-left:0}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-10{padding-top:2.5rem}.pt-16{padding-top:4rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-32{padding-top:8rem}.pt-36{padding-top:9rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-52{padding-top:13rem}.pt-6{padding-top:1.5rem}.pt-60{padding-top:15rem}.pt-64{padding-top:16rem}.pt-8{padding-top:2rem}.pt-80{padding-top:20rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-2xl{font-size:1.5rem;line-height:2rem}.text-2xs{font-size:.625rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-extralight{font-weight:200}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.font-thin{font-weight:100}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-9{line-height:2.25rem}.leading-loose{line-height:2}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-normal{letter-spacing:0}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.\!text-blue-700{--tw-text-opacity:1!important;color:rgb(26 86 219/var(--tw-text-opacity))!important}.text-\[\#626890\]{--tw-text-opacity:1;color:rgb(98 104 144/var(--tw-text-opacity))}.text-\[\#ff2d20\]{--tw-text-opacity:1;color:rgb(255 45 32/var(--tw-text-opacity))}.text-blue-100{--tw-text-opacity:1;color:rgb(225 239 254/var(--tw-text-opacity))}.text-blue-400{--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity))}.text-blue-50{--tw-text-opacity:1;color:rgb(235 245 255/var(--tw-text-opacity))}.text-blue-500{--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.text-blue-600\/100{color:#1c64f2}.text-blue-600\/25{color:rgba(28,100,242,.25)}.text-blue-600\/50{color:rgba(28,100,242,.5)}.text-blue-600\/75{color:rgba(28,100,242,.75)}.text-blue-700{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.text-blue-800{--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity))}.text-blue-900{--tw-text-opacity:1;color:rgb(35 56 118/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-400{--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(14 159 110/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(5 122 85/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(4 108 78/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(3 84 63/var(--tw-text-opacity))}.text-green-900{--tw-text-opacity:1;color:rgb(1 71 55/var(--tw-text-opacity))}.text-indigo-400{--tw-text-opacity:1;color:rgb(141 162 251/var(--tw-text-opacity))}.text-indigo-700{--tw-text-opacity:1;color:rgb(81 69 205/var(--tw-text-opacity))}.text-indigo-800{--tw-text-opacity:1;color:rgb(66 56 157/var(--tw-text-opacity))}.text-orange-500{--tw-text-opacity:1;color:rgb(255 90 31/var(--tw-text-opacity))}.text-orange-800{--tw-text-opacity:1;color:rgb(138 44 13/var(--tw-text-opacity))}.text-pink-400{--tw-text-opacity:1;color:rgb(241 126 184/var(--tw-text-opacity))}.text-pink-800{--tw-text-opacity:1;color:rgb(153 21 75/var(--tw-text-opacity))}.text-purple-400{--tw-text-opacity:1;color:rgb(172 148 250/var(--tw-text-opacity))}.text-purple-600{--tw-text-opacity:1;color:rgb(126 58 242/var(--tw-text-opacity))}.text-purple-700{--tw-text-opacity:1;color:rgb(108 43 217/var(--tw-text-opacity))}.text-purple-800{--tw-text-opacity:1;color:rgb(85 33 181/var(--tw-text-opacity))}.text-red-400{--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(240 82 82/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(224 36 36/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(200 30 30/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(155 28 28/var(--tw-text-opacity))}.text-red-900{--tw-text-opacity:1;color:rgb(119 29 29/var(--tw-text-opacity))}.text-sky-500{--tw-text-opacity:1;color:rgb(14 165 233/var(--tw-text-opacity))}.text-teal-600{--tw-text-opacity:1;color:rgb(4 116 129/var(--tw-text-opacity))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-300{--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity))}.text-yellow-400{--tw-text-opacity:1;color:rgb(227 160 8/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(194 120 3/var(--tw-text-opacity))}.text-yellow-700{--tw-text-opacity:1;color:rgb(142 75 16/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(114 59 19/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.decoration-blue-400{text-decoration-color:#76a9fa}.decoration-blue-500{text-decoration-color:#3f83f8}.decoration-gray-500{text-decoration-color:#6b7280}.decoration-green-500{text-decoration-color:#0e9f6e}.decoration-indigo-500{text-decoration-color:#6875f5}.decoration-red-500{text-decoration-color:#f05252}.decoration-sky-500{text-decoration-color:#0ea5e9}.decoration-solid{text-decoration-style:solid}.decoration-double{text-decoration-style:double}.decoration-dotted{text-decoration-style:dotted}.decoration-dashed{text-decoration-style:dashed}.decoration-wavy{text-decoration-style:wavy}.decoration-8{text-decoration-thickness:8px}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-green-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(4 108 78/var(--tw-placeholder-opacity))}.placeholder-green-700::placeholder{--tw-placeholder-opacity:1;color:rgb(4 108 78/var(--tw-placeholder-opacity))}.placeholder-red-700::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(200 30 30/var(--tw-placeholder-opacity))}.placeholder-red-700::placeholder{--tw-placeholder-opacity:1;color:rgb(200 30 30/var(--tw-placeholder-opacity))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.bg-blend-multiply{background-blend-mode:multiply}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-500\/50{--tw-shadow-color:rgba(63,131,248,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-cyan-500\/50{--tw-shadow-color:rgba(6,182,212,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-green-500\/50{--tw-shadow-color:rgba(14,159,110,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-lime-500\/50{--tw-shadow-color:rgba(132,204,22,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-pink-500\/50{--tw-shadow-color:rgba(231,70,148,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-purple-500\/50{--tw-shadow-color:rgba(144,97,249,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-red-500\/50{--tw-shadow-color:rgba(240,82,82,.5);--tw-shadow:var(--tw-shadow-colored)}.shadow-teal-500\/50{--tw-shadow-color:rgba(6,148,162,.5);--tw-shadow:var(--tw-shadow-colored)}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.ring-opacity-0{--tw-ring-opacity:0}.blur{--tw-blur:blur(8px)}.blur,.blur-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-sm{--tw-blur:blur(4px)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-700{transition-duration:.7s}.duration-75{transition-duration:75ms}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{transition-timing-function:linear}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.first-letter\:float-left:first-letter{float:left}.first-letter\:mr-3:first-letter{margin-right:.75rem}.first-letter\:text-7xl:first-letter{font-size:4.5rem;line-height:1}.first-letter\:font-bold:first-letter{font-weight:700}.first-letter\:text-gray-900:first-letter{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.first-line\:uppercase:first-line{text-transform:uppercase}.first-line\:tracking-widest:first-line{letter-spacing:.1em}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:left-\[4px\]:after{content:var(--tw-content);left:4px}.after\:top-0:after{content:var(--tw-content);top:0}.after\:top-0\.5:after{content:var(--tw-content);top:.125rem}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:mx-2:after{content:var(--tw-content);margin-left:.5rem;margin-right:.5rem}.after\:mx-6:after{content:var(--tw-content);margin-left:1.5rem;margin-right:1.5rem}.after\:inline-block:after{content:var(--tw-content);display:inline-block}.after\:hidden:after{content:var(--tw-content);display:none}.after\:h-1:after{content:var(--tw-content);height:.25rem}.after\:h-4:after{content:var(--tw-content);height:1rem}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:h-6:after{content:var(--tw-content);height:1.5rem}.after\:w-4:after{content:var(--tw-content);width:1rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:w-6:after{content:var(--tw-content);width:1.5rem}.after\:w-full:after{content:var(--tw-content);width:100%}.after\:rounded-full:after{border-radius:9999px;content:var(--tw-content)}.after\:border:after{border-width:1px;content:var(--tw-content)}.after\:border-4:after{border-width:4px;content:var(--tw-content)}.after\:border-b:after{border-bottom-width:1px;content:var(--tw-content)}.after\:border-blue-100:after{--tw-border-opacity:1;border-color:rgb(225 239 254/var(--tw-border-opacity));content:var(--tw-content)}.after\:border-gray-100:after{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity));content:var(--tw-content)}.after\:border-gray-200:after{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity));content:var(--tw-content)}.after\:border-gray-300:after{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity));content:var(--tw-content)}.after\:bg-white:after{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity));content:var(--tw-content)}.after\:text-gray-200:after{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity));content:var(--tw-content)}.after\:transition-all:after{content:var(--tw-content);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.after\:content-\[\'\/\'\]:after{--tw-content:"/";content:var(--tw-content)}.hover\:border-gray-200:hover{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.hover\:bg-\[\#050708\]\/80:hover{background-color:rgba(5,7,8,.8)}.hover\:bg-\[\#050708\]\/90:hover{background-color:rgba(5,7,8,.9)}.hover\:bg-\[\#1da1f2\]\/90:hover{background-color:rgba(29,161,242,.9)}.hover\:bg-\[\#24292F\]\/90:hover{background-color:rgba(36,41,47,.9)}.hover\:bg-\[\#2557D6\]\/90:hover{background-color:rgba(37,87,214,.9)}.hover\:bg-\[\#3b5998\]\/90:hover{background-color:rgba(59,89,152,.9)}.hover\:bg-\[\#4285F4\]\/90:hover{background-color:rgba(66,133,244,.9)}.hover\:bg-\[\#F7BE38\]\/90:hover{background-color:rgba(247,190,56,.9)}.hover\:bg-\[\#FF9119\]\/80:hover{background-color:rgba(255,145,25,.8)}.hover\:bg-blue-100:hover{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(195 221 253/var(--tw-bg-opacity))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity))}.hover\:bg-blue-900:hover{--tw-bg-opacity:1;background-color:rgb(35 56 118/var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:bg-gray-900:hover{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(188 240 218/var(--tw-bg-opacity))}.hover\:bg-green-800:hover{--tw-bg-opacity:1;background-color:rgb(3 84 63/var(--tw-bg-opacity))}.hover\:bg-green-900:hover{--tw-bg-opacity:1;background-color:rgb(1 71 55/var(--tw-bg-opacity))}.hover\:bg-indigo-200:hover{--tw-bg-opacity:1;background-color:rgb(205 219 254/var(--tw-bg-opacity))}.hover\:bg-pink-200:hover{--tw-bg-opacity:1;background-color:rgb(250 209 232/var(--tw-bg-opacity))}.hover\:bg-purple-200:hover{--tw-bg-opacity:1;background-color:rgb(220 215 254/var(--tw-bg-opacity))}.hover\:bg-purple-800:hover{--tw-bg-opacity:1;background-color:rgb(85 33 181/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(251 213 213/var(--tw-bg-opacity))}.hover\:bg-red-800:hover{--tw-bg-opacity:1;background-color:rgb(155 28 28/var(--tw-bg-opacity))}.hover\:bg-red-900:hover{--tw-bg-opacity:1;background-color:rgb(119 29 29/var(--tw-bg-opacity))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(252 233 106/var(--tw-bg-opacity))}.hover\:bg-yellow-500:hover{--tw-bg-opacity:1;background-color:rgb(194 120 3/var(--tw-bg-opacity))}.hover\:bg-yellow-900:hover{--tw-bg-opacity:1;background-color:rgb(99 49 18/var(--tw-bg-opacity))}.hover\:bg-gradient-to-bl:hover{background-image:linear-gradient(to bottom left,var(--tw-gradient-stops))}.hover\:bg-gradient-to-br:hover{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.hover\:bg-gradient-to-l:hover{background-image:linear-gradient(to left,var(--tw-gradient-stops))}.hover\:from-teal-200:hover{--tw-gradient-from:#afecef var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(175,236,239,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.hover\:to-lime-200:hover{--tw-gradient-to:#d9f99d var(--tw-gradient-to-position);--tw-gradient-to-position: }.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.hover\:text-blue-800:hover{--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity))}.hover\:text-blue-900:hover{--tw-text-opacity:1;color:rgb(35 56 118/var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:text-green-900:hover{--tw-text-opacity:1;color:rgb(1 71 55/var(--tw-text-opacity))}.hover\:text-indigo-900:hover{--tw-text-opacity:1;color:rgb(54 47 120/var(--tw-text-opacity))}.hover\:text-pink-900:hover{--tw-text-opacity:1;color:rgb(117 26 61/var(--tw-text-opacity))}.hover\:text-purple-900:hover{--tw-text-opacity:1;color:rgb(74 29 150/var(--tw-text-opacity))}.hover\:text-red-900:hover{--tw-text-opacity:1;color:rgb(119 29 29/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:text-yellow-900:hover{--tw-text-opacity:1;color:rgb(99 49 18/var(--tw-text-opacity))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:bg-blend-soft-light:hover{background-blend-mode:soft-light}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:blur-none:hover{--tw-blur:blur(0)}.hover\:blur-none:hover,.hover\:grayscale-0:hover{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:grayscale-0:hover{--tw-grayscale:grayscale(0)}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity))}.focus\:border-blue-600:focus{--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity))}.focus\:border-gray-200:focus{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.focus\:border-green-500:focus{--tw-border-opacity:1;border-color:rgb(14 159 110/var(--tw-border-opacity))}.focus\:border-green-600:focus{--tw-border-opacity:1;border-color:rgb(5 122 85/var(--tw-border-opacity))}.focus\:border-red-500:focus{--tw-border-opacity:1;border-color:rgb(240 82 82/var(--tw-border-opacity))}.focus\:border-red-600:focus{--tw-border-opacity:1;border-color:rgb(224 36 36/var(--tw-border-opacity))}.focus\:bg-gray-100:focus{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.focus\:bg-gray-900:focus{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.focus\:text-blue-700:focus{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.focus\:text-white:focus{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-\[\#050708\]\/50:focus{--tw-ring-color:rgba(5,7,8,.5)}.focus\:ring-\[\#1da1f2\]\/50:focus{--tw-ring-color:rgba(29,161,242,.5)}.focus\:ring-\[\#24292F\]\/50:focus{--tw-ring-color:rgba(36,41,47,.5)}.focus\:ring-\[\#2557D6\]\/50:focus{--tw-ring-color:rgba(37,87,214,.5)}.focus\:ring-\[\#3b5998\]\/50:focus{--tw-ring-color:rgba(59,89,152,.5)}.focus\:ring-\[\#4285F4\]\/50:focus{--tw-ring-color:rgba(66,133,244,.5)}.focus\:ring-\[\#F7BE38\]\/50:focus{--tw-ring-color:rgba(247,190,56,.5)}.focus\:ring-\[\#FF9119\]\/50:focus{--tw-ring-color:rgba(255,145,25,.5)}.focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity))}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity))}.focus\:ring-blue-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(118 169 250/var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity))}.focus\:ring-blue-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(28 100 242/var(--tw-ring-opacity))}.focus\:ring-blue-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(26 86 219/var(--tw-ring-opacity))}.focus\:ring-cyan-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(165 243 252/var(--tw-ring-opacity))}.focus\:ring-cyan-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(103 232 249/var(--tw-ring-opacity))}.focus\:ring-gray-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(243 244 246/var(--tw-ring-opacity))}.focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity))}.focus\:ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.focus\:ring-gray-50:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(249 250 251/var(--tw-ring-opacity))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.focus\:ring-gray-700:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}.focus\:ring-green-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity))}.focus\:ring-green-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(132 225 188/var(--tw-ring-opacity))}.focus\:ring-green-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(49 196 141/var(--tw-ring-opacity))}.focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 159 110/var(--tw-ring-opacity))}.focus\:ring-lime-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(217 249 157/var(--tw-ring-opacity))}.focus\:ring-lime-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(190 242 100/var(--tw-ring-opacity))}.focus\:ring-orange-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 90 31/var(--tw-ring-opacity))}.focus\:ring-pink-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(250 209 232/var(--tw-ring-opacity))}.focus\:ring-pink-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(248 180 217/var(--tw-ring-opacity))}.focus\:ring-purple-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(220 215 254/var(--tw-ring-opacity))}.focus\:ring-purple-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(202 191 253/var(--tw-ring-opacity))}.focus\:ring-purple-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(144 97 249/var(--tw-ring-opacity))}.focus\:ring-red-100:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(253 232 232/var(--tw-ring-opacity))}.focus\:ring-red-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(248 180 180/var(--tw-ring-opacity))}.focus\:ring-red-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(249 128 128/var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(240 82 82/var(--tw-ring-opacity))}.focus\:ring-teal-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(126 220 226/var(--tw-ring-opacity))}.focus\:ring-teal-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(6 148 162/var(--tw-ring-opacity))}.focus\:ring-yellow-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(250 202 21/var(--tw-ring-opacity))}.focus\:ring-yellow-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(227 160 8/var(--tw-ring-opacity))}.focus\:ring-yellow-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(194 120 3/var(--tw-ring-opacity))}.group:hover .group-hover\:rotate-45{--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:bg-white\/50{background-color:hsla(0,0%,100%,.5)}.group:hover .group-hover\:bg-opacity-0{--tw-bg-opacity:0}.group:hover .group-hover\:from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(6,182,212,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-green-400{--tw-gradient-from:#31c48d var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(49,196,141,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-pink-500{--tw-gradient-from:#e74694 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(231,70,148,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-purple-500{--tw-gradient-from:#9061f9 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(144,97,249,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-purple-600{--tw-gradient-from:#7e3af2 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(126,58,242,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-red-200{--tw-gradient-from:#fbd5d5 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:hsla(0,83%,91%,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:from-teal-300{--tw-gradient-from:#7edce2 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(126,220,226,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.group:hover .group-hover\:via-red-300{--tw-gradient-via-position: ;--tw-gradient-to:hsla(0,83%,84%,0) var(--tw-gradient-to-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),#f8b4b4 var(--tw-gradient-via-position),var(--tw-gradient-to)}.group:hover .group-hover\:to-blue-500{--tw-gradient-to:#3f83f8 var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:to-blue-600{--tw-gradient-to:#1c64f2 var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:to-lime-300{--tw-gradient-to:#bef264 var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:to-orange-400{--tw-gradient-to:#ff8a4c var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:to-pink-500{--tw-gradient-to:#e74694 var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:to-yellow-200{--tw-gradient-to:#fce96a var(--tw-gradient-to-position);--tw-gradient-to-position: }.group:hover .group-hover\:text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.group:hover .group-hover\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.group:hover .group-hover\:opacity-100{opacity:1}.group:focus .group-focus\:text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.group:focus .group-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.group:focus .group-focus\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:focus .group-focus\:ring-white{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.peer:checked~.peer-checked\:border-blue-600{--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity))}.peer:checked~.peer-checked\:bg-blue-600{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-green-600{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-orange-500{--tw-bg-opacity:1;background-color:rgb(255 90 31/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-purple-600{--tw-bg-opacity:1;background-color:rgb(126 58 242/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-red-600{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-teal-600{--tw-bg-opacity:1;background-color:rgb(4 116 129/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(227 160 8/var(--tw-bg-opacity))}.peer:checked~.peer-checked\:text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.peer:checked~.peer-checked\:text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.peer:checked~.peer-checked\:after\:translate-x-full:after{--tw-translate-x:100%;content:var(--tw-content);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:after\:border-white:after{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity));content:var(--tw-content)}.peer:-moz-placeholder-shown~.peer-placeholder-shown\:top-1\/2{top:50%}.peer:placeholder-shown~.peer-placeholder-shown\:top-1\/2{top:50%}.peer:-moz-placeholder-shown~.peer-placeholder-shown\:-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:placeholder-shown~.peer-placeholder-shown\:-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:-moz-placeholder-shown~.peer-placeholder-shown\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:placeholder-shown~.peer-placeholder-shown\:translate-y-0{--tw-translate-y:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:-moz-placeholder-shown~.peer-placeholder-shown\:scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:placeholder-shown~.peer-placeholder-shown\:scale-100{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:left-0{left:0}.peer:focus~.peer-focus\:top-1{top:.25rem}.peer:focus~.peer-focus\:top-2{top:.5rem}.peer:focus~.peer-focus\:-translate-y-3{--tw-translate-y:-0.75rem}.peer:focus~.peer-focus\:-translate-y-3,.peer:focus~.peer-focus\:-translate-y-4{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:-translate-y-4{--tw-translate-y:-1rem}.peer:focus~.peer-focus\:-translate-y-6{--tw-translate-y:-1.5rem}.peer:focus~.peer-focus\:-translate-y-6,.peer:focus~.peer-focus\:scale-75{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.peer:focus~.peer-focus\:px-2{padding-left:.5rem;padding-right:.5rem}.peer:focus~.peer-focus\:font-medium{font-weight:500}.peer:focus~.peer-focus\:text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\:ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.peer:focus~.peer-focus\:ring-blue-300{--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-green-300{--tw-ring-opacity:1;--tw-ring-color:rgb(132 225 188/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-orange-300{--tw-ring-opacity:1;--tw-ring-color:rgb(253 186 140/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-purple-300{--tw-ring-opacity:1;--tw-ring-color:rgb(202 191 253/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-red-300{--tw-ring-opacity:1;--tw-ring-color:rgb(248 180 180/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-teal-300{--tw-ring-opacity:1;--tw-ring-color:rgb(126 220 226/var(--tw-ring-opacity))}.peer:focus~.peer-focus\:ring-yellow-300{--tw-ring-opacity:1;--tw-ring-color:rgb(250 202 21/var(--tw-ring-opacity))}:is(.dark .dark\:block){display:block}:is(.dark .dark\:inline-block){display:inline-block}:is(.dark .dark\:hidden){display:none}:is(.dark .dark\:divide-gray-600)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(75 85 99/var(--tw-divide-opacity))}:is(.dark .dark\:divide-gray-700)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}:is(.dark .dark\:\!border-blue-500){--tw-border-opacity:1!important;border-color:rgb(63 131 248/var(--tw-border-opacity))!important}:is(.dark .dark\:border-blue-400){--tw-border-opacity:1;border-color:rgb(118 169 250/var(--tw-border-opacity))}:is(.dark .dark\:border-blue-500){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity))}:is(.dark .dark\:border-blue-600){--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity))}:is(.dark .dark\:border-blue-800){--tw-border-opacity:1;border-color:rgb(30 66 159/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-400){--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-500){--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-600){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-700){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-800){--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity))}:is(.dark .dark\:border-gray-900){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity))}:is(.dark .dark\:border-green-400){--tw-border-opacity:1;border-color:rgb(49 196 141/var(--tw-border-opacity))}:is(.dark .dark\:border-green-500){--tw-border-opacity:1;border-color:rgb(14 159 110/var(--tw-border-opacity))}:is(.dark .dark\:border-green-600){--tw-border-opacity:1;border-color:rgb(5 122 85/var(--tw-border-opacity))}:is(.dark .dark\:border-green-800){--tw-border-opacity:1;border-color:rgb(3 84 63/var(--tw-border-opacity))}:is(.dark .dark\:border-purple-400){--tw-border-opacity:1;border-color:rgb(172 148 250/var(--tw-border-opacity))}:is(.dark .dark\:border-red-400){--tw-border-opacity:1;border-color:rgb(249 128 128/var(--tw-border-opacity))}:is(.dark .dark\:border-red-500){--tw-border-opacity:1;border-color:rgb(240 82 82/var(--tw-border-opacity))}:is(.dark .dark\:border-red-600){--tw-border-opacity:1;border-color:rgb(224 36 36/var(--tw-border-opacity))}:is(.dark .dark\:border-red-800){--tw-border-opacity:1;border-color:rgb(155 28 28/var(--tw-border-opacity))}:is(.dark .dark\:border-transparent){border-color:transparent}:is(.dark .dark\:border-white){--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}:is(.dark .dark\:border-yellow-300){--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity))}:is(.dark .dark\:border-yellow-800){--tw-border-opacity:1;border-color:rgb(114 59 19/var(--tw-border-opacity))}:is(.dark .dark\:border-l-gray-700){--tw-border-opacity:1;border-left-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:bg-blue-200){--tw-bg-opacity:1;background-color:rgb(195 221 253/var(--tw-bg-opacity))}:is(.dark .dark\:bg-blue-400){--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity))}:is(.dark .dark\:bg-blue-500){--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity))}:is(.dark .dark\:bg-blue-600){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity))}:is(.dark .dark\:bg-blue-800){--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity))}:is(.dark .dark\:bg-blue-900){--tw-bg-opacity:1;background-color:rgb(35 56 118/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-300){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-400){--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-500){--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-600){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-700){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-800){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-800\/30){background-color:rgba(31,41,55,.3)}:is(.dark .dark\:bg-gray-800\/50){background-color:rgba(31,41,55,.5)}:is(.dark .dark\:bg-gray-900){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .dark\:bg-gray-900\/60){background-color:rgba(17,24,39,.6)}:is(.dark .dark\:bg-green-100){--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity))}:is(.dark .dark\:bg-green-500){--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity))}:is(.dark .dark\:bg-green-600){--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity))}:is(.dark .dark\:bg-green-800){--tw-bg-opacity:1;background-color:rgb(3 84 63/var(--tw-bg-opacity))}:is(.dark .dark\:bg-green-900){--tw-bg-opacity:1;background-color:rgb(1 71 55/var(--tw-bg-opacity))}:is(.dark .dark\:bg-indigo-500){--tw-bg-opacity:1;background-color:rgb(104 117 245/var(--tw-bg-opacity))}:is(.dark .dark\:bg-indigo-900){--tw-bg-opacity:1;background-color:rgb(54 47 120/var(--tw-bg-opacity))}:is(.dark .dark\:bg-orange-200){--tw-bg-opacity:1;background-color:rgb(252 217 189/var(--tw-bg-opacity))}:is(.dark .dark\:bg-orange-400){--tw-bg-opacity:1;background-color:rgb(255 138 76/var(--tw-bg-opacity))}:is(.dark .dark\:bg-orange-700){--tw-bg-opacity:1;background-color:rgb(180 52 3/var(--tw-bg-opacity))}:is(.dark .dark\:bg-pink-900){--tw-bg-opacity:1;background-color:rgb(117 26 61/var(--tw-bg-opacity))}:is(.dark .dark\:bg-purple-500){--tw-bg-opacity:1;background-color:rgb(144 97 249/var(--tw-bg-opacity))}:is(.dark .dark\:bg-purple-600){--tw-bg-opacity:1;background-color:rgb(126 58 242/var(--tw-bg-opacity))}:is(.dark .dark\:bg-purple-900){--tw-bg-opacity:1;background-color:rgb(74 29 150/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-100){--tw-bg-opacity:1;background-color:rgb(253 232 232/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-500){--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-600){--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-800){--tw-bg-opacity:1;background-color:rgb(155 28 28/var(--tw-bg-opacity))}:is(.dark .dark\:bg-red-900){--tw-bg-opacity:1;background-color:rgb(119 29 29/var(--tw-bg-opacity))}:is(.dark .dark\:bg-white){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}:is(.dark .dark\:bg-yellow-300){--tw-bg-opacity:1;background-color:rgb(250 202 21/var(--tw-bg-opacity))}:is(.dark .dark\:bg-yellow-900){--tw-bg-opacity:1;background-color:rgb(99 49 18/var(--tw-bg-opacity))}:is(.dark .dark\:bg-opacity-80){--tw-bg-opacity:0.8}:is(.dark .dark\:bg-\[url\(\'https\:\/\/flowbite\.s3\.amazonaws\.com\/docs\/jumbotron\/hero-pattern-dark\.svg\'\)\]){background-image:url(https://flowbite.s3.amazonaws.com/docs/jumbotron/hero-pattern-dark.svg)}:is(.dark .dark\:from-blue-900){--tw-gradient-from:#233876 var(--tw-gradient-from-position);--tw-gradient-from-position: ;--tw-gradient-to:rgba(35,56,118,0) var(--tw-gradient-from-position);--tw-gradient-to-position: ;--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(.dark .dark\:fill-gray-300){fill:#d1d5db}:is(.dark .dark\:\!text-blue-500){--tw-text-opacity:1!important;color:rgb(63 131 248/var(--tw-text-opacity))!important}:is(.dark .dark\:text-blue-100){--tw-text-opacity:1;color:rgb(225 239 254/var(--tw-text-opacity))}:is(.dark .dark\:text-blue-200){--tw-text-opacity:1;color:rgb(195 221 253/var(--tw-text-opacity))}:is(.dark .dark\:text-blue-300){--tw-text-opacity:1;color:rgb(164 202 254/var(--tw-text-opacity))}:is(.dark .dark\:text-blue-400){--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity))}:is(.dark .dark\:text-blue-500){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .dark\:text-blue-500\/100){color:#3f83f8}:is(.dark .dark\:text-blue-500\/25){color:rgba(63,131,248,.25)}:is(.dark .dark\:text-blue-500\/50){color:rgba(63,131,248,.5)}:is(.dark .dark\:text-blue-500\/75){color:rgba(63,131,248,.75)}:is(.dark .dark\:text-blue-800){--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-100){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-200){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-400){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-500){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-600){--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-700){--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-800){--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:is(.dark .dark\:text-gray-900){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:text-green-200){--tw-text-opacity:1;color:rgb(188 240 218/var(--tw-text-opacity))}:is(.dark .dark\:text-green-300){--tw-text-opacity:1;color:rgb(132 225 188/var(--tw-text-opacity))}:is(.dark .dark\:text-green-400){--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity))}:is(.dark .dark\:text-green-500){--tw-text-opacity:1;color:rgb(14 159 110/var(--tw-text-opacity))}:is(.dark .dark\:text-green-600){--tw-text-opacity:1;color:rgb(5 122 85/var(--tw-text-opacity))}:is(.dark .dark\:text-indigo-300){--tw-text-opacity:1;color:rgb(180 198 252/var(--tw-text-opacity))}:is(.dark .dark\:text-indigo-400){--tw-text-opacity:1;color:rgb(141 162 251/var(--tw-text-opacity))}:is(.dark .dark\:text-indigo-500){--tw-text-opacity:1;color:rgb(104 117 245/var(--tw-text-opacity))}:is(.dark .dark\:text-orange-200){--tw-text-opacity:1;color:rgb(252 217 189/var(--tw-text-opacity))}:is(.dark .dark\:text-orange-900){--tw-text-opacity:1;color:rgb(119 29 29/var(--tw-text-opacity))}:is(.dark .dark\:text-pink-300){--tw-text-opacity:1;color:rgb(248 180 217/var(--tw-text-opacity))}:is(.dark .dark\:text-pink-400){--tw-text-opacity:1;color:rgb(241 126 184/var(--tw-text-opacity))}:is(.dark .dark\:text-purple-300){--tw-text-opacity:1;color:rgb(202 191 253/var(--tw-text-opacity))}:is(.dark .dark\:text-purple-400){--tw-text-opacity:1;color:rgb(172 148 250/var(--tw-text-opacity))}:is(.dark .dark\:text-purple-500){--tw-text-opacity:1;color:rgb(144 97 249/var(--tw-text-opacity))}:is(.dark .dark\:text-red-200){--tw-text-opacity:1;color:rgb(251 213 213/var(--tw-text-opacity))}:is(.dark .dark\:text-red-300){--tw-text-opacity:1;color:rgb(248 180 180/var(--tw-text-opacity))}:is(.dark .dark\:text-red-400){--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity))}:is(.dark .dark\:text-red-500){--tw-text-opacity:1;color:rgb(240 82 82/var(--tw-text-opacity))}:is(.dark .dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .dark\:text-yellow-300){--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity))}:is(.dark .dark\:text-yellow-500){--tw-text-opacity:1;color:rgb(194 120 3/var(--tw-text-opacity))}:is(.dark .dark\:decoration-blue-600){text-decoration-color:#1c64f2}:is(.dark .dark\:placeholder-gray-400)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-gray-400)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-green-500)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(14 159 110/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-green-500)::placeholder{--tw-placeholder-opacity:1;color:rgb(14 159 110/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-red-500)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(240 82 82/var(--tw-placeholder-opacity))}:is(.dark .dark\:placeholder-red-500)::placeholder{--tw-placeholder-opacity:1;color:rgb(240 82 82/var(--tw-placeholder-opacity))}:is(.dark .dark\:shadow-lg){--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-sm-light){--tw-shadow:0 2px 5px 0px hsla(0,0%,100%,.08);--tw-shadow-colored:0 2px 5px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(.dark .dark\:shadow-blue-800\/80){--tw-shadow-color:rgba(30,66,159,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-cyan-800\/80){--tw-shadow-color:rgba(21,94,117,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-gray-800){--tw-shadow-color:#1f2937;--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-green-800\/80){--tw-shadow-color:rgba(3,84,63,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-lime-800\/80){--tw-shadow-color:rgba(63,98,18,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-pink-800\/80){--tw-shadow-color:rgba(153,21,75,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-purple-800\/80){--tw-shadow-color:rgba(85,33,181,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-red-800\/80){--tw-shadow-color:rgba(155,28,28,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:shadow-teal-800\/80){--tw-shadow-color:rgba(5,80,92,.8);--tw-shadow:var(--tw-shadow-colored)}:is(.dark .dark\:ring-gray-500){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}:is(.dark .dark\:ring-gray-900){--tw-ring-opacity:1;--tw-ring-color:rgb(17 24 39/var(--tw-ring-opacity))}:is(.dark .dark\:ring-offset-gray-700){--tw-ring-offset-color:#374151}:is(.dark .dark\:ring-offset-gray-800){--tw-ring-offset-color:#1f2937}:is(.dark .dark\:first-letter\:text-gray-100):first-letter{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}:is(.dark .dark\:after\:border-blue-800):after{--tw-border-opacity:1;border-color:rgb(30 66 159/var(--tw-border-opacity));content:var(--tw-content)}:is(.dark .dark\:after\:border-gray-700):after{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity));content:var(--tw-content)}:is(.dark .dark\:after\:text-gray-500):after{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity));content:var(--tw-content)}:is(.dark .dark\:hover\:border-gray-500:hover){--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-gray-600:hover){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}:is(.dark .dark\:hover\:border-gray-700:hover){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}:is(.dark .dark\:hover\:bg-\[\#050708\]\/30:hover){background-color:rgba(5,7,8,.3)}:is(.dark .dark\:hover\:bg-\[\#050708\]\/40:hover){background-color:rgba(5,7,8,.4)}:is(.dark .dark\:hover\:bg-\[\#FF9119\]\/80:hover){background-color:rgba(255,145,25,.8)}:is(.dark .dark\:hover\:bg-blue-500:hover){--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-blue-600:hover){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-blue-700:hover){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-blue-800:hover){--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-200:hover){--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-500:hover){--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-600:hover){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-700:hover){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-gray-800:hover){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-green-600:hover){--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-green-700:hover){--tw-bg-opacity:1;background-color:rgb(4 108 78/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-green-800:hover){--tw-bg-opacity:1;background-color:rgb(3 84 63/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-indigo-800:hover){--tw-bg-opacity:1;background-color:rgb(66 56 157/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-pink-800:hover){--tw-bg-opacity:1;background-color:rgb(153 21 75/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-purple-500:hover){--tw-bg-opacity:1;background-color:rgb(144 97 249/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-purple-700:hover){--tw-bg-opacity:1;background-color:rgb(108 43 217/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-purple-800:hover){--tw-bg-opacity:1;background-color:rgb(85 33 181/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-red-600:hover){--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-red-700:hover){--tw-bg-opacity:1;background-color:rgb(200 30 30/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-red-800:hover){--tw-bg-opacity:1;background-color:rgb(155 28 28/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-yellow-300:hover){--tw-bg-opacity:1;background-color:rgb(250 202 21/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-yellow-400:hover){--tw-bg-opacity:1;background-color:rgb(227 160 8/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:bg-yellow-800:hover){--tw-bg-opacity:1;background-color:rgb(114 59 19/var(--tw-bg-opacity))}:is(.dark .dark\:hover\:text-blue-300:hover){--tw-text-opacity:1;color:rgb(164 202 254/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-blue-400:hover){--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-blue-500:hover){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-blue-600:hover){--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-blue-700:hover){--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-300:hover){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-400:hover){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-800:hover){--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-gray-900:hover){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-green-300:hover){--tw-text-opacity:1;color:rgb(132 225 188/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-indigo-300:hover){--tw-text-opacity:1;color:rgb(180 198 252/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-pink-300:hover){--tw-text-opacity:1;color:rgb(248 180 217/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-purple-300:hover){--tw-text-opacity:1;color:rgb(202 191 253/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-red-300:hover){--tw-text-opacity:1;color:rgb(248 180 180/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-white:hover){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .dark\:hover\:text-yellow-300:hover){--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity))}:is(.dark .dark\:hover\:bg-blend-darken:hover){background-blend-mode:darken}:is(.dark .dark\:focus\:border-blue-500:focus){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity))}:is(.dark .dark\:focus\:border-green-500:focus){--tw-border-opacity:1;border-color:rgb(14 159 110/var(--tw-border-opacity))}:is(.dark .dark\:focus\:border-red-500:focus){--tw-border-opacity:1;border-color:rgb(240 82 82/var(--tw-border-opacity))}:is(.dark .dark\:focus\:bg-blue-600:focus){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity))}:is(.dark .dark\:focus\:bg-gray-700:focus){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}:is(.dark .dark\:focus\:text-white:focus){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .dark\:focus\:ring-\[\#050708\]\/50:focus){--tw-ring-color:rgba(5,7,8,.5)}:is(.dark .dark\:focus\:ring-\[\#2557D6\]\/50:focus){--tw-ring-color:rgba(37,87,214,.5)}:is(.dark .dark\:focus\:ring-\[\#F7BE38\]\/50:focus){--tw-ring-color:rgba(247,190,56,.5)}:is(.dark .dark\:focus\:ring-\[\#FF9119\]\/40:focus){--tw-ring-color:rgba(255,145,25,.4)}:is(.dark .dark\:focus\:ring-blue-500:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-blue-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(28 100 242/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-blue-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-blue-900:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(35 56 118/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-cyan-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(21 94 117/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-gray-400:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-gray-500:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-gray-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(75 85 99/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-gray-700:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(55 65 81/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-gray-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(31 41 55/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-green-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(5 122 85/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-green-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 84 63/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-lime-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(63 98 18/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-orange-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(208 56 1/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-pink-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(153 21 75/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-purple-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(126 58 242/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-purple-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(85 33 181/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-purple-900:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(74 29 150/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-red-400:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(249 128 128/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-red-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(224 36 36/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-red-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(155 28 28/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-red-900:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(119 29 29/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-teal-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(4 116 129/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-teal-700:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(3 102 114/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-teal-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(5 80 92/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-yellow-600:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(159 88 10/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-yellow-800:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(114 59 19/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-yellow-900:focus){--tw-ring-opacity:1;--tw-ring-color:rgb(99 49 18/var(--tw-ring-opacity))}:is(.dark .dark\:focus\:ring-offset-gray-700:focus){--tw-ring-offset-color:#374151}:is(.dark .dark\:focus\:ring-offset-gray-800:focus){--tw-ring-offset-color:#1f2937}:is(.dark .group:hover .dark\:group-hover\:bg-gray-800\/60){background-color:rgba(31,41,55,.6)}:is(.dark .group:hover .dark\:group-hover\:text-blue-500){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}:is(.dark .group:hover .dark\:group-hover\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .group:focus .dark\:group-focus\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .group:focus .dark\:group-focus\:ring-gray-800\/70){--tw-ring-color:rgba(31,41,55,.7)}:is(.dark .peer:checked~.dark\:peer-checked\:text-blue-500){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .peer:checked~.dark\:peer-checked\:text-gray-300){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.peer:focus~:is(.dark .peer-focus\:dark\:text-blue-500){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-blue-800){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-green-800){--tw-ring-opacity:1;--tw-ring-color:rgb(3 84 63/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-orange-800){--tw-ring-opacity:1;--tw-ring-color:rgb(138 44 13/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-purple-800){--tw-ring-opacity:1;--tw-ring-color:rgb(85 33 181/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-red-800){--tw-ring-opacity:1;--tw-ring-color:rgb(155 28 28/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-teal-800){--tw-ring-opacity:1;--tw-ring-color:rgb(5 80 92/var(--tw-ring-opacity))}:is(.dark .peer:focus~.dark\:peer-focus\:ring-yellow-800){--tw-ring-opacity:1;--tw-ring-color:rgb(114 59 19/var(--tw-ring-opacity))}@media (min-width:640px){.sm\:order-last{order:9999}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:mb-0{margin-bottom:0}.sm\:mb-4{margin-bottom:1rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:ml-2{margin-left:.5rem}.sm\:ml-4{margin-left:1rem}.sm\:ml-64{margin-left:16rem}.sm\:ml-auto{margin-left:auto}.sm\:mt-0{margin-top:0}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:h-10{height:2.5rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-64{height:16rem}.sm\:h-7{height:1.75rem}.sm\:h-9{height:2.25rem}.sm\:h-96{height:24rem}.sm\:w-10{width:2.5rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-96{width:24rem}.sm\:w-auto{width:auto}.sm\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-6{gap:1.5rem}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.sm\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.sm\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.sm\:rounded-lg{border-radius:.5rem}.sm\:border-b-0{border-bottom-width:0}.sm\:border-r{border-right-width:1px}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:px-16{padding-left:4rem;padding-right:4rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:py-16{padding-bottom:4rem;padding-top:4rem}.sm\:py-4{padding-top:1rem}.sm\:pb-4,.sm\:py-4{padding-bottom:1rem}.sm\:pl-2{padding-left:.5rem}.sm\:pl-4{padding-left:1rem}.sm\:pr-4{padding-right:1rem}.sm\:pr-8{padding-right:2rem}.sm\:pt-4{padding-top:1rem}.sm\:text-center{text-align:center}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}.sm\:text-xs{font-size:.75rem;line-height:1rem}.sm\:ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.sm\:after\:inline-block:after{content:var(--tw-content);display:inline-block}.sm\:after\:hidden:after{content:var(--tw-content);display:none}.sm\:after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}}@media (min-width:768px){.md\:relative{position:relative}.md\:inset-0{inset:0}.md\:right-auto{right:auto}.md\:top-auto{top:auto}.md\:order-1{order:1}.md\:order-2{order:2}.md\:m-0{margin:0}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:my-0{margin-bottom:0;margin-top:0}.md\:my-10{margin-bottom:2.5rem;margin-top:2.5rem}.md\:my-12{margin-bottom:3rem;margin-top:3rem}.md\:mb-0{margin-bottom:0}.md\:mb-12{margin-bottom:3rem}.md\:ml-1{margin-left:.25rem}.md\:ml-2{margin-left:.5rem}.md\:mr-0{margin-right:0}.md\:mr-2{margin-right:.5rem}.md\:mr-24{margin-right:6rem}.md\:mr-4{margin-right:1rem}.md\:mr-6{margin-right:1.5rem}.md\:mt-0{margin-top:0}.md\:mt-6{margin-top:1.5rem}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:h-96{height:24rem}.md\:h-auto{height:auto}.md\:w-48{width:12rem}.md\:w-64{width:16rem}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:max-w-screen-md{max-width:768px}.md\:max-w-xl{max-width:36rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-12{gap:3rem}.md\:gap-6{gap:1.5rem}.md\:gap-8{gap:2rem}.md\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.md\:space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.md\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.md\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.md\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.md\:rounded-none{border-radius:0}.md\:rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.md\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.md\:rounded-br-lg{border-bottom-right-radius:.5rem}.md\:rounded-tl-lg{border-top-left-radius:.5rem}.md\:border-0{border-width:0}.md\:border-b-0{border-bottom-width:0}.md\:border-r{border-right-width:1px}.md\:bg-transparent{background-color:transparent}.md\:bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.md\:p-0{padding:0}.md\:p-12{padding:3rem}.md\:p-6{padding:1.5rem}.md\:p-8{padding:2rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-2{padding-bottom:.5rem;padding-top:.5rem}.md\:py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.md\:py-8{padding-bottom:2rem;padding-top:2rem}.md\:pb-4{padding-bottom:1rem}.md\:pr-4{padding-right:1rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:font-medium{font-weight:500}.md\:text-blue-700{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.md\:text-green-700{--tw-text-opacity:1;color:rgb(4 108 78/var(--tw-text-opacity))}.md\:hover\:bg-transparent:hover{background-color:transparent}.md\:hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity))}.md\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.md\:hover\:text-green-700:hover{--tw-text-opacity:1;color:rgb(4 108 78/var(--tw-text-opacity))}:is(.dark .md\:dark\:bg-gray-900){--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}:is(.dark .md\:dark\:bg-transparent){background-color:transparent}:is(.dark .md\:dark\:text-blue-500){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .md\:dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(.dark .md\:dark\:hover\:bg-transparent:hover){background-color:transparent}:is(.dark .md\:dark\:hover\:text-blue-500:hover){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity))}:is(.dark .md\:dark\:hover\:text-white:hover){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}}@media (min-width:1024px){.lg\:static{position:static}.lg\:sticky{position:sticky}.lg\:top-28{top:7rem}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:my-12{margin-bottom:3rem;margin-top:3rem}.lg\:my-8{margin-bottom:2rem;margin-top:2rem}.lg\:mb-0{margin-bottom:0}.lg\:mb-16{margin-bottom:4rem}.lg\:mb-8{margin-bottom:2rem}.lg\:mr-0{margin-right:0}.lg\:mt-0{margin-top:0}.lg\:mt-10{margin-top:2.5rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:h-12{height:3rem}.lg\:h-6{height:1.5rem}.lg\:h-\[calc\(100vh-3rem\)\]{height:calc(100vh - 3rem)}.lg\:h-auto{height:auto}.lg\:max-h-full{max-height:100%}.lg\:w-12{width:3rem}.lg\:w-48{width:12rem}.lg\:w-6{width:1.5rem}.lg\:w-auto{width:auto}.lg\:max-w-7xl{max-width:80rem}.lg\:max-w-screen-lg{max-width:1024px}.lg\:max-w-xl{max-width:36rem}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:gap-16{gap:4rem}.lg\:gap-8{gap:2rem}.lg\:space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.lg\:self-center{align-self:center}.lg\:overflow-visible{overflow:visible}.lg\:overflow-y-visible{overflow-y:visible}.lg\:border-0{border-width:0}.lg\:bg-transparent{background-color:transparent}.lg\:p-0{padding:0}.lg\:p-8{padding:2rem}.lg\:px-12{padding-left:3rem;padding-right:3rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:px-36{padding-left:9rem;padding-right:9rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-48{padding-left:12rem;padding-right:12rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-0{padding-bottom:0;padding-top:0}.lg\:py-16{padding-bottom:4rem;padding-top:4rem}.lg\:py-2{padding-bottom:.5rem;padding-top:.5rem}.lg\:py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.lg\:py-4{padding-bottom:1rem;padding-top:1rem}.lg\:py-56{padding-bottom:14rem;padding-top:14rem}.lg\:py-8{padding-bottom:2rem;padding-top:2rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pl-0{padding-left:0}.lg\:pl-3{padding-left:.75rem}.lg\:pt-0{padding-top:0}.lg\:pt-2{padding-top:.5rem}.lg\:pt-8{padding-top:2rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}.lg\:text-sm{font-size:.875rem;line-height:1.25rem}.lg\:text-xl{font-size:1.25rem;line-height:1.75rem}.lg\:text-xs{font-size:.75rem;line-height:1rem}.lg\:text-blue-700{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}.lg\:hover\:bg-transparent:hover{background-color:transparent}.lg\:hover\:text-blue-700:hover{--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity))}:is(.dark .lg\:dark\:hover\:bg-transparent:hover){background-color:transparent}:is(.dark .lg\:dark\:hover\:text-white:hover){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}}@media (min-width:1280px){.xl\:ml-16{margin-left:4rem}.xl\:block{display:block}.xl\:inline-flex{display:inline-flex}.xl\:hidden{display:none}.xl\:h-80{height:20rem}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:gap-0{gap:0}.xl\:gap-16{gap:4rem}.xl\:gap-24{gap:6rem}.xl\:px-2{padding-left:.5rem;padding-right:.5rem}.xl\:px-48{padding-left:12rem;padding-right:12rem}.xl\:pb-24{padding-bottom:6rem}.xl\:pl-4{padding-left:1rem}.xl\:pt-24{padding-top:6rem}.xl\:text-6xl{font-size:3.75rem;line-height:1}.xl\:text-sm{font-size:.875rem;line-height:1.25rem}.xl\:after\:mx-10:after{content:var(--tw-content);margin-left:2.5rem;margin-right:2.5rem}}@media (min-width:1536px){.\32xl\:block{display:block}.\32xl\:h-96{height:24rem}.\32xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.\32xl\:gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.\32xl\:space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}} \ No newline at end of file diff --git a/resources/sitehome_model/assets/css/images.css b/resources/sitehome_model/assets/css/images.css new file mode 100644 index 0000000..8b4e4d7 --- /dev/null +++ b/resources/sitehome_model/assets/css/images.css @@ -0,0 +1,4 @@ +.blue-radial { +background-image: url('data:image/svg+xml,'); +background-position: center; background-repeat: no-repeat; background-size: cover; +} diff --git a/resources/sitehome_model/assets/css/main.css b/resources/sitehome_model/assets/css/main.css new file mode 100644 index 0000000..e69de29 diff --git a/resources/sitehome_model/assets/images/book.svg b/resources/sitehome_model/assets/images/book.svg new file mode 100644 index 0000000..8f234f2 --- /dev/null +++ b/resources/sitehome_model/assets/images/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/images/hero-pattern-dark.svg b/resources/sitehome_model/assets/images/hero-pattern-dark.svg new file mode 100644 index 0000000..884edc9 --- /dev/null +++ b/resources/sitehome_model/assets/images/hero-pattern-dark.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sitehome_model/assets/images/hero-pattern.svg b/resources/sitehome_model/assets/images/hero-pattern.svg new file mode 100644 index 0000000..a59b450 --- /dev/null +++ b/resources/sitehome_model/assets/images/hero-pattern.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/images/log.svg b/resources/sitehome_model/assets/images/log.svg new file mode 100644 index 0000000..052a711 --- /dev/null +++ b/resources/sitehome_model/assets/images/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/images/logo.svg b/resources/sitehome_model/assets/images/logo.svg new file mode 100644 index 0000000..8f234f2 --- /dev/null +++ b/resources/sitehome_model/assets/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/images/logo_dev.svg b/resources/sitehome_model/assets/images/logo_dev.svg new file mode 100644 index 0000000..8f234f2 --- /dev/null +++ b/resources/sitehome_model/assets/images/logo_dev.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/images/logo_new.svg b/resources/sitehome_model/assets/images/logo_new.svg new file mode 100644 index 0000000..8f234f2 --- /dev/null +++ b/resources/sitehome_model/assets/images/logo_new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/assets/index.html b/resources/sitehome_model/assets/index.html new file mode 100644 index 0000000..8c995ae --- /dev/null +++ b/resources/sitehome_model/assets/index.html @@ -0,0 +1 @@ +Hi from Assets index.html diff --git a/resources/sitehome_model/assets/js/flowbite.min.js b/resources/sitehome_model/assets/js/flowbite.min.js new file mode 100644 index 0000000..1151790 --- /dev/null +++ b/resources/sitehome_model/assets/js/flowbite.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Flowbite",[],e):"object"==typeof exports?exports.Flowbite=e():t.Flowbite=e()}(self,(function(){return function(){"use strict";var t={647:function(t,e,i){i.r(e)},853:function(t,e,i){i.r(e),i.d(e,{afterMain:function(){return E},afterRead:function(){return _},afterWrite:function(){return x},applyStyles:function(){return S},arrow:function(){return Z},auto:function(){return a},basePlacements:function(){return c},beforeMain:function(){return b},beforeRead:function(){return m},beforeWrite:function(){return L},bottom:function(){return o},clippingParents:function(){return u},computeStyles:function(){return it},createPopper:function(){return St},createPopperBase:function(){return Ct},createPopperLite:function(){return It},detectOverflow:function(){return yt},end:function(){return d},eventListeners:function(){return ot},flip:function(){return _t},hide:function(){return Et},left:function(){return s},main:function(){return w},modifierPhases:function(){return k},offset:function(){return Lt},placements:function(){return v},popper:function(){return f},popperGenerator:function(){return Pt},popperOffsets:function(){return Ot},preventOverflow:function(){return xt},read:function(){return y},reference:function(){return h},right:function(){return r},start:function(){return l},top:function(){return n},variationPlacements:function(){return g},viewport:function(){return p},write:function(){return O}});var n="top",o="bottom",r="right",s="left",a="auto",c=[n,o,r,s],l="start",d="end",u="clippingParents",p="viewport",f="popper",h="reference",g=c.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+d])}),[]),v=[].concat(c,[a]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+d])}),[]),m="beforeRead",y="read",_="afterRead",b="beforeMain",w="main",E="afterMain",L="beforeWrite",O="write",x="afterWrite",k=[m,y,_,b,w,E,L,O,x];function A(t){return t?(t.nodeName||"").toLowerCase():null}function T(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function j(t){return t instanceof T(t).Element||t instanceof Element}function P(t){return t instanceof T(t).HTMLElement||t instanceof HTMLElement}function C(t){return"undefined"!=typeof ShadowRoot&&(t instanceof T(t).ShadowRoot||t instanceof ShadowRoot)}var S={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},o=e.elements[t];P(o)&&A(o)&&(Object.assign(o.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?o.removeAttribute(t):o.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],o=e.attributes[t]||{},r=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});P(n)&&A(n)&&(Object.assign(n.style,r),Object.keys(o).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var D=Math.max,M=Math.min,q=Math.round;function H(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function B(){return!/^((?!chrome|android).)*safari/i.test(H())}function V(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),o=1,r=1;e&&P(t)&&(o=t.offsetWidth>0&&q(n.width)/t.offsetWidth||1,r=t.offsetHeight>0&&q(n.height)/t.offsetHeight||1);var s=(j(t)?T(t):window).visualViewport,a=!B()&&i,c=(n.left+(a&&s?s.offsetLeft:0))/o,l=(n.top+(a&&s?s.offsetTop:0))/r,d=n.width/o,u=n.height/r;return{width:d,height:u,top:l,right:c+d,bottom:l+u,left:c,x:c,y:l}}function W(t){var e=V(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function z(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&C(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function R(t){return T(t).getComputedStyle(t)}function F(t){return["table","td","th"].indexOf(A(t))>=0}function N(t){return((j(t)?t.ownerDocument:t.document)||window.document).documentElement}function K(t){return"html"===A(t)?t:t.assignedSlot||t.parentNode||(C(t)?t.host:null)||N(t)}function U(t){return P(t)&&"fixed"!==R(t).position?t.offsetParent:null}function X(t){for(var e=T(t),i=U(t);i&&F(i)&&"static"===R(i).position;)i=U(i);return i&&("html"===A(i)||"body"===A(i)&&"static"===R(i).position)?e:i||function(t){var e=/firefox/i.test(H());if(/Trident/i.test(H())&&P(t)&&"fixed"===R(t).position)return null;var i=K(t);for(C(i)&&(i=i.host);P(i)&&["html","body"].indexOf(A(i))<0;){var n=R(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Y(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function G(t,e,i){return D(t,M(e,i))}function J(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Q(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Z={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,l=t.options,d=i.elements.arrow,u=i.modifiersData.popperOffsets,p=I(i.placement),f=Y(p),h=[s,r].indexOf(p)>=0?"height":"width";if(d&&u){var g=function(t,e){return J("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Q(t,c))}(l.padding,i),v=W(d),m="y"===f?n:s,y="y"===f?o:r,_=i.rects.reference[h]+i.rects.reference[f]-u[f]-i.rects.popper[h],b=u[f]-i.rects.reference[f],w=X(d),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,L=_/2-b/2,O=g[m],x=E-v[h]-g[y],k=E/2-v[h]/2+L,A=G(O,k,x),T=f;i.modifiersData[a]=((e={})[T]=A,e.centerOffset=A-k,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&z(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function $(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,c=t.placement,l=t.variation,u=t.offsets,p=t.position,f=t.gpuAcceleration,h=t.adaptive,g=t.roundOffsets,v=t.isFixed,m=u.x,y=void 0===m?0:m,_=u.y,b=void 0===_?0:_,w="function"==typeof g?g({x:y,y:b}):{x:y,y:b};y=w.x,b=w.y;var E=u.hasOwnProperty("x"),L=u.hasOwnProperty("y"),O=s,x=n,k=window;if(h){var A=X(i),j="clientHeight",P="clientWidth";if(A===T(i)&&"static"!==R(A=N(i)).position&&"absolute"===p&&(j="scrollHeight",P="scrollWidth"),c===n||(c===s||c===r)&&l===d)x=o,b-=(v&&A===k&&k.visualViewport?k.visualViewport.height:A[j])-a.height,b*=f?1:-1;if(c===s||(c===n||c===o)&&l===d)O=r,y-=(v&&A===k&&k.visualViewport?k.visualViewport.width:A[P])-a.width,y*=f?1:-1}var C,S=Object.assign({position:p},h&&tt),I=!0===g?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:q(e*n)/n||0,y:q(i*n)/n||0}}({x:y,y:b}):{x:y,y:b};return y=I.x,b=I.y,f?Object.assign({},S,((C={})[x]=L?"0":"",C[O]=E?"0":"",C.transform=(k.devicePixelRatio||1)<=1?"translate("+y+"px, "+b+"px)":"translate3d("+y+"px, "+b+"px, 0)",C)):Object.assign({},S,((e={})[x]=L?b+"px":"",e[O]=E?y+"px":"",e.transform="",e))}var it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,o=void 0===n||n,r=i.adaptive,s=void 0===r||r,a=i.roundOffsets,c=void 0===a||a,l={placement:I(e.placement),variation:$(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},l,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:c})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},l,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},nt={passive:!0};var ot={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,o=n.scroll,r=void 0===o||o,s=n.resize,a=void 0===s||s,c=T(e.elements.popper),l=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&l.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&c.addEventListener("resize",i.update,nt),function(){r&&l.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&c.removeEventListener("resize",i.update,nt)}},data:{}},rt={left:"right",right:"left",bottom:"top",top:"bottom"};function st(t){return t.replace(/left|right|bottom|top/g,(function(t){return rt[t]}))}var at={start:"end",end:"start"};function ct(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function lt(t){var e=T(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function dt(t){return V(N(t)).left+lt(t).scrollLeft}function ut(t){var e=R(t),i=e.overflow,n=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+o+n)}function pt(t){return["html","body","#document"].indexOf(A(t))>=0?t.ownerDocument.body:P(t)&&ut(t)?t:pt(K(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=pt(t),o=n===(null==(i=t.ownerDocument)?void 0:i.body),r=T(n),s=o?[r].concat(r.visualViewport||[],ut(n)?n:[]):n,a=e.concat(s);return o?a:a.concat(ft(K(s)))}function ht(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function gt(t,e,i){return e===p?ht(function(t,e){var i=T(t),n=N(t),o=i.visualViewport,r=n.clientWidth,s=n.clientHeight,a=0,c=0;if(o){r=o.width,s=o.height;var l=B();(l||!l&&"fixed"===e)&&(a=o.offsetLeft,c=o.offsetTop)}return{width:r,height:s,x:a+dt(t),y:c}}(t,i)):j(e)?function(t,e){var i=V(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ht(function(t){var e,i=N(t),n=lt(t),o=null==(e=t.ownerDocument)?void 0:e.body,r=D(i.scrollWidth,i.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=D(i.scrollHeight,i.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-n.scrollLeft+dt(t),c=-n.scrollTop;return"rtl"===R(o||i).direction&&(a+=D(i.clientWidth,o?o.clientWidth:0)-r),{width:r,height:s,x:a,y:c}}(N(t)))}function vt(t,e,i,n){var o="clippingParents"===e?function(t){var e=ft(K(t)),i=["absolute","fixed"].indexOf(R(t).position)>=0&&P(t)?X(t):t;return j(i)?e.filter((function(t){return j(t)&&z(t,i)&&"body"!==A(t)})):[]}(t):[].concat(e),r=[].concat(o,[i]),s=r[0],a=r.reduce((function(e,i){var o=gt(t,i,n);return e.top=D(o.top,e.top),e.right=M(o.right,e.right),e.bottom=M(o.bottom,e.bottom),e.left=D(o.left,e.left),e}),gt(t,s,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function mt(t){var e,i=t.reference,a=t.element,c=t.placement,u=c?I(c):null,p=c?$(c):null,f=i.x+i.width/2-a.width/2,h=i.y+i.height/2-a.height/2;switch(u){case n:e={x:f,y:i.y-a.height};break;case o:e={x:f,y:i.y+i.height};break;case r:e={x:i.x+i.width,y:h};break;case s:e={x:i.x-a.width,y:h};break;default:e={x:i.x,y:i.y}}var g=u?Y(u):null;if(null!=g){var v="y"===g?"height":"width";switch(p){case l:e[g]=e[g]-(i[v]/2-a[v]/2);break;case d:e[g]=e[g]+(i[v]/2-a[v]/2)}}return e}function yt(t,e){void 0===e&&(e={});var i=e,s=i.placement,a=void 0===s?t.placement:s,l=i.strategy,d=void 0===l?t.strategy:l,g=i.boundary,v=void 0===g?u:g,m=i.rootBoundary,y=void 0===m?p:m,_=i.elementContext,b=void 0===_?f:_,w=i.altBoundary,E=void 0!==w&&w,L=i.padding,O=void 0===L?0:L,x=J("number"!=typeof O?O:Q(O,c)),k=b===f?h:f,A=t.rects.popper,T=t.elements[E?k:b],P=vt(j(T)?T:T.contextElement||N(t.elements.popper),v,y,d),C=V(t.elements.reference),S=mt({reference:C,element:A,strategy:"absolute",placement:a}),I=ht(Object.assign({},A,S)),D=b===f?I:C,M={top:P.top-D.top+x.top,bottom:D.bottom-P.bottom+x.bottom,left:P.left-D.left+x.left,right:D.right-P.right+x.right},q=t.modifiersData.offset;if(b===f&&q){var H=q[a];Object.keys(M).forEach((function(t){var e=[r,o].indexOf(t)>=0?1:-1,i=[n,o].indexOf(t)>=0?"y":"x";M[t]+=H[i]*e}))}return M}var _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,d=t.name;if(!e.modifiersData[d]._skip){for(var u=i.mainAxis,p=void 0===u||u,f=i.altAxis,h=void 0===f||f,m=i.fallbackPlacements,y=i.padding,_=i.boundary,b=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,L=void 0===E||E,O=i.allowedAutoPlacements,x=e.options.placement,k=I(x),A=m||(k===x||!L?[st(x)]:function(t){if(I(t)===a)return[];var e=st(t);return[ct(t),e,ct(e)]}(x)),T=[x].concat(A).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,o=i.boundary,r=i.rootBoundary,s=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,d=void 0===l?v:l,u=$(n),p=u?a?g:g.filter((function(t){return $(t)===u})):c,f=p.filter((function(t){return d.indexOf(t)>=0}));0===f.length&&(f=p);var h=f.reduce((function(e,i){return e[i]=yt(t,{placement:i,boundary:o,rootBoundary:r,padding:s})[I(i)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}(e,{placement:i,boundary:_,rootBoundary:b,padding:y,flipVariations:L,allowedAutoPlacements:O}):i)}),[]),j=e.rects.reference,P=e.rects.popper,C=new Map,S=!0,D=T[0],M=0;M=0,W=V?"width":"height",z=yt(e,{placement:q,boundary:_,rootBoundary:b,altBoundary:w,padding:y}),R=V?B?r:s:B?o:n;j[W]>P[W]&&(R=st(R));var F=st(R),N=[];if(p&&N.push(z[H]<=0),h&&N.push(z[R]<=0,z[F]<=0),N.every((function(t){return t}))){D=q,S=!1;break}C.set(q,N)}if(S)for(var K=function(t){var e=T.find((function(e){var i=C.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return D=e,"break"},U=L?3:1;U>0;U--){if("break"===K(U))break}e.placement!==D&&(e.modifiersData[d]._skip=!0,e.placement=D,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function wt(t){return[n,r,o,s].some((function(e){return t[e]>=0}))}var Et={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=yt(e,{elementContext:"reference"}),a=yt(e,{altBoundary:!0}),c=bt(s,n),l=bt(a,o,r),d=wt(c),u=wt(l);e.modifiersData[i]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:d,hasPopperEscaped:u},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":u})}};var Lt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,o=t.name,a=i.offset,c=void 0===a?[0,0]:a,l=v.reduce((function(t,i){return t[i]=function(t,e,i){var o=I(t),a=[s,n].indexOf(o)>=0?-1:1,c="function"==typeof i?i(Object.assign({},e,{placement:t})):i,l=c[0],d=c[1];return l=l||0,d=(d||0)*a,[s,r].indexOf(o)>=0?{x:d,y:l}:{x:l,y:d}}(i,e.rects,c),t}),{}),d=l[e.placement],u=d.x,p=d.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=p),e.modifiersData[o]=l}};var Ot={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var xt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,c=i.mainAxis,d=void 0===c||c,u=i.altAxis,p=void 0!==u&&u,f=i.boundary,h=i.rootBoundary,g=i.altBoundary,v=i.padding,m=i.tether,y=void 0===m||m,_=i.tetherOffset,b=void 0===_?0:_,w=yt(e,{boundary:f,rootBoundary:h,padding:v,altBoundary:g}),E=I(e.placement),L=$(e.placement),O=!L,x=Y(E),k="x"===x?"y":"x",A=e.modifiersData.popperOffsets,T=e.rects.reference,j=e.rects.popper,P="function"==typeof b?b(Object.assign({},e.rects,{placement:e.placement})):b,C="number"==typeof P?{mainAxis:P,altAxis:P}:Object.assign({mainAxis:0,altAxis:0},P),S=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,q={x:0,y:0};if(A){if(d){var H,B="y"===x?n:s,V="y"===x?o:r,z="y"===x?"height":"width",R=A[x],F=R+w[B],N=R-w[V],K=y?-j[z]/2:0,U=L===l?T[z]:j[z],J=L===l?-j[z]:-T[z],Q=e.elements.arrow,Z=y&&Q?W(Q):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[B],it=tt[V],nt=G(0,T[z],Z[z]),ot=O?T[z]/2-K-nt-et-C.mainAxis:U-nt-et-C.mainAxis,rt=O?-T[z]/2+K+nt+it+C.mainAxis:J+nt+it+C.mainAxis,st=e.elements.arrow&&X(e.elements.arrow),at=st?"y"===x?st.clientTop||0:st.clientLeft||0:0,ct=null!=(H=null==S?void 0:S[x])?H:0,lt=R+rt-ct,dt=G(y?M(F,R+ot-ct-at):F,R,y?D(N,lt):N);A[x]=dt,q[x]=dt-R}if(p){var ut,pt="x"===x?n:s,ft="x"===x?o:r,ht=A[k],gt="y"===k?"height":"width",vt=ht+w[pt],mt=ht-w[ft],_t=-1!==[n,s].indexOf(E),bt=null!=(ut=null==S?void 0:S[k])?ut:0,wt=_t?vt:ht-T[gt]-j[gt]-bt+C.altAxis,Et=_t?ht+T[gt]+j[gt]-bt-C.altAxis:mt,Lt=y&&_t?function(t,e,i){var n=G(t,e,i);return n>i?i:n}(wt,ht,Et):G(y?wt:vt,ht,y?Et:mt);A[k]=Lt,q[k]=Lt-ht}e.modifiersData[a]=q}},requiresIfExists:["offset"]};function kt(t,e,i){void 0===i&&(i=!1);var n,o,r=P(e),s=P(e)&&function(t){var e=t.getBoundingClientRect(),i=q(e.width)/t.offsetWidth||1,n=q(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=N(e),c=V(t,s,i),l={scrollLeft:0,scrollTop:0},d={x:0,y:0};return(r||!r&&!i)&&(("body"!==A(e)||ut(a))&&(l=(n=e)!==T(n)&&P(n)?{scrollLeft:(o=n).scrollLeft,scrollTop:o.scrollTop}:lt(n)),P(e)?((d=V(e,!0)).x+=e.clientLeft,d.y+=e.clientTop):a&&(d.x=dt(a))),{x:c.left+l.scrollLeft-d.x,y:c.top+l.scrollTop-d.y,width:c.width,height:c.height}}function At(t){var e=new Map,i=new Set,n=[];function o(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&o(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||o(t)})),n}var Tt={placement:"bottom",modifiers:[],strategy:"absolute"};function jt(){for(var t=arguments.length,e=new Array(t),i=0;i { + if (invite_messages_inpt.innerHTML!='') { invite_messages_inpt.innerHTML=''; } + if (invite_messages_out.innerHTML!='') { invite_messages_out.innerHTML=''; } +}; +const set_email = (elem) => { + clear_messages(); +}; +const set_expire_input = (elem) => { + expire_value.innerHTML = `${expire_input.value} minutes` + expire_range.value = expire_input.value; + clear_messages(); +}; +const set_expire = (elem) => { + expire_value.innerHTML = `${expire_range.value} minutes`; + expire_input.value = expire_range.value; + clear_messages(); +}; +const show_form = (elem) => { + invite_restart.classList.toggle('hidden'); + invite_sec_form.classList.toggle('hidden'); +}; +const invite = async () => { + const email = document.getElementById('email-input').value; + if (email == '') { + invite_messages_inpt.innerHTML='Enter email '; + return; + } + if (!email.includes('@')) { + invite_messages_inpt.innerHTML='Please include a valid email'; + return; + } + const elem_roles = document.getElementById('roles-select'); + const roles = [...elem_roles.selectedOptions].map(option => option.value).join(',') + if (roles == '') { + invite_messages_inpt.innerHTML='Please include a role'; + return; + } + let expire = parseInt(expire_input.value) || 0; + if (expire == 0 ) { + invite_messages_inpt.innerHTML='Please set expiration valid value'; + return; + } + expire = (expire * 60); + let send_email = document.getElementById('send-email') ? + document.getElementById('send-email').checked : false; + const data = { + email, + roles, + expire, + send_email, + }; + if (target_url != '') { + const response = await fetch(target_url, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (response.ok && response.status === 200 ) { + clear_messages(); + invite_sec_form.classList.toggle('hidden'); + invite_messages_out.innerHTML=await response.text(); + invite_restart.classList.toggle('hidden'); + } else { + clear_messages(); + invite_messages_inpt.innerHTML=await response.text(); + } + } +}; \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/login.js b/resources/sitehome_model/assets/js/login.js new file mode 100644 index 0000000..3711d20 --- /dev/null +++ b/resources/sitehome_model/assets/js/login.js @@ -0,0 +1,221 @@ + +const login_messages = document.getElementById('login-messages-inpt'); +const otp_messages = document.getElementById('otp-messages-inpt'); +const forgot_messages = document.getElementById('forgot-messages'); + +const target_url = () => { + const url_params = new URL(window.location.toLocaleString()).searchParams; + const target_url = url_params.get('o'); + return target_url ? target_url : '/'; +}; +const sign_up = () => { + if (SIGNIN_URL) { + location.href=SIGNUP_URL; + } +}; +const on_forgot_passwd = () => { + if (RESET_URL) { + if (forgot_messages) { + forgot_messages.classList.remove('hidden'); + forgot_messages.innerHTML='

For password reset you need:

a valid user, email and a verified TOTP code.

Otherwise contact with Service Administrators.

' + } + const main_form = document.getElementById('main-form'); + const otp_form = document.getElementById('otp-form'); + const btn_otp_forgot_passwd = document.getElementById('otp-forgot-password'); + const otp_login_link = document.getElementById('otp-login-link') + const btn_otp_signin = document.getElementById('otp-signin-button'); + const name = document.getElementById('login-name-inpt').value; + if (name == '') { + login_messages.innerHTML='Enter a name'; + return; + } + main_form.classList.add('hidden'); + if (btn_otp_forgot_passwd) { btn_otp_forgot_passwd.classList.remove('hidden') }; + if (otp_login_link) { otp_login_link.classList.remove('hidden') }; + if (btn_otp_signin) { btn_otp_signin.classList.add('hidden') }; + otp_form.classList.remove('hidden'); + } +}; +const forgot_passwd = async() => { + const otp_loading = document.getElementById('otp-loading'); + const otp_btns = document.getElementById('otp-btns'); + const elem_otp_auth = document.getElementById('login-totp-inpt'); + const elem_name = document.getElementById('login-name-inpt'); + const otp_form = document.getElementById('otp-form'); + let name = ''; + if (elem_name) { name = elem_name.value; } + let otp_auth = ''; + if (elem_otp_auth) { + otp_auth = elem_otp_auth.value; + if (otp_auth == '') { + otp_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + const numbers = /^[0-9]+$/; + if(! otp_auth.match(numbers) || otp_auth.length != totp_digits ) { + otp_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + } + if (RESET_URL) { + const input_data = { name, value: otp_auth }; + const response = await fetch(RESET_URL, { + method: 'POST', + body: JSON.stringify(input_data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (otp_loading) { utils.css('show',otp_loading); } + if (otp_btns) { utils.css('hide',otp_btns); } + if (response.ok && response.status === 200 ) { + if (otp_loading) { utils.css('hide',otp_loading); } + const data = await response.text(); + if (otp_form) { utils.css('hide',otp_form); } + if (forgot_messages) { forgot_messages.innerHTML=data } + setTimeout(() => { location.href = target_url() }, settings.toast_copy_timeout); + } else { + if (otp_loading) { utils.css('hide',otp_loading); } + if (otp_btns) { utils.css('show',otp_btns); } + if (forgot_messages) { forgot_messages.innerHTML='Errors in password reset'; } + return false; + } + } +}; +const set_name = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + if (forgot_messages) { forgot_messages.classList.add('hidden'); } +}; +const set_password = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + if (forgot_messages) { forgot_messages.classList.add('hidden'); } +}; +const log_in = async () => { + const main_form = document.getElementById('main-form'); + const main_btns = document.getElementById('main-btns'); + const main_loading = document.getElementById('main-loading'); + const otp_form = document.getElementById('otp-form'); + const name = document.getElementById('login-name-inpt').value; + if (name == '') { + login_messages.innerHTML='Enter a name'; + return; + } + const password = document.getElementById('login-password-inpt').value; + if (password == '') { + login_messages.innerHTML='Please choose a password'; + return; + } + const data = { + name, + password, + //timestamp: new Date().toLocaleString(), + }; + if (main_btns) { utils.css('hide',main_btns); } + if (main_loading) { utils.css('show',main_loading); } + const response = await fetch(SIGNIN_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (main_loading) { utils.css('hide',main_loading); } + if (response.ok && response.status === 200 ) { + const data = await response.text(); + if (data.includes('true') && otp_form) { + main_form.classList.add('hidden'); + otp_form.classList.remove('hidden'); + } else { + location.href=target_url(); + } + } else { + login_messages.innerHTML='Signin was not OK'; + if (main_btns) { utils.css('show',main_btns); } + return false; + } +}; +const set_totp = (elem) => { + if (otp_messages.innerHTML!='') { otp_messages.innerHTML=''; } +}; +const otp_in = async () => { + const otp_btns = document.getElementById('otp-btns'); + const otp_loading = document.getElementById('otp-loading'); + const name = document.getElementById('login-name-inpt').value; + if (name == '') { + otp_messages.innerHTML='Enter a name'; + return; + } + const password = document.getElementById('login-password-inpt').value; + if (password == '') { + otp_messages.innerHTML='Please choose a password'; + return; + } + const otp_auth = document.getElementById('login-totp-inpt').value; + if (otp_auth == '') { + otp_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + const numbers = /^[0-9]+$/; + if(! otp_auth.match(numbers) || otp_auth.length != totp_digits ) { + otp_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + const data = { + name, + password, + otp_auth, + }; + if (otp_btns) { utils.css('hide',otp_btns);} + if (otp_loading) { utils.css('show',otp_loading); } + const response = await fetch(SIGNIN_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (otp_loading) { utils.css('hide',otp_loading); } + if (response.ok && response.status === 200 ) { + location.href=target_url(); + } else { + if (otp_btns) { utils.css('show',otp_btns);} + otp_messages.innerHTML='Signin was not OK'; + return false; + } +}; +const restart = () => { + const main_form = document.getElementById('main-form'); + const main_btns = document.getElementById('main-btns'); + const otp_form = document.getElementById('otp-form'); + const otp_btns = document.getElementById('otp-btns'); + if (otp_btns) { utils.css('show',otp_btns);} + if (main_btns) { utils.css('show',main_btns);} + otp_form.classList.add('hidden'); + forgot_messages.classList.add('hidden'); + forgot_messages.innerHTML=''; + main_form.classList.remove('hidden'); + login_messages.innerHTML=''; + otp_messages.innerHTML=''; +}; +window.addEventListener('load', () => { + const show_password = document.getElementById('show-password'); + const input_password = document.getElementById('login-password-inpt') + const otp_logo_link = document.getElementById('otp-logo-link') + if (show_password) { + show_password.addEventListener('click', (ev) => { + ev.preventDefault(); + [...show_password.children].forEach(it => { + it.classList.toggle('hidden'); + }); + if (input_password.type == 'password') { + input_password.type = 'text'; + } else { + input_password.type = 'password'; + } + }); + } + if (otp_logo_link) { otp_logo_link.href = location.href; } +}); \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/logs.js b/resources/sitehome_model/assets/js/logs.js new file mode 100644 index 0000000..b07bbe3 --- /dev/null +++ b/resources/sitehome_model/assets/js/logs.js @@ -0,0 +1,421 @@ +let logs_env = {}; +let usrs_env = {}; +let log_elem = {}; + +const load_elem = () => { + log_elem = Object.freeze({ + table: document.getElementById('table-log'), + modal: document.getElementById('edit-user-modal'), + dropdown_action: document.getElementById('dropdown-action'), + search_inpt: document.getElementById('table-search-usrs'), + search_clean: document.getElementById('clean-search'), + checkbox_all: document.getElementById('checkbox-all'), + count_select: document.getElementById('count-select'), + alert_danger: document.getElementById('alert-danger'), + danger_message: document.getElementById('danger-message'), + alert_info: document.getElementById('alert-info'), + info_message: document.getElementById('info-message'), + checkbox_all: document.getElementById('checkbox-all'), + alert_timeout: 4000, + user_form: { + name: document.getElementById('usr-name'), + fullname: document.getElementById('usr-fullname'), + email: document.getElementById('usr-email'), + description: document.getElementById('usr-description'), + roles: document.getElementById('usr-roles'), + items: document.getElementById('usr-items'), + status: document.getElementById('usr-status'), + current_status: document.getElementById('current-usr-status'), + isadmin: document.getElementById('usr-isadmin'), + otp_enabled: document.getElementById('usr-otp-enabled'), + otp_verified: document.getElementById('usr-otp-verified'), + otp_defs: document.getElementById('usr-otp-defs'), + }, + }) +}; +const set_user_status = (value,color) => { + if (log_elem.user_form.current_status && log_elem.user_form.status) { + log_elem.user_form.status.value=value; + log_elem.user_form.current_status.innerHTML= + `
${value}
`; + } +}; +const edit_row = (pos) => { + const id = usrs_env.data && usrs_env.data[pos] ? usrs_env.data[pos] : -1 + console.log(id); + if (id > -1) { + edit_usr(`${id}`); + } +}; +const close_usr = () => { + if (usrs_env.modal.hide) { + usrs_env.modal.hide(); + } +}; +const fill_form = () => { + log_elem.user_form.name.value = usrs_env.user.name; + log_elem.user_form.fullname.value = usrs_env.user.fullname; + log_elem.user_form.email.value = usrs_env.user.email; + log_elem.user_form.description.value = usrs_env.user.description; + log_elem.user_form.roles.value = usrs_env.user.roles; + log_elem.user_form.items.value = usrs_env.user.items; + log_elem.user_form.status.value = usrs_env.user.status; + usrs_env.user.isadmin == 1 ? + log_elem.user_form.isadmin.checked=true : + log_elem.user_form.isadmin.checked=false; + usrs_env.user.otp_enabled == 1 ? + log_elem.user_form.otp_enabled.checked = true : + log_elem.user_form.otp_enabled.checked = false; + usrs_env.user.otp_verified == 1 ? + log_elem.user_form.otp_verified.checked = true : + log_elem.user_form.otp_verified.checked = false ; + log_elem.user_form.otp_defs.value = usrs_env.user.otp_defs; + let color = ''; + switch (log_elem.user_form.status.value) { + case 'Active': + color='green'; + break; + case 'Created': + color='blue'; + break; + case 'Pending': + color='orange'; + break; + case 'Lock': + color='red'; + break; + default: + color='yellow'; + } + set_user_status(log_elem.user_form.status.value,color); +}; +const collect_form = () => { + usrs_env.user.name = log_elem.user_form.name.value; + usrs_env.user.fullname = log_elem.user_form.fullname.value; + usrs_env.user.email = log_elem.user_form.email.value; + usrs_env.user.description = log_elem.user_form.description.value; + usrs_env.user.roles = log_elem.user_form.roles.value; + usrs_env.user.items = log_elem.user_form.items.value; + usrs_env.user.status = log_elem.user_form.status.value; + log_elem.user_form.isadmin.checked ? + usrs_env.user.isadmin = true : + usrs_env.user.isadmin = false; + log_elem.user_form.otp_enabled.checked ? + usrs_env.user.otp_enabled = true : + usrs_env.user.otp_enabled = false; + log_elem.user_form.otp_verified.checked ? + usrs_env.user.otp_verified = true : + usrs_env.user.otp_verified = false; + usrs_env.user.otp_defs = log_elem.user_form.otp_defs.value; +}; +const edit_usr = async (id) => { + if (usrs_env.modal.show) { + const res = await get_user('id',id); + if (res.status && res.data.id == id) { + usrs_env.user = res.data; + fill_form(); + usrs_env.modal.show(); + } + } +}; +const save_all_usr = async (ev) => { + ev.preventDefault(); + if (usrs_env.modal.show && usrs_env.user) { + collect_form(); + const res = await save_user(usrs_env.user); + // if (res.status) { + usrs_env.modal.hide(); + } +}; +const on_search = (el) => { + const tbody = log_elem.table.getElementsByTagName('tbody')[0]; + let total = 0; + let count_select = 0; + [...tbody.getElementsByTagName('tr')].forEach(tr => { + total +=1; + if (tr.dataset.row && tr.dataset.row.includes(el.value)) { + tr.classList.remove('hidden'); + count_select +=1; + } else { + tr.classList.add('hidden'); + } + }); + if (log_elem.count_select) { + if (count_select == total) { + log_elem.count_select.innerHTML=''; + } else { + log_elem.count_select.innerHTML=`${count_select} of`; + } + } +}; +const on_search_keydown = (el,event) => { + switch (event.key) { + case 'Delete': + case 'Home': + clean_search(); + break; + case 'Enter': + break; + default: + on_search(el); + } +} +const clean_search = () => { + log_elem.search_inpt.value=''; + on_search(log_elem.search_inpt); +}; +const load_data = () => { + const js_data = document.getElementById('js-data'); + if (js_data) { js_data.remove(); } + logs_env.data = []; + if (logs_list) { + try { + logs_env.data = JSON.parse(logs_list) + } catch (error) { + logs_env.data = []; + } + logs_list=''; + } +}; +const on_check_all = (el,ev) => { + ev.preventDefault(); + if (log_elem.checkbox_all) { + const state = log_elem.checkbox_all.checked; + [...log_elem.table.getElementsByClassName('col-check')].forEach(it => { + it.checked = state; + }); + } +}; +const table_sort = (col) => { + const tbody = log_elem.table.getElementsByTagName('tbody')[0]; + const rows = tbody.getElementsByTagName('tr'); + const arrow_up = document.getElementById(`${col}-arrow-up`); + const arrow_down = document.getElementById(`${col}-arrow-down`); + const col_rows = []; + [...rows].forEach(it => { + const data=it.dataset.row.split(':'); + switch (col) { + case 'when': + col_rows.push({ky: data[0], tr:it}) + break; + case 'origin': + col_rows.push({ky: data[1], tr:it}) + break; + case 'context': + col_rows.push({ky: data[2], tr:it}) + break; + case 'request': + col_rows.push({ky: data[3], tr:it}) + break; + case 'roles': + col_rows.push({ky: data[4], tr:it}) + break; + case 'agent': + col_rows.push({ky: data[5], tr:it}) + break; + } + }) + if (col_rows.length == 0) { return; } + const is_asc = !logs_env.cols[col].asc; + logs_env.cols[col].asc = is_asc; + if (is_asc) { + if (arrow_up) { arrow_up.classList.remove('hidden'); } + if (arrow_down) { arrow_down.classList.add('hidden'); } + } else { + if (arrow_up) { arrow_up.classList.add('hidden'); } + if (arrow_down) { arrow_down.classList.remove('hidden'); } + } + col_rows.sort((a,b) => { + if (is_asc) { + if (a.ky > b.ky) { return 1; } + if (a.ky < b.ky) { return -1; } + } else { + if (a.ky > b.ky) { return -1; } + if (a.ky < b.ky) { return 1; } + } + // a must be equal to b + return 0; + }); + tbody.innerHTM=''; + col_rows.forEach(it => tbody.append(it.tr)); +}; +const alert_danger = (task,message) => { + if (log_elem.danger_message && log_elem.alert_danger) { + log_elem.danger_message.innerHTML=message; + switch (task) { + case 'show': + log_elem.alert_danger.classList.remove('hidden'); + setTimeout(() => { + log_elem.alert_danger.classList.add('hidden'); + }, log_elem.alert_timeout); + break; + default: + log_elem.alert_danger.classList.add('hidden'); + } + } +}; +const alert_info = (task,message) => { + if (log_elem.info_message && log_elem.alert_info) { + log_elem.info_message.innerHTML=message; + switch (task) { + case 'show': + log_elem.alert_info.classList.remove('hidden'); + setTimeout(() => { + log_elem.alert_info.classList.add('hidden'); + }, log_elem.alert_timeout); + break; + default: + log_elem.alert_info.classList.add('hidden'); + } + } +}; +const post_fetch = async (source,url = '',source_data) => { + if (url == '') { return } + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(source_data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + } + }); + alert_danger('hide',''); + alert_info('hide',''); + if (response.ok && response.status === 200 ) { + if (source == 'get_user') { + const name = source_data.name; + const value = source_data.value; + const data = await response.json(); + if (data[name] && data[name] == value){ + return {status: true, data } + } else { + alert_danger('show',`No data found for ${name}`) + return {status: false, data: {}}; + } + } else { + const data = await response.text(); + if (data != '') { alert_info('show',data); } + return {status: true, data } + } + } else if ( response.status === 401 ) { + alert_danger('show','Error connection, SESSION expired ? Try Reload !') + return {status: false, data: {}}; + } else if ( response.status === 400 ) { + alert_danger('show','Error connection, bad request. No data found !') + return {status: false, data: {}}; + } else { + alert_danger('show','Error connection, no data available') + return {status: false, data: {}}; + } +}; +const get_user = async (name, value) => { + if (GETUSER_URL) { + const data = { + name, + value + }; + return await post_fetch('get_user', GETUSER_URL,data); + } +}; +const save_user = async (data) => { + if (SAVEUSER_URL) { + return await post_fetch('save_user', SAVEUSER_URL,data); + } +}; +const list_act_items = () => { + let act_items=[]; + if (log_elem.checkbox_all) { + const state = log_elem.checkbox_all.checked; + [...log_elem.table.getElementsByClassName('col-check')].forEach(it => { + if (it.checked && it.dataset.col) { + if (logs_env && logs_env.data && logs_env.data[it.dataset.col]) { + act_items.push({ + id: logs_env.data[it.dataset.col], + src: it, + }); + } + } + }); + } + return act_items; +}; +const log_delete_lines = async (user_id) => { + let status = true; + list_act_items().forEach(async (it) => { + const res = await post_fetch('act_delete', DELETELOG_URL,{ + name: user_id, value: it.id + }); + if (res.status) { it.src.checked = false;} + status = res.status; + }); + return status; +}; +const on_log_delete = async (user_id) => { + if (DELETELOG_URL) { + const usrid = user_id == '0' ? '' : user_id; + if (log_elem.dropdown_action) { log_elem.dropdown_action.classList.add('hidden'); } + const status = await log_delete_lines(usrid); + if (log_elem.checkbox_all) { log_elem.checkbox_all.checked=false;} + setTimeout(() => { + if (status) { location.reload(); } + }, log_elem.alert_timeout); + } +}; +const clean_log = async (user_id) => { + if (DELETELOG_URL) { + const name = user_id == '0' ? '' : user_id; + if (log_elem.dropdown_action) { log_elem.dropdown_action.classList.add('hidden'); } + const res = await post_fetch('act_delete', DELETELOG_URL,{ + name, value: 'ALL' + }); + if (log_elem.checkbox_all) { log_elem.checkbox_all.checked=false;} + if (res.status) { location.reload(); } + } +}; + +const on_log_info = (elem) => { + if (elem && elem.children) { + [...elem.children].forEach((it,idx) => { + if (idx > 0 ) { it.classList.toggle('hidden'); } + }); + } +}; +window.addEventListener('load', () => { + load_data(); + load_elem(); + if (log_elem && log_elem.table) { + logs_env.cols = {}; + const thead = log_elem.table.getElementsByTagName('thead'); + if (thead[0]) { + [...thead[0].getElementsByTagName('th')].forEach(col => { + const th = col.dataset.th; + if (th != 'check') { + logs_env.cols[th]={asc: false}; + col.addEventListener('click', (ev) => { + ev.preventDefault(); + const src = col; + const th = src.dataset.th; + console.log(`${th}`); + table_sort(th); + }); + } + }); + } + } + // options with default values + const options = { + placement: 'bottom-right', + backdrop: 'dynamic', + backdropClasses: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40', + closable: true, + onHide: () => { + console.log('modal is hidden'); + }, + onShow: () => { + console.log('modal is shown'); + }, + onToggle: () => { + console.log('modal has been toggled'); + } + }; + usrs_env.modal = new Modal(log_elem.modal, options); +}); \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/main.js b/resources/sitehome_model/assets/js/main.js new file mode 100644 index 0000000..2759390 --- /dev/null +++ b/resources/sitehome_model/assets/js/main.js @@ -0,0 +1,81 @@ +if (typeof settings == 'undefined') { let settings = {}; } +if (typeof site == 'undefined') { let site = {}; } +if (typeof curr_defs == 'undefined') { let curr_defs = {}; } +const define_settings = () => { + settings = Object.freeze({ + now: new Date(), + elements: { + themeToggle: { + DarkIcon: document.getElementById('theme-toggle-dark-icon'), + + LightIcon: document.getElementById('theme-toggle-light-icon'), + Btn: document.getElementById('theme-toggle'), + }, + loading: document.getElementById('loadding-section'), + }, + l_store_key: 'defs', + toast_copy_timeout: 2000, + alert_timeout: 3000, + }); + curr_defs = {}; + site = { + on_color_theme: (color_theme) => { + const elem = document.getElementsByTagName('html')[0]; + if (color_theme == 'dark') { + utils.css("hide", settings.elements.themeToggle.DarkIcon); + utils.css("show", settings.elements.themeToggle.LightIcon); + if (!elem.classList.contains('dark')) { + elem.classList.add('dark'); + } + } else { + utils.css("show", settings.elements.themeToggle.DarkIcon); + utils.css("hide", settings.elements.themeToggle.LightIcon); + if (elem.classList.contains('dark')) { + elem.classList.remove('dark'); + } + } + }, + on_loading: (task) => { + if (settings.elements.loading) { + utils.css(task, settings.elements.loading); + } + } + }; +} +window.addEventListener('load', () => { + define_settings(); + const str_curenv = localStorage.getItem(settings.l_store_key); + if (str_curenv != '') { + try { + data= JSON.parse(str_curenv); + } catch (error) { + console.log(error); + } + if (data) { curr_defs = data}; + } else { curr_defs = {}; } + let color_theme = 'light'; + if (tpl_defs && tpl_defs.main && tpl_defs.main.color_theme != '') { + color_theme = tpl_defs.main.color_theme; + } else if (curr_defs && curr_defs.theme) { + color_theme = curr_defs.theme; + } + if (settings.elements.themeToggle.Btn) { + site.on_color_theme(color_theme); + settings.elements.themeToggle.Btn.addEventListener('click', (ev) => { + ev.preventDefault(); + const elem = document.getElementsByTagName('html')[0]; + const next_theme = elem.classList.contains('dark') ? 'light' : 'dark'; + if (tpl_defs && tpl_defs.curr_env) { + tpl_defs.curr_env.color_theme = next_theme; + } + if (curr_defs) { + curr_defs.theme=next_theme; + localStorage.setItem(settings.l_store_key, JSON.stringify(curr_defs)); + } + site.on_color_theme(next_theme); + if (tpl_defs.main.has_role) { utils.update_session(data); } + }); + } + // this is key to hide theme changes before page display + document.body.classList.remove('hidden'); +}); \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/signup.js b/resources/sitehome_model/assets/js/signup.js new file mode 100644 index 0000000..5f417a9 --- /dev/null +++ b/resources/sitehome_model/assets/js/signup.js @@ -0,0 +1,303 @@ +const login_messages = document.getElementById('login-messages-inpt'); +const otp_section = document.getElementById('otp-section'); +const input_password = document.getElementById('login-password-inpt'); +const input_repeat_password = document.getElementById('login-repeat-password-inpt'); +const password_secure_bar = document.getElementById('password-secure-bar'); +const password_secure_val = document.getElementById('password-secure-val'); +const password_suggestions = document.getElementById('password-suggestions'); +const password_warning = document.getElementById('password-warning'); +const password_error = document.getElementById('password-error'); +const get_otp_info = () => { + const otp_url = document.getElementById('login-totp-url').value; + if (otp_url && otp_url !== '') { + const otp_message = document.getElementById('totp-message'); + const url = new URL(otp_url); + if (url && url.searchParams) { + let algo=''; + let digits=''; + if (totp_algorithm) { + algo = totp_algorithm; + } else { + algo = url.searchParams.get('algorithm') || ''; + } + if (algo !== '') { + algo = `Algorithm: ${algo} | `; + } + if (totp_digits) { + digits = totp_digits || 0; + } + if (digits > 0) { + digits = `| Digits: ${digits}`; + } + const issuer = `Issuer: ${url.searchParams.get('issuer') || ''}`; + otp_message.innerHTML = ` ${algo} ${issuer} ${digits}`; + } + } +} +const check_value = async (name,value,elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + const elem_error = document.getElementById(`${name}-error`); + let res = await check_item(name,value); + if (elem_error) { elem_error.innerHTML = res} + if (res != '') { + elem.focus(); + return false; + } + return true; +}; +const set_name = async (elem) => { + if (elem.value == '' ) { + login_messages.innerHTML='Please include a valid name'; + return false; + } + return await check_value('name',elem.value,elem); +}; +const set_email = async (elem) => { + if (elem.value == '' || !elem.value.includes('@')) { + login_messages.innerHTML='Please include a valid email'; + return false; + } + return await check_value('email',elem.value,elem); +}; +const set_totp = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } +}; +const make_role_chips = (elem) => { + const arr_items = elem.value == '' ? [] : elem.value.split(','); + const roles_chips = document.getElementById('roles-chips'); + if (roles_chips) { + roles_chips.innerHTML=''; + if (arr_items.length == 0) { return; } + arr_items.forEach(name => { + if (name.replaceAll(' ','') !== '') { + const chip = document.createElement("span"); + chip.id = `badge-${name}`; + const arr_classes = "inline-flex items-center px-2 py-1 mr-2 text-sm font-medium text-blue-800 bg-blue-100 rounded dark:bg-blue-900 dark:text-blue-300".split(" "); + chip.classList.add(...arr_classes); + chip.innerHTML = `${name} `; + roles_chips.append(chip); + document.getElementById(`badge-${name}`).addEventListener('click', (ev) => { + ev.preventDefault(); + chip.remove(); + elem.value = arr_items.filter(it => it != name).join(','); + }); + } + }); + } +}; +const set_role = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + make_role_chips(elem); +}; +const set_items = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } +}; +const clean_password_messages = () => { + if (password_secure_bar) { password_secure_bar.style.width = '0%'; } + if (password_secure_val) { password_secure_val.innerHTML=0; } + if (password_suggestions) { password_suggestions.innerHTML=''; } + if (password_warning) { password_warning.innerHTML=''; } + if (password_error) { password_error.innerHTML=''; } +}; +const set_password = async (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + clean_password_messages(); + const feedback = await check_item('password',elem.value); + if (password_secure_bar) { password_secure_bar.style.width = `${parseInt(feedback.score)*10}%`; } + if (password_secure_val) { password_secure_val.innerHTML=feedback.score; } + if (password_suggestions) { password_suggestions.innerHTML=feedback.suggestions; } + if (password_warning) { password_warning.innerHTML=feedback.warning; } + if (PASSWORD_SCORE && feedback.score < PASSWORD_SCORE) { + elem.focus(); + if (password_error) { + password_error.innerHTML = `Password under score value: ${PASSWORD_SCORE}`; + } + return false; + } + if (input_password.value !== input_repeat_password.value) { + login_messages.innerHTML = 'Password and repetition not mactch'; + elem.focus(); + return false; + } + return true; +}; +const change_use_totp = (elem) => { + if (otp_section) { + otp_section.classList.toggle('hidden'); + } +}; +const set_theme = (elem) => { + if (settings && settings.elements) { + const sel_theme = elem.value; + const element = document.getElementsByTagName('html')[0]; + const curr_theme = element.classList.contains('dark') ? 'dark': 'light'; + if (curr_theme != sel_theme) { + if (sel_theme != 'dark' && element.classList.contains('dark')) { + element.classList.remove('dark'); + } else { + element.classList.add('dark'); + } + } + } +}; +const copy_otp_code = (elem) => { + const content = document.getElementById('login-totp-code').value || ''; + const toast_target = document.getElementById('toast-copy-totp-code'); + navigator.clipboard.writeText(content).then( + () => { + if (toast_target) { + utils.css('show', toast_target); + setTimeout(() => { + utils.css('hide', toast_target); + }, settings.toast_copy_timeout); + } + }, + ); +}; +const check_item = async (name, value) => { + if (CHECK_URL) { + const data = { + name, + value + }; + const response = await fetch(CHECK_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + } + }); + login_messages.innerHTML=''; + if (response.ok && response.status === 200 ) { + if (name == 'password') { + const text = await response.text(); + const arr_text = text.split('|'); + return { + score: arr_text[0] || 0, + suggestions: arr_text[1].replace('\n','
') || '', + warning: arr_text[2] || '', + }; + } else { + return ''; + } + } else { + return `Enter a valid value for ${name}`; + } + } +}; +const log_in = async () => { + const elem_name = document.getElementById('login-name-inpt'); + login_messages.innerHTML=''; + if (elem_name.value == '') { + login_messages.innerHTML='Enter a name'; + return; + } + if (! await set_name(elem_name)) { return; } + const name = elem_name.value; + const elem_password = document.getElementById('login-password-inpt'); + if (elem_password.value == '') { + login_messages.innerHTML='Please include a password'; + return; + } + if (!set_password(elem_password)) { return; } + const password = elem_password.value; + const otp_code = document.getElementById('login-totp-code').value || ''; + const otp_url = document.getElementById('login-totp-url').value || '' + const otp_auth = document.getElementById('login-totp-inpt').value || ''; + if (otp_code != '') { + if (otp_auth == '' && totp_mode == "mandatory") { + login_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + if (totp_mode == 'mandatory' || document.getElementById('use-totp').checked) { + const numbers = /^[0-9]+$/; + if(! otp_auth.match(numbers) || otp_auth.length != totp_digits ) { + login_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + } + } + const roles = document.getElementById('login-roles-inpt').value; + const fullname= document.getElementById('login-fullname-inpt').value; + const description = document.getElementById('login-description-inpt').value; + const elem_email = document.getElementById('login-email-inpt'); + if (! await set_email(elem_email)) { return; } + const email = elem_email.value; + const theme = document.getElementById('theme-select').value; + const items = {'theme': theme }; + if (INVITE_KEY && INVITE_KEY != '') { + items.invite_key = INVITE_KEY; + } + if (INVITE_ID && INVITE_ID != '') { + items.invite_id = INVITE_ID; + } + const data = { + id: '0', + name, + fullname, + description, + email, + password, + otp_code, + otp_url, + otp_auth, + roles, + items + //timestamp: new Date().toLocaleString(), + }; + const response = await fetch(SIGNIN_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (response.ok && response.status === 200 ) { + location.href='/'; + } else { + login_messages.innerHTML='Signin response was not OK'; + // throw new Error('Signin response was not OK'); + return false; + } +}; +window.addEventListener('load', () => { + get_otp_info(); + const show_password = document.getElementById('show-password'); + const show_repeat_password = document.getElementById('show-repeat-password'); + const otp_code_text = document.getElementById('opt-code-text') + if (show_password) { + show_password.addEventListener('click', (ev) => { + ev.preventDefault(); + [...show_password.children].forEach(it => { + it.classList.toggle('hidden'); + }); + if (input_password.type == 'password') { + input_password.type = 'text'; + } else { + input_password.type = 'password'; + } + }); + } + if (show_repeat_password) { + show_repeat_password.addEventListener('click', (ev) => { + ev.preventDefault(); + [...show_repeat_password.children].forEach(it => { + it.classList.toggle('hidden'); + }); + if (input_repeat_password.type == 'password') { + input_repeat_password.type = 'text'; + } else { + input_repeat_password.type = 'password'; + } + }); + } + if (otp_code_text) { + otp_code_text.addEventListener('click', (ev) => { + ev.preventDefault(); + copy_otp_code(ev); + }); + } +}); \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/unocss.js b/resources/sitehome_model/assets/js/unocss.js new file mode 100644 index 0000000..386f8cd --- /dev/null +++ b/resources/sitehome_model/assets/js/unocss.js @@ -0,0 +1,9 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/@unocss/runtime@0.52.3/uno.global.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +"use strict";(()=>{var Ni=Object.defineProperty;var Hi=(e,t)=>{for(var r in t)Ni(e,r,{get:t[r],enumerable:!0})};function Y(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ae(e){let t=e.length,r=-1,n,o="",a=e.charCodeAt(0);for(;++r=1&&n<=31||n===127||r===0&&n>=48&&n<=57||r===1&&n>=48&&n<=57&&a===45){o+=`\\${n.toString(16)} `;continue}if(r===0&&t===1&&n===45){o+=`\\${e.charAt(r)}`;continue}if(n>=128||n===45||n===95||n>=48&&n<=57||n>=65&&n<=90||n>=97&&n<=122){o+=e.charAt(r);continue}o+=`\\${e.charAt(r)}`}return o}var et=ae;function T(e=[]){return Array.isArray(e)?e:[e]}function ce(e){return Array.from(new Set(e))}function j(e){return typeof e=="string"}function ge(e){return j(e)?e:(Array.isArray(e)?e:Object.entries(e)).filter(t=>t[1]!=null)}function gn(e){return Array.isArray(e)?e.find(t=>!Array.isArray(t)||Array.isArray(t[0]))?e.map(t=>ge(t)):[e]:[ge(e)]}function Gi(e){return e.filter(([t,r],n)=>{if(t.startsWith("$$"))return!1;for(let o=n-1;o>=0;o--)if(e[o][0]===t&&e[o][1]===r)return!1;return!0})}function be(e){return e==null?"":Gi(e).map(([t,r])=>r!=null?`${t}:${r};`:void 0).filter(Boolean).join("")}function tt(e){return e&&typeof e=="object"&&!Array.isArray(e)}function Ar(e,t,r=!1){let n=e,o=t;if(Array.isArray(o))return r&&Array.isArray(o)?[...n,...o]:[...o];let a={...n};return tt(n)&&tt(o)&&Object.keys(o).forEach(i=>{tt(n[i])&&tt(o[i])||Array.isArray(n[i])&&Array.isArray(o[i])?a[i]=Ar(n[i],o[i],r):Object.assign(a,{[i]:o[i]})}),a}function Ce(e){let t,r,n;if(Array.isArray(e)){for(r=Array(t=e.length);t--;)r[t]=(n=e[t])&&typeof n=="object"?Ce(n):n;return r}if(Object.prototype.toString.call(e)==="[object Object]"){r={};for(t in e)t==="__proto__"?Object.defineProperty(r,t,{value:Ce(e[t]),configurable:!0,enumerable:!0,writable:!0}):r[t]=(n=e[t])&&typeof n=="object"?Ce(n):n;return r}return e}function bn(e){return j(e[0])}function hn(e){return j(e[0])}var Ii=/[\w\u00A0-\uFFFF-_:%-?]/,Or="$$shortcut-no-merge";function xn(e=""){return Ii.test(e)}function yn(e){return typeof e=="function"?{match:e}:e}function Pr(e){return e.length===3}function vn(e){return e!=null}function $n(){}var rt=class{_map=new Map;get(t,r){let n=this._map.get(t);if(n)return n.get(r)}getFallback(t,r,n){let o=this._map.get(t);return o||(o=new Map,this._map.set(t,o)),o.has(r)||o.set(r,n),o.get(r)}set(t,r,n){let o=this._map.get(t);return o||(o=new Map,this._map.set(t,o)),o.set(r,n),this}has(t,r){return this._map.get(t)?.has(r)}delete(t,r){return this._map.get(t)?.delete(r)||!1}deleteTop(t){return this._map.delete(t)}map(t){return Array.from(this._map.entries()).flatMap(([r,n])=>Array.from(n.entries()).map(([o,a])=>t(a,r,o)))}};var nt={};function Ki(e=["-",":"]){let t=e.join("|");return nt[t]||(nt[t]=new RegExp(`((?:[!@<~\\w+:_/-]|\\[&?>?:?\\S*\\])+?)(${t})\\(((?:[~!<>\\w\\s:/\\\\,%#.$?-]|\\[.*?\\])+?)\\)(?!\\s*?=>)`,"gm")),nt[t].lastIndex=0,nt[t]}function qi(e,t=["-",":"],r=5){let n=Ki(t),o=!1,a=e.toString(),i=new Set;do{let c=a;a=a.replace(n,(l,p,f,u)=>t.includes(f)?(i.add(p+f),u.split(/\s/g).filter(Boolean).map(g=>g==="~"?p:g.replace(/^(!?)(.*)/,`$1${p}${f}$2`)).join(" ")):l),o=a!==c,r-=1}while(o&&r);return{prefixes:Array.from(i),expanded:a,hasChanged:o}}function kn(e,t=["-",":"],r=5){let{expanded:n}=qi(e.toString(),t,r);return typeof e=="string"?n:e.length()?e.overwrite(0,e.length(),n):e}var wn=new Set;function X(e){wn.has(e)||(console.warn("[unocss]",e),wn.add(e))}function ot(e){let t=function(n){let o=this.__options?.sequence||[];this.__options.sequence=[];for(let a of o){let i=e[a](n);if(i!=null)return i}};function r(n,o){return n.__options||(n.__options={sequence:[]}),n.__options.sequence.push(o),n}for(let n of Object.keys(e))Object.defineProperty(t,n,{enumerable:!0,get(){return r(this,n)}});return t}var at=/[\\:]?[\s'"`;{}]+/g;function Yi(e){return[...new Set(e.split(at))]}var it={name:"@unocss/core/extractor-split",order:0,extract({code:e}){return Yi(e)}};function Sn(){return{events:{},emit(e,...t){(this.events[e]||[]).forEach(r=>r(...t))},on(e,t){return(this.events[e]=this.events[e]||[]).push(t),()=>this.events[e]=(this.events[e]||[]).filter(r=>r!==t)}}}var st="default",ct="preflights",Xi="shortcuts",Cn={[ct]:-100,[Xi]:-10,[st]:0};function zn(e){return T(e).flatMap(t=>Array.isArray(t)?[t]:Object.entries(t))}var Rn="_uno_resolved";function Zi(e){if(Rn in e)return e;e={...e},Object.defineProperty(e,Rn,{value:!0,enumerable:!1});let t=e.shortcuts?zn(e.shortcuts):void 0;if(e.shortcuts=t,e.prefix||e.layer){let r=n=>{n[2]||(n[2]={});let o=n[2];o.prefix==null&&e.prefix&&(o.prefix=T(e.prefix)),o.layer==null&&e.layer&&(o.layer=e.layer)};t?.forEach(r),e.rules?.forEach(r)}return e}function Tn(e){let t=Zi(e);if(!t.presets)return[t];let r=(t.presets||[]).flatMap(T).flatMap(Tn);return[t,...r]}function _r(e={},t={}){let r=Object.assign({},t,e),n=ce((r.presets||[]).flatMap(T).flatMap(Tn)),o=[...n.filter(d=>d.enforce==="pre"),...n.filter(d=>!d.enforce),...n.filter(d=>d.enforce==="post")],a=[...o,r],i=[...a].reverse(),c=Object.assign({},Cn,...a.map(d=>d.layers));function l(d){return ce(a.flatMap($=>T($[d]||[])))}let p=l("extractors"),f=i.find(d=>d.extractorDefault!==void 0)?.extractorDefault;f===void 0&&(f=it),f&&!p.includes(f)&&p.unshift(f),p.sort((d,$)=>(d.order||0)-($.order||0));let u=l("rules"),g={},m=u.length,C=u.map((d,$)=>{if(bn(d)){T(d[2]?.prefix||"").forEach(D=>{g[D+d[0]]=[$,d[1],d[2],d]});return}return[$,...d]}).filter(Boolean).reverse(),V=a.map(d=>d.theme?Ce(d.theme):{}).reduce((d,$)=>Ar(d,$),{}),R=l("extendTheme");for(let d of R)V=d(V)||V;let O={templates:ce(a.flatMap(d=>T(d.autocomplete?.templates))),extractors:a.flatMap(d=>T(d.autocomplete?.extractors)).sort((d,$)=>(d.order||0)-($.order||0))},E=l("separators");E.length||(E=[":","-"]);let y={mergeSelectors:!0,warn:!0,blocklist:[],sortLayers:d=>d,...r,presets:o,envMode:r.envMode||"build",shortcutsLayer:r.shortcutsLayer||"shortcuts",layers:c,theme:V,rulesSize:m,rulesDynamic:C,rulesStaticMap:g,preprocess:l("preprocess"),postprocess:l("postprocess"),preflights:l("preflights"),autocomplete:O,variants:l("variants").map(yn).sort((d,$)=>(d.order||0)-($.order||0)),shortcuts:zn(l("shortcuts")).reverse(),extractors:p,safelist:l("safelist"),separators:E};for(let d of a)d?.configResolved?.(y);return y}var jn="0.52.3";var Mr=class{constructor(t={},r={}){this.userConfig=t;this.defaults=r;this.config=_r(t,r),this.events.emit("config",this.config)}version=jn;_cache=new Map;config;blocked=new Set;parentOrders=new Map;events=Sn();setConfig(t,r){t&&(r&&(this.defaults=r),this.userConfig=t,this.blocked.clear(),this.parentOrders.clear(),this._cache.clear(),this.config=_r(t,this.defaults),this.events.emit("config",this.config))}async applyExtractors(t,r,n=new Set){let o={original:t,code:t,id:r,extracted:n};for(let a of this.config.extractors){let i=await a.extract?.(o);if(i)for(let c of i)n.add(c)}return n}makeContext(t,r){let n={rawSelector:t,currentSelector:r[1],theme:this.config.theme,generator:this,variantHandlers:r[2],constructCSS:(...o)=>this.constructCustomCSS(n,...o),variantMatch:r};return n}async parseToken(t,r){if(this.blocked.has(t))return;let n=`${t}${r?` ${r}`:""}`;if(this._cache.has(n))return this._cache.get(n);let o=t;for(let p of this.config.preprocess)o=p(t);if(this.isBlocked(o)){this.blocked.add(t),this._cache.set(n,null);return}let a=await this.matchVariants(t,o);if(!a||this.isBlocked(a[1])){this.blocked.add(t),this._cache.set(n,null);return}let i=this.makeContext(t,[r||a[0],a[1],a[2],a[3]]);this.config.details&&(i.variants=[...a[3]]);let c=await this.expandShortcut(i.currentSelector,i),l=c?await this.stringifyShortcuts(i.variantMatch,i,c[0],c[1]):(await this.parseUtil(i.variantMatch,i))?.map(p=>this.stringifyUtil(p,i)).filter(vn);if(l?.length)return this._cache.set(n,l),l;this._cache.set(n,null)}async generate(t,r={}){let{id:n,scope:o,preflights:a=!0,safelist:i=!0,minify:c=!1}=r,l=j(t)?await this.applyExtractors(t,n):Array.isArray(t)?new Set(t):t;i&&this.config.safelist.forEach(y=>l.add(y));let p=c?"":` +`,f=new Set([st]),u=new Set,g=new Map,m={},C=Array.from(l).map(async y=>{if(u.has(y))return;let d=await this.parseToken(y);if(d!=null){u.add(y);for(let $ of d){let _=$[3]||"",D=$[4]?.layer;g.has(_)||g.set(_,[]),g.get(_).push($),D&&f.add(D)}}});await Promise.all(C),await(async()=>{if(!a)return;let y={generator:this,theme:this.config.theme},d=new Set([]);this.config.preflights.forEach(({layer:$=ct})=>{f.add($),d.add($)}),m=Object.fromEntries(await Promise.all(Array.from(d).map(async $=>{let D=(await Promise.all(this.config.preflights.filter(re=>(re.layer||ct)===$).map(async re=>await re.getCSS(y)))).filter(Boolean).join(p);return[$,D]})))})();let V=this.config.sortLayers(Array.from(f).sort((y,d)=>(this.config.layers[y]??0)-(this.config.layers[d]??0)||y.localeCompare(d))),R={},O=y=>{if(R[y])return R[y];let d=Array.from(g).sort((_,D)=>(this.parentOrders.get(_[0])??0)-(this.parentOrders.get(D[0])??0)||_[0]?.localeCompare(D[0]||"")||0).map(([_,D])=>{let re=D.length,me=D.filter(x=>(x[4]?.layer||st)===y).sort((x,w)=>x[0]-w[0]||(x[4]?.sort||0)-(w[4]?.sort||0)||x[5]?.currentSelector?.localeCompare(w[5]?.currentSelector??"")||x[1]?.localeCompare(w[1]||"")||x[2]?.localeCompare(w[2]||"")||0).map(([,x,w,,L,,H])=>[[[(x&&ts(x,o))??"",L?.sort??0]],w,!!(H??L?.noMerge)]);if(!me.length)return;let Qe=me.reverse().map(([x,w,L],H)=>{if(!L&&this.config.mergeSelectors)for(let oe=H+1;oeoe[1]-q[1]||oe[0]?.localeCompare(q[0]||"")||0).map(oe=>oe[0]).filter(Boolean)):[];return ne.length?`${ne.join(`,${p}`)}{${w}}`:w}).filter(Boolean).reverse().join(p);if(!_)return Qe;let v=_.split(" $$ ");return`${v.join("{")}{${p}${Qe}${p}}${v.map(x=>"").join("}")}`}).filter(Boolean).join(p);a&&(d=[m[y],d].filter(Boolean).join(p));let $=c?"":`/* layer: ${y} */${p}`;return R[y]=d?$+d:""},E=(y=V,d)=>y.filter($=>!d?.includes($)).map($=>O($)||"").filter(Boolean).join(p);return{get css(){return E()},layers:V,matched:u,getLayers:E,getLayer:O}}async matchVariants(t,r){let n=new Set,o=[],a=r||t,i=!1,c={rawSelector:t,theme:this.config.theme,generator:this};for(;;){i=!1;for(let l of this.config.variants){if(!l.multiPass&&n.has(l))continue;let p=await l.match(a,c);if(p){j(p)&&(p={matcher:p}),a=p.matcher,o.unshift(p),n.add(l),i=!0;break}}if(!i)break;if(o.length>500)throw new Error(`Too many variants applied to "${t}"`)}return[t,a,o,n]}applyVariants(t,r=t[4],n=t[1]){let a=r.slice().sort((p,f)=>(p.order||0)-(f.order||0)).reduceRight((p,f)=>u=>{let g=f.body?.(u.entries)||u.entries,m=Array.isArray(f.parent)?f.parent:[f.parent,void 0];return(f.handle??ns)({...u,entries:g,selector:f.selector?.(u.selector,g)||u.selector,parent:m[0]||u.parent,parentOrder:m[1]||u.parentOrder,layer:f.layer||u.layer,sort:f.sort||u.sort},p)},p=>p)({prefix:"",selector:rs(n),pseudo:"",entries:t[2]}),{parent:i,parentOrder:c}=a;i!=null&&c!=null&&this.parentOrders.set(i,c);let l={selector:[a.prefix,a.selector,a.pseudo].join(""),entries:a.entries,parent:i,layer:a.layer,sort:a.sort,noMerge:a.noMerge};for(let p of this.config.postprocess)p(l);return l}constructCustomCSS(t,r,n){let o=ge(r);if(j(o))return o;let{selector:a,entries:i,parent:c}=this.applyVariants([0,n||t.rawSelector,o,void 0,t.variantHandlers]),l=`${a}{${be(i)}}`;return c?`${c}{${l}}`:l}async parseUtil(t,r,n=!1,o){let[a,i,c]=j(t)?await this.matchVariants(t):t;this.config.details&&(r.rules=r.rules??[]);let l=this.config.rulesStaticMap[i];if(l&&l[1]&&(n||!l[2]?.internal)){this.config.details&&r.rules.push(l[3]);let f=l[0],u=ge(l[1]),g=l[2];return j(u)?[[f,u,g]]:[[f,a,u,g,c]]}r.variantHandlers=c;let{rulesDynamic:p}=this.config;for(let[f,u,g,m]of p){if(m?.internal&&!n)continue;let C=i;if(m?.prefix){let E=T(m.prefix);if(o){let y=T(o);if(!E.some(d=>y.includes(d)))continue}else{let y=E.find(d=>i.startsWith(d));if(y==null)continue;C=i.slice(y.length)}}let V=C.match(u);if(!V)continue;let R=await g(V,r);if(!R)continue;this.config.details&&r.rules.push([u,g,m]);let O=gn(R).filter(E=>E.length);if(O.length)return O.map(E=>j(E)?[f,E,m]:[f,a,E,m,c])}}stringifyUtil(t,r){if(!t)return;if(Pr(t))return[t[0],void 0,t[1],void 0,t[2],this.config.details?r:void 0,void 0];let{selector:n,entries:o,parent:a,layer:i,sort:c,noMerge:l}=this.applyVariants(t),p=be(o);if(!p)return;let{layer:f,sort:u,...g}=t[3]??{},m={...g,layer:i??f,sort:c??u};return[t[0],n,p,a,m,this.config.details?r:void 0,l]}async expandShortcut(t,r,n=5){if(n===0)return;let o=this.config.details?c=>{r.shortcuts=r.shortcuts??[],r.shortcuts.push(c)}:$n,a,i;for(let c of this.config.shortcuts){let l=t;if(c[2]?.prefix){let f=T(c[2].prefix).find(u=>t.startsWith(u));if(f==null)continue;l=t.slice(f.length)}if(hn(c)){if(c[0]===l){a=a||c[2],i=c[1],o(c);break}}else{let p=l.match(c[0]);if(p&&(i=c[1](p,r)),i){a=a||c[2],o(c);break}}}if(j(i)&&(i=kn(i.trim()).split(/\s+/g)),!i){let[c,l]=j(t)?await this.matchVariants(t):t;if(c!==l){let p=await this.expandShortcut(l,r,n-1);p&&(i=p[0].map(f=>j(f)?c.replace(l,f):f))}}if(i)return[(await Promise.all(i.map(async c=>(j(c)?(await this.expandShortcut(c,r,n-1))?.[0]:void 0)||[c]))).flat(1).filter(Boolean),a]}async stringifyShortcuts(t,r,n,o={layer:this.config.shortcutsLayer}){let a=new rt,i=(await Promise.all(ce(n).map(async f=>{let u=j(f)?await this.parseUtil(f,r,!0,o.prefix):[[1/0,"{inline}",ge(f),void 0,[]]];return u||X(`unmatched utility "${f}" in shortcut "${t[1]}"`),u||[]}))).flat(1).filter(Boolean).sort((f,u)=>f[0]-u[0]),[c,,l]=t,p=[];for(let f of i){if(Pr(f)){p.push([f[0],void 0,f[1],void 0,f[2],r,void 0]);continue}let{selector:u,entries:g,parent:m,sort:C,noMerge:V}=this.applyVariants(f,[...f[4],...l],c);a.getFallback(u,m,[[],f[0]])[0].push([g,!!(V??f[3]?.noMerge),C??0])}return p.concat(a.map(([f,u],g,m)=>{let C=(R,O,E)=>{let y=Math.max(...E.map($=>$[1])),d=E.map($=>$[0]);return(R?[d.flat(1)]:d).map($=>{let _=be($);if(_)return[u,g,_,m,{...o,noMerge:O,sort:y},r,void 0]})};return[[f.filter(([,R])=>R).map(([R,,O])=>[R,O]),!0],[f.filter(([,R])=>!R).map(([R,,O])=>[R,O]),!1]].map(([R,O])=>[...C(!1,O,R.filter(([E])=>E.some(y=>y[0]===Or))),...C(!0,O,R.filter(([E])=>E.every(y=>y[0]!==Or)))])}).flat(2).filter(Boolean))}isBlocked(t){return!t||this.config.blocklist.some(r=>j(r)?r===t:r.test(t))}};function Vn(e,t){return new Mr(e,t)}var Qi=/\s\$\$\s+/g;function es(e){return e.match(/\s\$\$\s/)}function ts(e,t){return es(e)?e.replace(Qi,t?` ${t} `:" "):t?`${t} ${e}`:e}var En=/^\[(.+?)(~?=)"(.*)"\]$/;function rs(e){return En.test(e)?e.replace(En,(t,r,n,o)=>`[${et(r)}${n}"${et(o)}"]`):`.${et(e)}`}function ns(e,t){return t(e)}var os=/(?:[\w&:[\]-]|\[\S+=\S+\])+\[\\?['"]?\S+?['"]\]\]?[\w:-]*/g,as=/\[(\\\W|[\w-])+:[^\s:]*?("\S+?"|'\S+?'|`\S+?`|[^\s:]+?)[^\s:]*?\)?\]/g,is=/^\[(\\\W|[\w-])+:['"]?\S+?['"]?\]$/;function ss(e){let t=new Set;for(let r of e.matchAll(as))e[r.index-1]?.match(/^[\s'"`]/)&&t.add(r[0]);for(let r of e.matchAll(os))t.add(r[0]);return e.split(at).forEach(r=>{xn(r)&&!is.test(r)&&t.add(r)}),[...t]}var An={name:"@unocss/extractor-arbitrary-variants",order:0,extract({code:e}){return ss(e)}};var On=[{layer:"preflights",getCSS(e){if(e.theme.preflightBase){let t=be(Object.entries(e.theme.preflightBase));return T(e.theme.preflightRoot??["*,::before,::after","::backdrop"]).map(n=>`${n}{${t}}`).join("")}}}];var F={l:["-left"],r:["-right"],t:["-top"],b:["-bottom"],s:["-inline-start"],e:["-inline-end"],x:["-left","-right"],y:["-top","-bottom"],"":[""],bs:["-block-start"],be:["-block-end"],is:["-inline-start"],ie:["-inline-end"],block:["-block-start","-block-end"],inline:["-inline-start","-inline-end"]},Ur={...F,s:["-inset-inline-start"],start:["-inset-inline-start"],e:["-inset-inline-end"],end:["-inset-inline-end"],bs:["-inset-block-start"],be:["-inset-block-end"],is:["-inset-inline-start"],ie:["-inset-inline-end"],block:["-inset-block-start","-inset-block-end"],inline:["-inset-inline-start","-inset-inline-end"]},Fr={l:["-top-left","-bottom-left"],r:["-top-right","-bottom-right"],t:["-top-left","-top-right"],b:["-bottom-left","-bottom-right"],tl:["-top-left"],lt:["-top-left"],tr:["-top-right"],rt:["-top-right"],bl:["-bottom-left"],lb:["-bottom-left"],br:["-bottom-right"],rb:["-bottom-right"],"":[""],bs:["-start-start","-start-end"],be:["-end-start","-end-end"],s:["-end-start","-start-start"],is:["-end-start","-start-start"],e:["-start-end","-end-end"],ie:["-start-end","-end-end"],ss:["-start-start"],"bs-is":["-start-start"],"is-bs":["-start-start"],se:["-start-end"],"bs-ie":["-start-end"],"ie-bs":["-start-end"],es:["-end-start"],"be-is":["-end-start"],"is-be":["-end-start"],ee:["-end-end"],"be-ie":["-end-end"],"ie-be":["-end-end"]},lt={x:["-x"],y:["-y"],z:["-z"],"":["-x","-y"]},Pn=["top","top center","top left","top right","bottom","bottom center","bottom left","bottom right","left","left center","left top","left bottom","right","right center","right top","right bottom","center","center top","center bottom","center left","center right","center center"],M=Object.assign({},...Pn.map(e=>({[e.replace(/ /,"-")]:e})),...Pn.map(e=>({[e.replace(/\b(\w)\w+/g,"$1").replace(/ /,"")]:e}))),k=["inherit","initial","revert","revert-layer","unset"];var _n={mid:"middle",base:"baseline",btm:"bottom",baseline:"baseline",top:"top",start:"top",middle:"middle",bottom:"bottom",end:"bottom","text-top":"text-top","text-bottom":"text-bottom",sub:"sub",super:"super",...Object.fromEntries(k.map(e=>[e,e]))},pt=[[/^(?:vertical|align|v)-([-\w]+)$/,([,e])=>({"vertical-align":_n[e]}),{autocomplete:`(vertical|align|v)-(${Object.keys(_n).join("|")})`}]],ft=["center","left","right","justify","start","end"].map(e=>[`text-${e}`,{"text-align":e}]);var Lr={};Hi(Lr,{auto:()=>ps,bracket:()=>hs,bracketOfColor:()=>xs,bracketOfLength:()=>ys,bracketOfPosition:()=>vs,cssvar:()=>$s,degree:()=>ws,fraction:()=>gs,global:()=>Ss,number:()=>ds,numberWithUnit:()=>ls,percent:()=>ms,position:()=>Rs,properties:()=>Cs,px:()=>us,rem:()=>fs,time:()=>ks});var he=/^(-?\d*(?:\.\d+)?)(px|pt|pc|%|r?(?:em|ex|lh|cap|ch|ic)|(?:[sld]?v|cq)(?:[whib]|min|max)|in|cm|mm|rpx)?$/i,Wr=/^(-?\d*(?:\.\d+)?)$/i,Dr=/^(px)$/i;var cs=["color","border-color","background-color","flex-grow","flex","flex-shrink","caret-color","font","gap","opacity","visibility","z-index","font-weight","zoom","text-shadow","transform","box-shadow","background-position","left","right","top","bottom","object-position","max-height","min-height","max-width","min-width","height","width","border-width","margin","padding","outline-width","outline-offset","font-size","line-height","text-indent","vertical-align","border-spacing","letter-spacing","word-spacing","stroke","filter","backdrop-filter","fill","mask","mask-size","mask-border","clip-path","clip","border-radius"];function G(e){return e.toFixed(10).replace(/\.0+$/,"").replace(/(\.\d+?)0+$/,"$1")}function ls(e){let t=e.match(he);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(n&&!Number.isNaN(o))return`${G(o)}${n}`}function ps(e){if(e==="auto"||e==="a")return"auto"}function fs(e){if(e.match(Dr))return`1${e}`;let t=e.match(he);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${G(o)}${n}`:`${G(o/4)}rem`}function us(e){if(e.match(Dr))return`1${e}`;let t=e.match(he);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${G(o)}${n}`:`${G(o)}px`}function ds(e){if(!Wr.test(e))return;let t=parseFloat(e);if(!Number.isNaN(t))return G(t)}function ms(e){if(e.endsWith("%")&&(e=e.slice(0,-1)),!Wr.test(e))return;let t=parseFloat(e);if(!Number.isNaN(t))return`${G(t/100)}`}function gs(e){if(e==="full")return"100%";let[t,r]=e.split("/"),n=parseFloat(t)/parseFloat(r);if(!Number.isNaN(n))return n===0?"0":`${G(n*100)}%`}var bs=/^\[(color|length|position|quoted|string):/i;function ut(e,t){if(e&&e.startsWith("[")&&e.endsWith("]")){let r,n,o=e.match(bs);if(o?(t||(n=o[1]),r=e.slice(o[0].length,-1)):r=e.slice(1,-1),!r||r==='=""')return;r.startsWith("--")&&(r=`var(${r})`);let a=0;for(let i of r)if(i==="[")a+=1;else if(i==="]"&&(a-=1,a<0))return;if(a)return;switch(n){case"string":return r.replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_");case"quoted":return r.replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_").replace(/(["\\])/g,"\\$1").replace(/^(.+)$/,'"$1"')}return r.replace(/(url\(.*?\))/g,i=>i.replace(/_/g,"\\_")).replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_").replace(/(?:calc|clamp|max|min)\((.*)/g,i=>{let c=[];return i.replace(/var\((--.+?)[,)]/g,(l,p)=>(c.push(p),l.replace(p,"--un-calc"))).replace(/(-?\d*\.?\d(?!\b-\d.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g,"$1 $2 ").replace(/--un-calc/g,()=>c.shift())})}}function hs(e){return ut(e)}function xs(e){return ut(e,"color")}function ys(e){return ut(e,"length")}function vs(e){return ut(e,"position")}function $s(e){if(e.match(/^\$\S/))return`var(--${ae(e.slice(1))})`}function ks(e){let t=e.match(/^(-?[0-9.]+)(s|ms)?$/i);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0&&!n?"0s":n?`${G(o)}${n}`:`${G(o)}ms`}function ws(e){let t=e.match(/^(-?[0-9.]+)(deg|rad|grad|turn)?$/i);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${G(o)}${n}`:`${G(o)}deg`}function Ss(e){if(k.includes(e))return e}function Cs(e){if(e.split(",").every(t=>cs.includes(t)))return e}function Rs(e){if(["top","left","right","bottom","center"].includes(e))return e}var s=ot(Lr);var Mn="$$mini-no-negative";function A(e){return([t,r,n],{theme:o})=>{let a=o.spacing?.[n||"DEFAULT"]??s.bracket.cssvar.global.auto.fraction.rem(n);if(a!=null)return F[r].map(i=>[`${e}${i}`,a])}}function dt(e,t){let r=e.colors,n=-1;for(let o of t){if(n+=1,r&&typeof r!="string"){let a=t.slice(n).join("-").replace(/(-[a-z])/g,i=>i.slice(1).toUpperCase());if(r[a])return r[a];if(r[o]){r=r[o];continue}}return}return r}function Br(e,t){let r=e.split(/(?:\/|:)/);return r[0]===`[${t}`?[r.slice(0,2).join(":"),r[2]]:r}function xe(e,t){let[r,n]=Br(e,"color"),o=r.replace(/([a-z])([0-9])/g,"$1-$2").split(/-/g),[a]=o;if(!a)return;let i,c=s.bracketOfColor(r),l=c||r;if(s.numberWithUnit(l))return;if(l.match(/^#[\da-fA-F]+/g)?i=l:l.match(/^hex-[\da-fA-F]+/g)?i=`#${l.slice(4)}`:r.startsWith("$")&&(i=s.cssvar(r)),i=i||c,!i){let f=dt(t,[r]);typeof f=="string"&&(i=f)}let p="DEFAULT";if(!i){let f,[u]=o.slice(-1);u.match(/^\d+$/)?(p=u,f=dt(t,o.slice(0,-1)),!f||typeof f=="string"?i=void 0:i=f[p]):(f=dt(t,o),!f&&o.length<=2&&([,p=p]=o,f=dt(t,[a])),typeof f=="string"?i=f:p&&f&&(i=f[p]))}return{opacity:n,name:a,no:p,color:i,cssColor:$e(i),alpha:s.bracket.cssvar.percent(n??"")}}function z(e,t,r){return([,n],{theme:o})=>{let a=xe(n,o);if(!a)return;let{alpha:i,color:c,cssColor:l}=a,p={};if(l?i!=null?p[e]=U(l,i):(p[`--un-${t}-opacity`]=pe(l),p[e]=U(l,`var(--un-${t}-opacity)`)):c&&(p[e]=U(c,i)),r?.(p)!==!1)return p}}function ye(e,t){let r=[];e=T(e);for(let n=0;n[`${e}-${r}`,{[t??e]:r}])}function mt(e,t,r){if(e==="")return;let n=e.length,o=0,a=!1,i=0;for(let c=0;cr)return;let a=Nr(e,"(",")",t);if(!a)return;let[i,c]=a;n.push(i),e=c}if(n.length>0)return n}var Hr=["hsl","hsla","hwb","lab","lch","oklab","oklch","rgb","rgba"],Fn=["%alpha",""],zs=new RegExp(Fn.map(e=>Y(e)).join("|"));function $e(e=""){let t=Ts(e);if(t==null||t===!1)return;let{type:r,components:n,alpha:o}=t,a=r.toLowerCase();if(n.length!==0&&!(["rgba","hsla"].includes(a)&&o==null)&&!(Hr.includes(a)&&![1,3].includes(n.length)))return{type:a,components:n.map(i=>typeof i=="string"?i.trim():i),alpha:typeof o=="string"?o.trim():o}}function pe(e){let t=e.alpha??1;return typeof t=="string"&&Fn.includes(t)?1:t}function U(e,t){if(typeof e=="string")return e.replace(zs,`${t??1}`);let{components:r}=e,{alpha:n,type:o}=e;return n=t??n,o=o.toLowerCase(),["hsla","hsl","rgba","rgb"].includes(o)?`${o.replace("a","")}a(${r.join(",")}${n==null?"":`,${n}`})`:(n=n==null?"":` / ${n}`,Hr.includes(o)?`${o}(${r.join(" ")}${n})`:`color(${o} ${r.join(" ")}${n})`)}function Ts(e){if(!e)return;let t=js(e);if(t!=null||(t=Es(e),t!=null)||(t=Vs(e),t!=null)||(t=Os(e),t!=null)||(t=Ps(e),t!=null))return t}function js(e){let[,t]=e.match(/^#([\da-f]+)$/i)||[];if(t)switch(t.length){case 3:case 4:let r=Array.from(t,o=>Number.parseInt(o,16)).map(o=>o<<4|o);return{type:"rgb",components:r.slice(0,3),alpha:t.length===3?void 0:Math.round(r[3]/255*100)/100};case 6:case 8:let n=Number.parseInt(t,16);return{type:"rgb",components:t.length===6?[n>>16&255,n>>8&255,n&255]:[n>>24&255,n>>16&255,n>>8&255],alpha:t.length===6?void 0:Math.round((n&255)/255*100)/100}}}function Es(e){let t={rebeccapurple:[102,51,153,1]}[e];if(t!=null)return{type:"rgb",components:t.slice(0,3),alpha:t[3]}}function Vs(e){let t=e.match(/^(rgb|rgba|hsl|hsla)\((.+)\)$/i);if(!t)return;let[,r,n]=t,o=Re(n,",",5);if(o){if([3,4].includes(o.length))return{type:r,components:o.slice(0,3),alpha:o[3]};if(o.length!==1)return!1}}var As=new RegExp(`^(${Hr.join("|")})\\((.+)\\)$`,"i");function Os(e){let t=e.match(As);if(!t)return;let[,r,n]=t,o=Wn(`${r} ${n}`);if(o){let{alpha:a,components:[i,...c]}=o;return{type:i,components:c,alpha:a}}}function Ps(e){let t=e.match(/^color\((.+)\)$/);if(!t)return;let r=Wn(t[1]);if(r){let{alpha:n,components:[o,...a]}=r;return{type:o,components:a,alpha:n}}}function Wn(e){let t=Re(e," ");if(!t)return;let r=t.length;if(t[r-2]==="/")return{components:t.slice(0,r-2),alpha:t[r-1]};if(t[r-2]!=null&&(t[r-2].endsWith("/")||t[r-1].startsWith("/"))){let a=t.splice(r-2);t.push(a.join(" ")),--r}let n=Re(t[r-1],"/",2);if(!n)return;if(n.length===1||n[n.length-1]==="")return{components:t};let o=n.pop();return t[r-1]=n.join("/"),{components:t,alpha:o}}function N(e,t){let r;return{name:e,match(n,o){r||(r=new RegExp(`^${Y(e)}(?:${o.generator.config.separators.join("|")})`));let a=n.match(r);if(a)return{matcher:n.slice(a[0].length),handle:(i,c)=>c({...i,...t(i)})}},autocomplete:`${e}:`}}function W(e,t){let r;return{name:e,match(n,o){r||(r=new RegExp(`^${Y(e)}(?:${o.generator.config.separators.join("|")})`));let a=n.match(r);if(a)return{matcher:n.slice(a[0].length),handle:(i,c)=>c({...i,parent:`${i.parent?`${i.parent} $$ `:""}${t}`})}},autocomplete:`${e}:`}}function ie(e,t,r){if(t.startsWith(`${e}[`)){let[n,o]=mt(t.slice(e.length),"[","]")??[];if(n&&o){for(let a of r)if(o.startsWith(a))return[n,o.slice(a.length),a];return[n,o,""]}}}function B(e,t,r){if(t.startsWith(e)){let n=ie(e,t,r);if(n){let[o="",a=n[1]]=B("/",n[1],r)??[];return[n[0],a,o]}for(let o of r.filter(a=>a!=="/")){let a=t.indexOf(o,e.length);if(a!==-1){let i=t.indexOf("/",e.length),c=i===-1||a<=i;return[t.slice(e.length,c?a:i),t.slice(a+o.length),c?"":t.slice(i+1,a)]}}}}var gt=[[/^outline-(?:width-|size-)?(.+)$/,([,e],{theme:t})=>({"outline-width":t.lineWidth?.[e]??s.bracket.cssvar.global.px(e)}),{autocomplete:"outline-(width|size)-"}],[/^outline-(?:color-)?(.+)$/,z("outline-color","outline-color"),{autocomplete:"outline-$colors"}],[/^outline-offset-(.+)$/,([,e],{theme:t})=>({"outline-offset":t.lineWidth?.[e]??s.bracket.cssvar.global.px(e)}),{autocomplete:"outline-(offset)-"}],["outline",{"outline-style":"solid"}],...["auto","dashed","dotted","double","hidden","solid","groove","ridge","inset","outset",...k].map(e=>[`outline-${e}`,{"outline-style":e}]),["outline-none",{outline:"2px solid transparent","outline-offset":"2px"}]],bt=[["appearance-none",{"-webkit-appearance":"none",appearance:"none"}]];function _s(e){return s.properties.auto.global(e)??{contents:"contents",scroll:"scroll-position"}[e]}var ht=[[/^will-change-(.+)/,([,e])=>({"will-change":_s(e)})]];var fe=["solid","dashed","dotted","double","hidden","none","groove","ridge","inset","outset",...k],xt=[[/^(?:border|b)()(?:-(.+))?$/,ze,{autocomplete:"(border|b)-"}],[/^(?:border|b)-([xy])(?:-(.+))?$/,ze],[/^(?:border|b)-([rltbse])(?:-(.+))?$/,ze],[/^(?:border|b)-(block|inline)(?:-(.+))?$/,ze],[/^(?:border|b)-([bi][se])(?:-(.+))?$/,ze],[/^(?:border|b)-()(?:width|size)-(.+)$/,ke,{autocomplete:["(border|b)-","(border|b)--"]}],[/^(?:border|b)-([xy])-(?:width|size)-(.+)$/,ke],[/^(?:border|b)-([rltbse])-(?:width|size)-(.+)$/,ke],[/^(?:border|b)-(block|inline)-(?:width|size)-(.+)$/,ke],[/^(?:border|b)-([bi][se])-(?:width|size)-(.+)$/,ke],[/^(?:border|b)-()(?:color-)?(.+)$/,Te,{autocomplete:["(border|b)-$colors","(border|b)--$colors"]}],[/^(?:border|b)-([xy])-(?:color-)?(.+)$/,Te],[/^(?:border|b)-([rltbse])-(?:color-)?(.+)$/,Te],[/^(?:border|b)-(block|inline)-(?:color-)?(.+)$/,Te],[/^(?:border|b)-([bi][se])-(?:color-)?(.+)$/,Te],[/^(?:border|b)-()op(?:acity)?-?(.+)$/,je,{autocomplete:"(border|b)-(op|opacity)-"}],[/^(?:border|b)-([xy])-op(?:acity)?-?(.+)$/,je],[/^(?:border|b)-([rltbse])-op(?:acity)?-?(.+)$/,je],[/^(?:border|b)-(block|inline)-op(?:acity)?-?(.+)$/,je],[/^(?:border|b)-([bi][se])-op(?:acity)?-?(.+)$/,je],[/^(?:border-|b-)?(?:rounded|rd)()(?:-(.+))?$/,Ee,{autocomplete:["(border|b)-(rounded|rd)","(border|b)-(rounded|rd)-","(rounded|rd)","(rounded|rd)-"]}],[/^(?:border-|b-)?(?:rounded|rd)-([rltbse])(?:-(.+))?$/,Ee],[/^(?:border-|b-)?(?:rounded|rd)-([rltb]{2})(?:-(.+))?$/,Ee],[/^(?:border-|b-)?(?:rounded|rd)-([bise][se])(?:-(.+))?$/,Ee],[/^(?:border-|b-)?(?:rounded|rd)-([bi][se]-[bi][se])(?:-(.+))?$/,Ee],[/^(?:border|b)-(?:style-)?()(.+)$/,Ve,{autocomplete:["(border|b)-style",`(border|b)-(${fe.join("|")})`,"(border|b)--style",`(border|b)--(${fe.join("|")})`,`(border|b)--style-(${fe.join("|")})`,`(border|b)-style-(${fe.join("|")})`]}],[/^(?:border|b)-([xy])-(?:style-)?(.+)$/,Ve],[/^(?:border|b)-([rltbse])-(?:style-)?(.+)$/,Ve],[/^(?:border|b)-(block|inline)-(?:style-)?(.+)$/,Ve],[/^(?:border|b)-([bi][se])-(?:style-)?(.+)$/,Ve]];function Ms(e){return([,t],r)=>{let n=xe(t,r);if(!n)return;let{alpha:o,color:a,cssColor:i}=n;if(i)return o!=null?{[`border${e}-color`]:U(i,o)}:e===""?{"--un-border-opacity":pe(i),"border-color":U(i,"var(--un-border-opacity)")}:{"--un-border-opacity":pe(i),[`--un-border${e}-opacity`]:"var(--un-border-opacity)",[`border${e}-color`]:U(i,`var(--un-border${e}-opacity)`)};if(a)return{[`border${e}-color`]:U(a,o)}}}function ze(e,t){return ke(e,t)}function ke([,e="",t],{theme:r}){let n=r.lineWidth?.[t||"DEFAULT"]??s.bracket.cssvar.global.px(t||"1");if(e in F&&n!=null)return F[e].map(o=>[`border${o}-width`,n])}function Te([,e="",t],{theme:r}){if(e in F&&ve(t,r))return Object.assign({},...F[e].map(n=>Ms(n)(["",t],r)))}function je([,e="",t]){let r=s.bracket.percent.cssvar(t);if(e in F&&r!=null)return F[e].map(n=>[`--un-border${n}-opacity`,r])}function Ee([,e="",t],{theme:r}){let n=r.borderRadius?.[t||"DEFAULT"]||s.bracket.cssvar.global.fraction.rem(t||"1");if(e in Fr&&n!=null)return Fr[e].map(o=>[`border${o}-radius`,n])}function Ve([,e="",t]){if(fe.includes(t)&&e in F)return F[e].map(r=>[`border${r}-style`,t])}var yt=[[/^op(?:acity)?-?(.+)$/,([,e])=>({opacity:s.bracket.percent.cssvar(e)})]],vt=[[/^(?:color|c)-(.+)$/,z("color","text"),{autocomplete:"(color|c)-$colors"}],[/^text-(.+)$/,z("color","text",e=>!e.color?.toString().match(he)),{autocomplete:"text-$colors"}],[/^(?:text|color|c)-(.+)$/,([,e])=>k.includes(e)?{color:e}:void 0,{autocomplete:`(text|color|c)-(${k.join("|")})`}],[/^(?:text|color|c)-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"(text|color|c)-(op|opacity)-"}]],$t=[[/^bg-(.+)$/,z("background-color","bg"),{autocomplete:"bg-$colors"}],[/^bg-op(?:acity)?-?(.+)$/,([,e])=>({"--un-bg-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"bg-(op|opacity)-"}]];var kt=[[/^@container(?:\/(\w+))?(?:-(normal))?$/,([,e,t])=>(X("The container query rule is experimental and may not follow semver."),{"container-type":t??"inline-size","container-name":e})]];var Dn=["solid","double","dotted","dashed","wavy",...k],wt=[[/^(?:decoration-)?(underline|overline|line-through)$/,([,e])=>({"text-decoration-line":e}),{autocomplete:"decoration-(underline|overline|line-through)"}],[/^(?:underline|decoration)-(?:size-)?(.+)$/,([,e],{theme:t})=>({"text-decoration-thickness":t.lineWidth?.[e]??s.bracket.cssvar.global.px(e)}),{autocomplete:"(underline|decoration)-"}],[/^(?:underline|decoration)-(auto|from-font)$/,([,e])=>({"text-decoration-thickness":e}),{autocomplete:"(underline|decoration)-(auto|from-font)"}],[/^(?:underline|decoration)-(.+)$/,(e,t)=>{let r=z("text-decoration-color","line")(e,t);if(r)return{"-webkit-text-decoration-color":r["text-decoration-color"],...r}},{autocomplete:"(underline|decoration)-$colors"}],[/^(?:underline|decoration)-op(?:acity)?-?(.+)$/,([,e])=>({"--un-line-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"(underline|decoration)-(op|opacity)-"}],[/^(?:underline|decoration)-offset-(.+)$/,([,e],{theme:t})=>({"text-underline-offset":t.lineWidth?.[e]??s.auto.bracket.cssvar.global.px(e)}),{autocomplete:"(underline|decoration)-(offset)-"}],...Dn.map(e=>[`underline-${e}`,{"text-decoration-style":e}]),...Dn.map(e=>[`decoration-${e}`,{"text-decoration-style":e}]),["no-underline",{"text-decoration":"none"}],["decoration-none",{"text-decoration":"none"}]];var St={all:"all",colors:["color","background-color","border-color","outline-color","text-decoration-color","fill","stroke"].join(","),none:"none",opacity:"opacity",shadow:"box-shadow",transform:"transform"};function Ln(e){return s.properties(e)??St[e]}var Ct=[[/^transition(?:-([a-z-]+(?:,[a-z-]+)*))?(?:-(\d+))?$/,([,e,t],{theme:r})=>{let n=e!=null?Ln(e):[St.colors,"opacity","box-shadow","transform","filter","backdrop-filter"].join(",");if(n){let o=r.duration?.[t||"DEFAULT"]??s.time(t||"150");return{"transition-property":n,"transition-timing-function":"cubic-bezier(0.4, 0, 0.2, 1)","transition-duration":o}}},{autocomplete:`transition-(${Object.keys(St).join("|")})`}],[/^(?:transition-)?duration-(.+)$/,([,e],{theme:t})=>({"transition-duration":t.duration?.[e||"DEFAULT"]??s.bracket.cssvar.time(e)}),{autocomplete:["transition-duration-$duration","duration-$duration"]}],[/^(?:transition-)?delay-(.+)$/,([,e],{theme:t})=>({"transition-delay":t.duration?.[e||"DEFAULT"]??s.bracket.cssvar.time(e)}),{autocomplete:["transition-delay-$duration","delay-$duration"]}],[/^(?:transition-)?ease(?:-(.+))?$/,([,e],{theme:t})=>({"transition-timing-function":t.easing?.[e||"DEFAULT"]??s.bracket.cssvar(e)}),{autocomplete:["transition-ease-(linear|in|out|in-out|DEFAULT)","ease-(linear|in|out|in-out|DEFAULT)"]}],[/^(?:transition-)?property-(.+)$/,([,e])=>({"transition-property":s.bracket.global(e)||Ln(e)}),{autocomplete:[`transition-property-(${[...k,...Object.keys(St)].join("|")})`]}],["transition-none",{transition:"none"}],...h("transition")];var Rt=[["flex",{display:"flex"}],["inline-flex",{display:"inline-flex"}],["flex-inline",{display:"inline-flex"}],[/^flex-(.*)$/,([,e])=>({flex:s.bracket(e)!=null?s.bracket(e).split(" ").map(t=>s.cssvar.fraction(t)??t).join(" "):s.cssvar.fraction(e)})],["flex-1",{flex:"1 1 0%"}],["flex-auto",{flex:"1 1 auto"}],["flex-initial",{flex:"0 1 auto"}],["flex-none",{flex:"none"}],[/^(?:flex-)?shrink(?:-(.*))?$/,([,e=""])=>({"flex-shrink":s.bracket.cssvar.number(e)??1}),{autocomplete:["flex-shrink-","shrink-"]}],[/^(?:flex-)?grow(?:-(.*))?$/,([,e=""])=>({"flex-grow":s.bracket.cssvar.number(e)??1}),{autocomplete:["flex-grow-","grow-"]}],[/^(?:flex-)?basis-(.+)$/,([,e],{theme:t})=>({"flex-basis":t.spacing?.[e]??s.bracket.cssvar.auto.fraction.rem(e)}),{autocomplete:["flex-basis-$spacing","basis-$spacing"]}],["flex-row",{"flex-direction":"row"}],["flex-row-reverse",{"flex-direction":"row-reverse"}],["flex-col",{"flex-direction":"column"}],["flex-col-reverse",{"flex-direction":"column-reverse"}],["flex-wrap",{"flex-wrap":"wrap"}],["flex-wrap-reverse",{"flex-wrap":"wrap-reverse"}],["flex-nowrap",{"flex-wrap":"nowrap"}]];var Bn={thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"};function Nn(e,t){return t.lineHeight?.[e]||s.bracket.cssvar.global.rem(e)}var zt=[[/^font-(.+)$/,([,e],{theme:t})=>({"font-family":t.fontFamily?.[e]||s.bracket.cssvar.global(e)}),{autocomplete:"font-$fontFamily"}],[/^text-(.+)$/,([,e="base"],{theme:t})=>{let[r,n]=Br(e,"length"),o=T(t.fontSize?.[r]),a=n?Nn(n,t):void 0;if(o?.[0]){let[c,l]=o;return{"font-size":c,"line-height":a??l??"1"}}let i=s.bracketOfLength.rem(r);return a&&i?{"font-size":i,"line-height":a}:{"font-size":s.bracketOfLength.rem(e)}},{autocomplete:"text-$fontSize"}],[/^text-size-(.+)$/,([,e],{theme:t})=>{let n=T(t.fontSize?.[e])?.[0]??s.bracket.cssvar.global.rem(e);if(n!=null)return{"font-size":n}},{autocomplete:"text-size-$fontSize"}],[/^(?:font|fw)-?([^-]+)$/,([,e])=>({"font-weight":Bn[e]||s.bracket.global.number(e)}),{autocomplete:`(font|fw)-(100|200|300|400|500|600|700|800|900|${Object.keys(Bn).join("|")})`}],[/^(?:font-)?(?:leading|lh|line-height)-(.+)$/,([,e],{theme:t})=>({"line-height":Nn(e,t)}),{autocomplete:"(leading|lh|line-height)-$lineHeight"}],["font-synthesis-weight",{"font-synthesis":"weight"}],["font-synthesis-style",{"font-synthesis":"style"}],["font-synthesis-small-caps",{"font-synthesis":"small-caps"}],["font-synthesis-none",{"font-synthesis":"none"}],[/^font-synthesis-(.+)$/,([,e])=>({"font-synthesis":s.bracket.cssvar.global(e)})],[/^(?:font-)?tracking-(.+)$/,([,e],{theme:t})=>({"letter-spacing":t.letterSpacing?.[e]||s.bracket.cssvar.global.rem(e)}),{autocomplete:"tracking-$letterSpacing"}],[/^(?:font-)?word-spacing-(.+)$/,([,e],{theme:t})=>({"word-spacing":t.wordSpacing?.[e]||s.bracket.cssvar.global.rem(e)}),{autocomplete:"word-spacing-$wordSpacing"}]],Tt=[[/^tab(?:-(.+))?$/,([,e])=>{let t=s.bracket.cssvar.global.number(e||"4");if(t!=null)return{"-moz-tab-size":t,"-o-tab-size":t,"tab-size":t}}]],jt=[[/^indent(?:-(.+))?$/,([,e],{theme:t})=>({"text-indent":t.textIndent?.[e||"DEFAULT"]||s.bracket.cssvar.global.fraction.rem(e)}),{autocomplete:"indent-$textIndent"}]],Et=[[/^text-stroke(?:-(.+))?$/,([,e],{theme:t})=>({"-webkit-text-stroke-width":t.textStrokeWidth?.[e||"DEFAULT"]||s.bracket.cssvar.px(e)}),{autocomplete:"text-stroke-$textStrokeWidth"}],[/^text-stroke-(.+)$/,z("-webkit-text-stroke-color","text-stroke"),{autocomplete:"text-stroke-$colors"}],[/^text-stroke-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-stroke-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"text-stroke-(op|opacity)-"}]],Vt=[[/^text-shadow(?:-(.+))?$/,([,e],{theme:t})=>{let r=t.textShadow?.[e||"DEFAULT"];return r!=null?{"--un-text-shadow":ye(r,"--un-text-shadow-color").join(","),"text-shadow":"var(--un-text-shadow)"}:{"text-shadow":s.bracket.cssvar.global(e)}},{autocomplete:"text-shadow-$textShadow"}],[/^text-shadow-color-(.+)$/,z("--un-text-shadow-color","text-shadow"),{autocomplete:"text-shadow-color-$colors"}],[/^text-shadow-color-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-shadow-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"text-shadow-color-(op|opacity)-"}]];var Hn={"":"",x:"column-",y:"row-"};function Gn([,e="",t],{theme:r}){let n=r.spacing?.[t]??s.bracket.cssvar.global.rem(t);if(n!=null)return{[`grid-${Hn[e]}gap`]:n,[`${Hn[e]}gap`]:n}}var At=[[/^(?:flex-|grid-)?gap-?()(.+)$/,Gn,{autocomplete:["gap-$spacing","gap-"]}],[/^(?:flex-|grid-)?gap-([xy])-?(.+)$/,Gn,{autocomplete:["gap-(x|y)-$spacing","gap-(x|y)-"]}]];function Z(e){return e.replace("col","column")}function Gr(e){return e[0]==="r"?"Row":"Column"}function Us(e,t,r){let n=t[`gridAuto${Gr(e)}`]?.[r];if(n!=null)return n;switch(r){case"min":return"min-content";case"max":return"max-content";case"fr":return"minmax(0,1fr)"}return s.bracket.cssvar.auto.rem(r)}var Ot=[["grid",{display:"grid"}],["inline-grid",{display:"inline-grid"}],[/^(?:grid-)?(row|col)-(.+)$/,([,e,t],{theme:r})=>({[`grid-${Z(e)}`]:r[`grid${Gr(e)}`]?.[t]??s.bracket.cssvar.auto(t)})],[/^(?:grid-)?(row|col)-span-(.+)$/,([,e,t])=>{if(t==="full")return{[`grid-${Z(e)}`]:"1/-1"};let r=s.bracket.number(t);if(r!=null)return{[`grid-${Z(e)}`]:`span ${r}/span ${r}`}},{autocomplete:["grid-(row|col)-span-","(row|col)-span-"]}],[/^(?:grid-)?(row|col)-start-(.+)$/,([,e,t])=>({[`grid-${Z(e)}-start`]:s.bracket.cssvar(t)??t})],[/^(?:grid-)?(row|col)-end-(.+)$/,([,e,t])=>({[`grid-${Z(e)}-end`]:s.bracket.cssvar(t)??t}),{autocomplete:["grid-(row|col)-(start|end)-"]}],[/^(?:grid-)?auto-(rows|cols)-(.+)$/,([,e,t],{theme:r})=>({[`grid-auto-${Z(e)}`]:Us(e,r,t)}),{autocomplete:["grid-auto-(rows|cols)-"]}],[/^(?:grid-auto-flow|auto-flow|grid-flow)-(.+)$/,([,e])=>({"grid-auto-flow":s.bracket.cssvar(e)})],[/^(?:grid-auto-flow|auto-flow|grid-flow)-(row|col|dense|row-dense|col-dense)$/,([,e])=>({"grid-auto-flow":Z(e).replace("-"," ")}),{autocomplete:["(grid-auto-flow|auto-flow|grid-flow)-(row|col|dense|row-dense|col-dense)"]}],[/^grid-(rows|cols)-(.+)$/,([,e,t],{theme:r})=>({[`grid-template-${Z(e)}`]:r[`gridTemplate${Gr(e)}`]?.[t]??s.bracket.cssvar(t)})],[/^grid-(rows|cols)-minmax-([\w.-]+)$/,([,e,t])=>({[`grid-template-${Z(e)}`]:`repeat(auto-fill,minmax(${t},1fr))`})],[/^grid-(rows|cols)-(\d+)$/,([,e,t])=>({[`grid-template-${Z(e)}`]:`repeat(${t},minmax(0,1fr))`}),{autocomplete:["grid-(rows|cols)-","grid-(rows|cols)-none"]}],[/^grid-area(s)?-(.+)$/,([,e,t])=>e!=null?{"grid-template-areas":s.cssvar(t)??t.split("-").map(r=>`"${s.bracket(r)}"`).join(" ")}:{"grid-area":s.bracket.cssvar(t)}],["grid-rows-none",{"grid-template-rows":"none"}],["grid-cols-none",{"grid-template-columns":"none"}]];var Pt=["auto","hidden","clip","visible","scroll","overlay",...k],_t=[[/^(?:overflow|of)-(.+)$/,([,e])=>Pt.includes(e)?{overflow:e}:void 0,{autocomplete:[`(overflow|of)-(${Pt.join("|")})`,`(overflow|of)-(x|y)-(${Pt.join("|")})`]}],[/^(?:overflow|of)-([xy])-(.+)$/,([,e,t])=>Pt.includes(t)?{[`overflow-${e}`]:t}:void 0]];var Mt=[[/^(?:position-|pos-)?(relative|absolute|fixed|sticky)$/,([,e])=>({position:e})],[/^(?:position-|pos-)([-\w]+)$/,([,e])=>k.includes(e)?{position:e}:void 0],[/^(?:position-|pos-)?(static)$/,([,e])=>({position:e})]],Oe=[["justify-start",{"justify-content":"flex-start"}],["justify-end",{"justify-content":"flex-end"}],["justify-center",{"justify-content":"center"}],["justify-between",{"justify-content":"space-between"}],["justify-around",{"justify-content":"space-around"}],["justify-evenly",{"justify-content":"space-evenly"}],["justify-stretch",{"justify-content":"stretch"}],...h("justify","justify-content"),["justify-items-start",{"justify-items":"start"}],["justify-items-end",{"justify-items":"end"}],["justify-items-center",{"justify-items":"center"}],["justify-items-stretch",{"justify-items":"stretch"}],...h("justify-items"),["justify-self-auto",{"justify-self":"auto"}],["justify-self-start",{"justify-self":"start"}],["justify-self-end",{"justify-self":"end"}],["justify-self-center",{"justify-self":"center"}],["justify-self-stretch",{"justify-self":"stretch"}],...h("justify-self")],Ut=[[/^order-(.+)$/,([,e])=>({order:s.bracket.cssvar.number(e)})],["order-first",{order:"-9999"}],["order-last",{order:"9999"}],["order-none",{order:"0"}]],Pe=[["content-center",{"align-content":"center"}],["content-start",{"align-content":"flex-start"}],["content-end",{"align-content":"flex-end"}],["content-between",{"align-content":"space-between"}],["content-around",{"align-content":"space-around"}],["content-evenly",{"align-content":"space-evenly"}],...h("content","align-content"),["items-start",{"align-items":"flex-start"}],["items-end",{"align-items":"flex-end"}],["items-center",{"align-items":"center"}],["items-baseline",{"align-items":"baseline"}],["items-stretch",{"align-items":"stretch"}],...h("items","align-items"),["self-auto",{"align-self":"auto"}],["self-start",{"align-self":"flex-start"}],["self-end",{"align-self":"flex-end"}],["self-center",{"align-self":"center"}],["self-stretch",{"align-self":"stretch"}],["self-baseline",{"align-self":"baseline"}],...h("self","align-self")],Ft=[["place-content-center",{"place-content":"center"}],["place-content-start",{"place-content":"start"}],["place-content-end",{"place-content":"end"}],["place-content-between",{"place-content":"space-between"}],["place-content-around",{"place-content":"space-around"}],["place-content-evenly",{"place-content":"space-evenly"}],["place-content-stretch",{"place-content":"stretch"}],...h("place-content"),["place-items-start",{"place-items":"start"}],["place-items-end",{"place-items":"end"}],["place-items-center",{"place-items":"center"}],["place-items-stretch",{"place-items":"stretch"}],...h("place-items"),["place-self-auto",{"place-self":"auto"}],["place-self-start",{"place-self":"start"}],["place-self-end",{"place-self":"end"}],["place-self-center",{"place-self":"center"}],["place-self-stretch",{"place-self":"stretch"}],...h("place-self")],Wt=[...Oe,...Pe].flatMap(([e,t])=>[[`flex-${e}`,t],[`grid-${e}`,t]]);function Ir(e,{theme:t}){return t.spacing?.[e]??s.bracket.cssvar.global.auto.fraction.rem(e)}function Ae([,e,t],r){let n=Ir(t,r);if(n!=null&&e in Ur)return Ur[e].map(o=>[o.slice(1),n])}var Dt=[[/^(?:position-|pos-)?inset-(.+)$/,([,e],t)=>({inset:Ir(e,t)}),{autocomplete:["(position|pos)-inset--$spacing","(position|pos)-inset-(block|inline)-$spacing","(position|pos)-inset-(bs|be|is|ie)-$spacing","(position|pos)-(top|left|right|bottom)-$spacing"]}],[/^(?:position-|pos-)?(start|end)-(.+)$/,Ae],[/^(?:position-|pos-)?inset-([xy])-(.+)$/,Ae],[/^(?:position-|pos-)?inset-([rltbse])-(.+)$/,Ae],[/^(?:position-|pos-)?inset-(block|inline)-(.+)$/,Ae],[/^(?:position-|pos-)?inset-([bi][se])-(.+)$/,Ae],[/^(?:position-|pos-)?(top|left|right|bottom)-(.+)$/,([,e,t],r)=>({[e]:Ir(t,r)})]],Lt=[["float-left",{float:"left"}],["float-right",{float:"right"}],["float-none",{float:"none"}],...h("float"),["clear-left",{clear:"left"}],["clear-right",{clear:"right"}],["clear-both",{clear:"both"}],["clear-none",{clear:"none"}],...h("clear")],Bt=[[/^(?:position-|pos-)?z([\d.]+)$/,([,e])=>({"z-index":s.number(e)})],[/^(?:position-|pos-)?z-(.+)$/,([,e])=>({"z-index":s.bracket.cssvar.global.auto.number(e)}),{autocomplete:"z-"}]],Nt=[["box-border",{"box-sizing":"border-box"}],["box-content",{"box-sizing":"content-box"}],...h("box","box-sizing")];var Fs=["auto","default","none","context-menu","help","pointer","progress","wait","cell","crosshair","text","vertical-text","alias","copy","move","no-drop","not-allowed","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out"],Ws=["none","strict","content","size","inline-size","layout","style","paint"],S=" ",Ht=[["inline",{display:"inline"}],["block",{display:"block"}],["inline-block",{display:"inline-block"}],["contents",{display:"contents"}],["flow-root",{display:"flow-root"}],["list-item",{display:"list-item"}],["hidden",{display:"none"}],[/^display-(.+)$/,([,e])=>({display:s.bracket.cssvar.global(e)||e})]],Gt=[["visible",{visibility:"visible"}],["invisible",{visibility:"hidden"}],["backface-visible",{"backface-visibility":"visible"}],["backface-hidden",{"backface-visibility":"hidden"}],...h("backface","backface-visibility")],It=[[/^cursor-(.+)$/,([,e])=>({cursor:s.bracket.cssvar.global(e)})],...Fs.map(e=>[`cursor-${e}`,{cursor:e}])],Kt=[[/^contain-(.*)$/,([,e])=>s.bracket(e)!=null?{contain:s.bracket(e).split(" ").map(t=>s.cssvar.fraction(t)??t).join(" ")}:Ws.includes(e)?{contain:e}:void 0]],qt=[["pointer-events-auto",{"pointer-events":"auto"}],["pointer-events-none",{"pointer-events":"none"}],...h("pointer-events")],Yt=[["resize-x",{resize:"horizontal"}],["resize-y",{resize:"vertical"}],["resize",{resize:"both"}],["resize-none",{resize:"none"}],...h("resize")],Xt=[["select-auto",{"-webkit-user-select":"auto","user-select":"auto"}],["select-all",{"-webkit-user-select":"all","user-select":"all"}],["select-text",{"-webkit-user-select":"text","user-select":"text"}],["select-none",{"-webkit-user-select":"none","user-select":"none"}],...h("select","user-select")],Zt=[[/^(?:whitespace-|ws-)([-\w]+)$/,([,e])=>["normal","nowrap","pre","pre-line","pre-wrap","break-spaces",...k].includes(e)?{"white-space":e}:void 0,{autocomplete:"(whitespace|ws)-(normal|nowrap|pre|pre-line|pre-wrap|break-spaces)"}]],Jt=[[/^intrinsic-size-(.+)$/,([,e])=>({"contain-intrinsic-size":s.bracket.cssvar.global.fraction.rem(e)}),{autocomplete:"intrinsic-size-"}],["content-visibility-visible",{"content-visibility":"visible"}],["content-visibility-hidden",{"content-visibility":"hidden"}],["content-visibility-auto",{"content-visibility":"auto"}],...h("content-visibility")],Qt=[[/^content-(.+)$/,([,e])=>({content:s.bracket.cssvar(e)})],["content-empty",{content:'""'}],["content-none",{content:"none"}]],er=[["break-normal",{"overflow-wrap":"normal","word-break":"normal"}],["break-words",{"overflow-wrap":"break-word"}],["break-all",{"word-break":"break-all"}],["break-keep",{"word-break":"keep-all"}]],tr=[["truncate",{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}],["text-truncate",{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"}],["text-ellipsis",{"text-overflow":"ellipsis"}],["text-clip",{"text-overflow":"clip"}]],rr=[["case-upper",{"text-transform":"uppercase"}],["case-lower",{"text-transform":"lowercase"}],["case-capital",{"text-transform":"capitalize"}],["case-normal",{"text-transform":"none"}],...h("case","text-transform")],nr=[["italic",{"font-style":"italic"}],["not-italic",{"font-style":"normal"}],["font-italic",{"font-style":"italic"}],["font-not-italic",{"font-style":"normal"}],["oblique",{"font-style":"oblique"}],["not-oblique",{"font-style":"normal"}],["font-oblique",{"font-style":"oblique"}],["font-not-oblique",{"font-style":"normal"}]],or=[["antialiased",{"-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","font-smoothing":"grayscale"}],["subpixel-antialiased",{"-webkit-font-smoothing":"auto","-moz-osx-font-smoothing":"auto","font-smoothing":"auto"}]];var ar={"--un-ring-inset":S,"--un-ring-offset-width":"0px","--un-ring-offset-color":"#fff","--un-ring-width":"0px","--un-ring-color":"rgba(147,197,253,0.5)","--un-shadow":"0 0 rgba(0,0,0,0)"},ir=[[/^ring(?:-(.+))?$/,([,e],{theme:t})=>{let r=t.ringWidth?.[e||"DEFAULT"]??s.px(e||"1");if(r)return{"--un-ring-width":r,"--un-ring-offset-shadow":"var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color)","--un-ring-shadow":"var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color)","box-shadow":"var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow)"}},{autocomplete:"ring-$ringWidth"}],[/^ring-(?:width-|size-)(.+)$/,([,e],{theme:t})=>({"--un-ring-width":t.lineWidth?.[e]??s.bracket.cssvar.px(e)}),{autocomplete:"ring-(width|size)-$lineWidth"}],["ring-offset",{"--un-ring-offset-width":"1px"}],[/^ring-offset-(?:width-|size-)?(.+)$/,([,e],{theme:t})=>({"--un-ring-offset-width":t.lineWidth?.[e]??s.bracket.cssvar.px(e)}),{autocomplete:"ring-offset-(width|size)-$lineWidth"}],[/^ring-(.+)$/,z("--un-ring-color","ring"),{autocomplete:"ring-$colors"}],[/^ring-op(?:acity)?-?(.+)$/,([,e])=>({"--un-ring-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"ring-(op|opacity)-"}],[/^ring-offset-(.+)$/,z("--un-ring-offset-color","ring-offset"),{autocomplete:"ring-offset-$colors"}],[/^ring-offset-op(?:acity)?-?(.+)$/,([,e])=>({"--un-ring-offset-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"ring-offset-(op|opacity)-"}],["ring-inset",{"--un-ring-inset":"inset"}]];var sr={"--un-ring-offset-shadow":"0 0 rgba(0,0,0,0)","--un-ring-shadow":"0 0 rgba(0,0,0,0)","--un-shadow-inset":S,"--un-shadow":"0 0 rgba(0,0,0,0)"},cr=[[/^shadow(?:-(.+))?$/,(e,t)=>{let[,r]=e,{theme:n}=t,o=n.boxShadow?.[r||"DEFAULT"],a=r?s.bracket.cssvar(r):void 0;return(o!=null||a!=null)&&!ve(a,n)?{"--un-shadow":ye(o||a,"--un-shadow-color").join(","),"box-shadow":"var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow)"}:z("--un-shadow-color","shadow")(e,t)},{autocomplete:["shadow-$colors","shadow-$boxShadow"]}],[/^shadow-op(?:acity)?-?(.+)$/,([,e])=>({"--un-shadow-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"shadow-(op|opacity)-"}],["shadow-inset",{"--un-shadow-inset":"inset"}]];var Ds={h:"height",w:"width",inline:"inline-size",block:"block-size"};function _e(e,t){return`${e||""}${Ds[t]}`}function In(e,t,r,n){let o=_e(e,t).replace(/-(\w)/g,(i,c)=>c.toUpperCase()),a=r[o]?.[n];if(a!=null)return a;switch(n){case"fit":case"max":case"min":return`${n}-content`}return s.bracket.cssvar.global.auto.fraction.rem(n)}var lr=[[/^(?:size-)?(min-|max-)?([wh])-?(.+)$/,([,e,t,r],{theme:n})=>({[_e(e,t)]:In(e,t,n,r)})],[/^(?:size-)?(min-|max-)?(block|inline)-(.+)$/,([,e,t,r],{theme:n})=>({[_e(e,t)]:In(e,t,n,r)}),{autocomplete:["(w|h)-$width|height|maxWidth|maxHeight|minWidth|minHeight|inlineSize|blockSize|maxInlineSize|maxBlockSize|minInlineSize|minBlockSize","(block|inline)-$width|height|maxWidth|maxHeight|minWidth|minHeight|inlineSize|blockSize|maxInlineSize|maxBlockSize|minInlineSize|minBlockSize","(max|min)-(w|h|block|inline)","(max|min)-(w|h|block|inline)-$width|height|maxWidth|maxHeight|minWidth|minHeight|inlineSize|blockSize|maxInlineSize|maxBlockSize|minInlineSize|minBlockSize"]}],[/^(?:size-)?(min-|max-)?(h)-screen-(.+)$/,([,e,t,r],n)=>({[_e(e,t)]:Un(n)?.[r]})],[/^(?:size-)?(min-|max-)?(w)-screen-(.+)$/,([,e,t,r],n)=>({[_e(e,t)]:le(n)?.[r]}),{autocomplete:["(w|h)-screen","(min|max)-(w|h)-screen","h-screen-$verticalBreakpoints","(min|max)-h-screen-$verticalBreakpoints","w-screen-$breakpoints","(min|max)-w-screen-$breakpoints"]}]];function Ls(e){if(/^\d+\/\d+$/.test(e))return e;switch(e){case"square":return"1/1";case"video":return"16/9"}return s.bracket.cssvar.global.auto.number(e)}var pr=[[/^(?:size-)?aspect-(?:ratio-)?(.+)$/,([,e])=>({"aspect-ratio":Ls(e)}),{autocomplete:["aspect-(square|video|ratio)","aspect-ratio-(square|video)"]}]];var fr=[[/^pa?()-?(-?.+)$/,A("padding"),{autocomplete:["(m|p)","(m|p)-"]}],[/^p-?xy()()$/,A("padding"),{autocomplete:"(m|p)-(xy)"}],[/^p-?([xy])(?:-?(-?.+))?$/,A("padding")],[/^p-?([rltbse])(?:-?(-?.+))?$/,A("padding"),{autocomplete:"(m|p)-"}],[/^p-(block|inline)(?:-(-?.+))?$/,A("padding"),{autocomplete:"(m|p)-(block|inline)-"}],[/^p-?([bi][se])(?:-?(-?.+))?$/,A("padding"),{autocomplete:"(m|p)-(bs|be|is|ie)-"}]],ur=[[/^ma?()-?(-?.+)$/,A("margin")],[/^m-?xy()()$/,A("margin")],[/^m-?([xy])(?:-?(-?.+))?$/,A("margin")],[/^m-?([rltbse])(?:-?(-?.+))?$/,A("margin")],[/^m-(block|inline)(?:-(-?.+))?$/,A("margin")],[/^m-?([bi][se])(?:-?(-?.+))?$/,A("margin")]];var Kn=["translate","rotate","scale"],ue=["translateX(var(--un-translate-x))","translateY(var(--un-translate-y))","translateZ(var(--un-translate-z))","rotate(var(--un-rotate))","rotateX(var(--un-rotate-x))","rotateY(var(--un-rotate-y))","rotateZ(var(--un-rotate-z))","skewX(var(--un-skew-x))","skewY(var(--un-skew-y))","scaleX(var(--un-scale-x))","scaleY(var(--un-scale-y))","scaleZ(var(--un-scale-z))"].join(" "),Bs=["translate3d(var(--un-translate-x), var(--un-translate-y), var(--un-translate-z))","rotate(var(--un-rotate))","rotateX(var(--un-rotate-x))","rotateY(var(--un-rotate-y))","rotateZ(var(--un-rotate-z))","skewX(var(--un-skew-x))","skewY(var(--un-skew-y))","scaleX(var(--un-scale-x))","scaleY(var(--un-scale-y))","scaleZ(var(--un-scale-z))"].join(" "),dr={"--un-rotate":0,"--un-rotate-x":0,"--un-rotate-y":0,"--un-rotate-z":0,"--un-scale-x":1,"--un-scale-y":1,"--un-scale-z":1,"--un-skew-x":0,"--un-skew-y":0,"--un-translate-x":0,"--un-translate-y":0,"--un-translate-z":0},mr=[[/^(?:transform-)?origin-(.+)$/,([,e])=>({"transform-origin":M[e]??s.bracket.cssvar(e)}),{autocomplete:[`transform-origin-(${Object.keys(M).join("|")})`,`origin-(${Object.keys(M).join("|")})`]}],[/^(?:transform-)?perspect(?:ive)?-(.+)$/,([,e])=>{let t=s.bracket.cssvar.px.numberWithUnit(e);if(t!=null)return{"-webkit-perspective":t,perspective:t}}],[/^(?:transform-)?perspect(?:ive)?-origin-(.+)$/,([,e])=>{let t=s.bracket.cssvar(e)??(e.length>=3?M[e]:void 0);if(t!=null)return{"-webkit-perspective-origin":t,"perspective-origin":t}}],[/^(?:transform-)?translate-()(.+)$/,qn],[/^(?:transform-)?translate-([xyz])-(.+)$/,qn],[/^(?:transform-)?rotate-()(.+)$/,Xn],[/^(?:transform-)?rotate-([xyz])-(.+)$/,Xn],[/^(?:transform-)?skew-()(.+)$/,Zn],[/^(?:transform-)?skew-([xy])-(.+)$/,Zn,{autocomplete:["transform-skew-(x|y)-"]}],[/^(?:transform-)?scale-()(.+)$/,Yn],[/^(?:transform-)?scale-([xyz])-(.+)$/,Yn,{autocomplete:[`transform-(${Kn.join("|")})-`,`transform-(${Kn.join("|")})-(x|y|z)-`]}],[/^(?:transform-)?preserve-3d$/,()=>({"transform-style":"preserve-3d"})],[/^(?:transform-)?preserve-flat$/,()=>({"transform-style":"flat"})],["transform",{transform:ue}],["transform-cpu",{transform:ue}],["transform-gpu",{transform:Bs}],["transform-none",{transform:"none"}],...h("transform")];function qn([,e,t],{theme:r}){let n=r.spacing?.[t]??s.bracket.cssvar.fraction.rem(t);if(n!=null)return[...lt[e].map(o=>[`--un-translate${o}`,n]),["transform",ue]]}function Yn([,e,t]){let r=s.bracket.cssvar.fraction.percent(t);if(r!=null)return[...lt[e].map(n=>[`--un-scale${n}`,r]),["transform",ue]]}function Xn([,e="",t]){let r=s.bracket.cssvar.degree(t);if(r!=null)return e?{"--un-rotate":0,[`--un-rotate-${e}`]:r,transform:ue}:{"--un-rotate-x":0,"--un-rotate-y":0,"--un-rotate-z":0,"--un-rotate":r,transform:ue}}function Zn([,e,t]){let r=s.bracket.cssvar.degree(t);if(r!=null)return[...lt[e].map(n=>[`--un-skew${n}`,r]),["transform",ue]]}var Ns={backface:"backface-visibility",break:"word-break",case:"text-transform",content:"align-content",fw:"font-weight",items:"align-items",justify:"justify-content",select:"user-select",self:"align-self",vertical:"vertical-align",visible:"visibility",whitespace:"white-space",ws:"white-space"},gr=[[/^(.+?)-(\$.+)$/,([,e,t])=>{let r=Ns[e];if(r)return{[r]:s.cssvar(t)}}]],br=[[/^\[(--(\w|\\\W)+|[\w-]+):([^\s:]*?("\S+?"|'\S+?'|`\S+?`|[^\s:]+?)[^\s:]*?\)?)\]$/,([e,t,,r])=>{if(!Hs(e.slice(1,-1)))return{[t]:s.bracket(`[${r}]`)}}]];function Hs(e){if(!e.includes("://"))return!1;try{return new URL(e).host!==""}catch{return!1}}var hr=[[/^(where|\?)$/,(e,{constructCSS:t,generator:r})=>{if(r.userConfig.envMode==="dev")return`@keyframes __un_qm{0%{box-shadow:inset 4px 4px #ff1e90, inset -4px -4px #ff1e90}100%{box-shadow:inset 8px 8px #3399ff, inset -8px -8px #3399ff}} +${t({animation:"__un_qm 0.5s ease-in-out alternate infinite"})}`}]];var xr=[[/^fill-(.+)$/,z("fill","fill"),{autocomplete:"fill-$colors"}],[/^fill-op(?:acity)?-?(.+)$/,([,e])=>({"--un-fill-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"fill-(op|opacity)-"}],["fill-none",{fill:"none"}],[/^stroke-(?:width-|size-)?(.+)$/,([,e],{theme:t})=>({"stroke-width":t.lineWidth?.[e]??s.bracket.cssvar.fraction.px.number(e)}),{autocomplete:["stroke-width-$lineWidth","stroke-size-$lineWidth"]}],[/^stroke-dash-(.+)$/,([,e])=>({"stroke-dasharray":s.bracket.cssvar.number(e)}),{autocomplete:"stroke-dash-"}],[/^stroke-offset-(.+)$/,([,e],{theme:t})=>({"stroke-dashoffset":t.lineWidth?.[e]??s.bracket.cssvar.px.numberWithUnit(e)}),{autocomplete:"stroke-offset-$lineWidth"}],[/^stroke-(.+)$/,z("stroke","stroke"),{autocomplete:"stroke-$colors"}],[/^stroke-op(?:acity)?-?(.+)$/,([,e])=>({"--un-stroke-opacity":s.bracket.percent.cssvar(e)}),{autocomplete:"stroke-(op|opacity)-"}],["stroke-cap-square",{"stroke-linecap":"square"}],["stroke-cap-round",{"stroke-linecap":"round"}],["stroke-cap-auto",{"stroke-linecap":"butt"}],["stroke-join-arcs",{"stroke-linejoin":"arcs"}],["stroke-join-bevel",{"stroke-linejoin":"bevel"}],["stroke-join-clip",{"stroke-linejoin":"miter-clip"}],["stroke-join-round",{"stroke-linejoin":"round"}],["stroke-join-auto",{"stroke-linejoin":"miter"}],["stroke-none",{stroke:"none"}]];var Jn=[gr,br,fr,ur,Ht,yt,$t,xr,xt,Jt,Qt,zt,Tt,jt,tr,wt,Et,Vt,rr,ft,vt,nr,or,cr,ir,Rt,Ot,At,Mt,lr,pr,It,Gt,qt,Yt,pt,Xt,Zt,er,_t,gt,bt,Ut,Oe,Pe,Ft,Wt,Dt,Lt,Bt,Nt,Ct,mr,ht,kt,Kt,hr].flat(1);var Kr={inherit:"inherit",current:"currentColor",transparent:"transparent",black:"#000",white:"#fff",rose:{50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337",950:"#4c0519"},pink:{50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843",950:"#500724"},fuchsia:{50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75",950:"#4a044e"},purple:{50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87",950:"#3b0764"},violet:{50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95",950:"#2e1065"},indigo:{50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81",950:"#1e1b4b"},blue:{50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a",950:"#172554"},sky:{50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e",950:"#082f49"},cyan:{50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63",950:"#083344"},teal:{50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},emerald:{50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b",950:"#022c22"},green:{50:"#f0fdf4",100:"#dcfce7",200:"#bbf7d0",300:"#86efac",400:"#4ade80",500:"#22c55e",600:"#16a34a",700:"#15803d",800:"#166534",900:"#14532d",950:"#052e16"},lime:{50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314",950:"#1a2e05"},yellow:{50:"#fefce8",100:"#fef9c3",200:"#fef08a",300:"#fde047",400:"#facc15",500:"#eab308",600:"#ca8a04",700:"#a16207",800:"#854d0e",900:"#713f12",950:"#422006"},amber:{50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},orange:{50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12",950:"#431407"},red:{50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d",950:"#450a0a"},gray:{50:"#f9fafb",100:"#f3f4f6",200:"#e5e7eb",300:"#d1d5db",400:"#9ca3af",500:"#6b7280",600:"#4b5563",700:"#374151",800:"#1f2937",900:"#111827",950:"#030712"},slate:{50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a",950:"#020617"},zinc:{50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b",950:"#09090b"},neutral:{50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717",950:"#0a0a0a"},stone:{50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917",950:"#0c0a09"},light:{50:"#fdfdfd",100:"#fcfcfc",200:"#fafafa",300:"#f8f9fa",400:"#f6f6f6",500:"#f2f2f2",600:"#f1f3f5",700:"#e9ecef",800:"#dee2e6",900:"#dde1e3",950:"#d8dcdf"},dark:{50:"#4a4a4a",100:"#3c3c3c",200:"#323232",300:"#2d2d2d",400:"#222222",500:"#1f1f1f",600:"#1c1c1e",700:"#1b1b1b",800:"#181818",900:"#0f0f0f",950:"#080808"},get lightblue(){return this.sky},get lightBlue(){return this.sky},get warmgray(){return this.stone},get warmGray(){return this.stone},get truegray(){return this.neutral},get trueGray(){return this.neutral},get coolgray(){return this.gray},get coolGray(){return this.gray},get bluegray(){return this.slate},get blueGray(){return this.slate}};Object.values(Kr).forEach(e=>{typeof e!="string"&&e!==void 0&&(e.DEFAULT=e.DEFAULT||e[400],Object.keys(e).forEach(t=>{let r=+t/100;r===Math.round(r)&&(e[r]=e[t])}))});var Qn={sans:["ui-sans-serif","system-ui","-apple-system","BlinkMacSystemFont",'"Segoe UI"',"Roboto",'"Helvetica Neue"',"Arial",'"Noto Sans"',"sans-serif",'"Apple Color Emoji"','"Segoe UI Emoji"','"Segoe UI Symbol"','"Noto Color Emoji"'].join(","),serif:["ui-serif","Georgia","Cambria",'"Times New Roman"',"Times","serif"].join(","),mono:["ui-monospace","SFMono-Regular","Menlo","Monaco","Consolas",'"Liberation Mono"','"Courier New"',"monospace"].join(",")},eo={xs:["0.75rem","1rem"],sm:["0.875rem","1.25rem"],base:["1rem","1.5rem"],lg:["1.125rem","1.75rem"],xl:["1.25rem","1.75rem"],"2xl":["1.5rem","2rem"],"3xl":["1.875rem","2.25rem"],"4xl":["2.25rem","2.5rem"],"5xl":["3rem","1"],"6xl":["3.75rem","1"],"7xl":["4.5rem","1"],"8xl":["6rem","1"],"9xl":["8rem","1"]},to={DEFAULT:"1.5rem",xs:"0.5rem",sm:"1rem",md:"1.5rem",lg:"2rem",xl:"2.5rem","2xl":"3rem","3xl":"4rem"},ro={DEFAULT:"1.5rem",none:"0",sm:"thin",md:"medium",lg:"thick"},no={DEFAULT:["0 0 1px rgba(0,0,0,0.2)","0 0 1px rgba(1,0,5,0.1)"],none:"0 0 rgba(0,0,0,0)",sm:"1px 1px 3px rgba(36,37,47,0.25)",md:["0 1px 2px rgba(30,29,39,0.19)","1px 2px 4px rgba(54,64,147,0.18)"],lg:["3px 3px 6px rgba(0,0,0,0.26)","0 0 5px rgba(15,3,86,0.22)"],xl:["1px 1px 3px rgba(0,0,0,0.29)","2px 4px 7px rgba(73,64,125,0.35)"]},oo={none:"1",tight:"1.25",snug:"1.375",normal:"1.5",relaxed:"1.625",loose:"2"},qr={tighter:"-0.05em",tight:"-0.025em",normal:"0em",wide:"0.025em",wider:"0.05em",widest:"0.1em"},ao=qr;var Yr={sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},io={...Yr},so={DEFAULT:"1px",none:"0"},co={DEFAULT:"1rem",none:"0",xs:"0.75rem",sm:"0.875rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem","5xl":"3rem","6xl":"3.75rem","7xl":"4.5rem","8xl":"6rem","9xl":"8rem"},lo={DEFAULT:"150ms",none:"0s",75:"75ms",100:"100ms",150:"150ms",200:"200ms",300:"300ms",500:"500ms",700:"700ms",1e3:"1000ms"},po={DEFAULT:"0.25rem",none:"0",sm:"0.125rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},fo={DEFAULT:["var(--un-shadow-inset) 0 1px 3px 0 rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 1px 2px -1px rgba(0,0,0,0.1)"],none:"0 0 rgba(0,0,0,0)",sm:"var(--un-shadow-inset) 0 1px 2px 0 rgba(0,0,0,0.05)",md:["var(--un-shadow-inset) 0 4px 6px -1px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 2px 4px -2px rgba(0,0,0,0.1)"],lg:["var(--un-shadow-inset) 0 10px 15px -3px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 4px 6px -4px rgba(0,0,0,0.1)"],xl:["var(--un-shadow-inset) 0 20px 25px -5px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 8px 10px -6px rgba(0,0,0,0.1)"],"2xl":"var(--un-shadow-inset) 0 25px 50px -12px rgba(0,0,0,0.25)",inner:"inset 0 2px 4px 0 rgba(0,0,0,0.05)"},uo={DEFAULT:"cubic-bezier(0.4, 0, 0.2, 1)",linear:"linear",in:"cubic-bezier(0.4, 0, 1, 1)",out:"cubic-bezier(0, 0, 0.2, 1)","in-out":"cubic-bezier(0.4, 0, 0.2, 1)"},mo={DEFAULT:"1px",none:"0"};var go={DEFAULT:"8px",0:"0",sm:"4px",md:"12px",lg:"16px",xl:"24px","2xl":"40px","3xl":"64px"},bo={DEFAULT:["0 1px 2px rgba(0,0,0,0.1)","0 1px 1px rgba(0,0,0,0.06)"],sm:"0 1px 1px rgba(0,0,0,0.05)",md:["0 4px 3px rgba(0,0,0,0.07)","0 2px 2px rgba(0,0,0,0.06)"],lg:["0 10px 8px rgba(0,0,0,0.04)","0 4px 3px rgba(0,0,0,0.1)"],xl:["0 20px 13px rgba(0,0,0,0.03)","0 8px 5px rgba(0,0,0,0.08)"],"2xl":"0 25px 25px rgba(0,0,0,0.15)",none:"0 0 rgba(0,0,0,0)"};var Me={xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem",prose:"65ch"},Xr={auto:"auto",...Me,screen:"100vw"},Ue={none:"none",...Me,screen:"100vw"},Zr={auto:"auto",...Me,screen:"100vh"},Fe={none:"none",...Me,screen:"100vh"},ho=Object.fromEntries(Object.entries(Me).map(([e,t])=>[e,`(min-width: ${t})`]));var xo={...dr,...sr,...ar};var yo={width:Xr,height:Zr,maxWidth:Ue,maxHeight:Fe,minWidth:Ue,minHeight:Fe,inlineSize:Xr,blockSize:Zr,maxInlineSize:Ue,maxBlockSize:Fe,minInlineSize:Ue,minBlockSize:Fe,colors:Kr,fontFamily:Qn,fontSize:eo,breakpoints:Yr,verticalBreakpoints:io,borderRadius:po,lineHeight:oo,letterSpacing:qr,wordSpacing:ao,boxShadow:fo,textIndent:to,textShadow:no,textStrokeWidth:ro,blur:go,dropShadow:bo,easing:uo,lineWidth:so,spacing:co,duration:lo,ringWidth:mo,preflightBase:xo,containers:ho};var vo={name:"aria",match(e,t){let r=B("aria-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??t.theme.aria?.[n]??"";if(a)return{matcher:o,selector:i=>`${i}[aria-${a}]`}}}};function $o(e){let t=e.match(/^-?[0-9]+\.?[0-9]*/)?.[0]||"",r=e.slice(t.length),n=parseFloat(t)-.1;return Number.isNaN(n)?e:`${n}${r}`}function ko(){let e={};return{name:"breakpoints",match(t,r){let n=Object.entries(le(r)??{}).map(([o,a],i)=>[o,a,i]);for(let[o,a,i]of n){e[o]||(e[o]=new RegExp(`^((?:([al]t-|[<~]))?${o}(?:${r.generator.config.separators.join("|")}))`));let c=t.match(e[o]);if(!c)continue;let[,l]=c,p=t.slice(l.length);if(p==="container")continue;let f=l.startsWith("lt-")||l.startsWith("<"),u=l.startsWith("at-")||l.startsWith("~"),g=1e3;return f?(g-=i+1,{matcher:p,handle:(m,C)=>C({...m,parent:`${m.parent?`${m.parent} $$ `:""}@media (max-width: ${$o(a)})`,parentOrder:g})}):(g+=i+1,u&&iC({...m,parent:`${m.parent?`${m.parent} $$ `:""}@media (min-width: ${a}) and (max-width: ${$o(n[i+1][1])})`,parentOrder:g})}:{matcher:p,handle:(m,C)=>C({...m,parent:`${m.parent?`${m.parent} $$ `:""}@media (min-width: ${a})`,parentOrder:g})})}},multiPass:!0,autocomplete:"(at-|lt-|)$breakpoints:"}}function We(e,t){return{name:`combinator:${e}`,match(r,n){if(!r.startsWith(e))return;let o=n.generator.config.separators,a=ie(`${e}-`,r,o);if(!a){for(let c of o)if(r.startsWith(`${e}${c}`)){a=["",r.slice(e.length+c.length)];break}if(!a)return}let i=s.bracket(a[0])??"";return i===""&&(i="*"),{matcher:a[1],selector:c=>`${c}${t}${i}`}},multiPass:!0}}var wo=[We("all"," "),We("children",">"),We("next","+"),We("sibling","+"),We("siblings","~")];var So={name:"@",match(e,t){if(e.startsWith("@container"))return;let r=B("@",e,t.generator.config.separators);if(r){let[n,o,a]=r,i=s.bracket(n),c;if(i){let l=s.numberWithUnit(i);l&&(c=`(min-width: ${l})`)}else c=t.theme.containers?.[n]??"";if(c)return X("The container query variant is experimental and may not follow semver."),{matcher:o,handle:(l,p)=>p({...l,parent:`${l.parent?`${l.parent} $$ `:""}@container${a?` ${a} `:" "}${c}`})}}},multiPass:!0};function Co(e={}){if(e?.dark==="class"||typeof e.dark=="object"){let{dark:t=".dark",light:r=".light"}=typeof e.dark=="string"?{}:e.dark;return[N("dark",n=>({prefix:`${t} $$ ${n.prefix}`})),N("light",n=>({prefix:`${r} $$ ${n.prefix}`}))]}return[W("dark","@media (prefers-color-scheme: dark)"),W("light","@media (prefers-color-scheme: light)")]}var Ro={name:"data",match(e,t){let r=B("data-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??t.theme.data?.[n]??"";if(a)return{matcher:o,selector:i=>`${i}[data-${a}]`}}}};var zo=[N("rtl",e=>({prefix:`[dir="rtl"] $$ ${e.prefix}`})),N("ltr",e=>({prefix:`[dir="ltr"] $$ ${e.prefix}`}))];var To={name:"selector",match(e,t){let r=ie("selector-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n);if(a)return{matcher:o,selector:()=>a}}}},jo={name:"layer",match(e,t){let r=B("layer-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??n;if(a)return{matcher:o,handle:(i,c)=>c({...i,parent:`${i.parent?`${i.parent} $$ `:""}@layer ${a}`})}}}},Eo={name:"uno-layer",match(e,t){let r=B("uno-layer-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??n;if(a)return{matcher:o,layer:a}}}},Vo={name:"scope",match(e,t){let r=ie("scope-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n);if(a)return{matcher:o,selector:i=>`${a} $$ ${i}`}}}},Ao={name:"variables",match(e,t){if(!e.startsWith("["))return;let[r,n]=mt(e,"[","]")??[];if(!(r&&n))return;let o;for(let c of t.generator.config.separators)if(n.startsWith(c)){o=n.slice(c.length);break}if(o==null)return;let a=s.bracket(r)??"",i=a.startsWith("@");if(i||a.includes("&"))return{matcher:o,handle(c,l){let p=i?{parent:`${c.parent?`${c.parent} $$ `:""}${a}`}:{selector:a.replace(/&/g,c.selector)};return l({...c,...p})}}},multiPass:!0};var Oo=/[0-9.]+(?:[a-z]+|%)?/,Gs=[/opacity|color|flex/];function Is(e){let t=e.match(/^(calc|clamp|max|min)\s*(\(.*)/);if(t){let[r,n]=Nr(t[2],"(",")"," ")??[];if(r)return`calc(${t[1]}${r} * -1)${n?` ${n}`:""}`}}var Po={name:"negative",match(e){if(e.startsWith("-"))return{matcher:e.slice(1),body:t=>{if(t.find(n=>n[0]===Mn))return;let r=!1;return t.forEach(n=>{let o=n[1]?.toString();if(!o||o==="0"||Gs.some(i=>n[0].match(i)))return;let a=Is(o);a?(n[1]=a,r=!0):Oo.test(o)&&(n[1]=o.replace(Oo,i=>`-${i}`),r=!0)}),r?t:[]}}}};function _o(){let e;return{name:"important",match(t,r){e||(e=new RegExp(`^(important(?:${r.generator.config.separators.join("|")})|!)`));let n,o=t.match(e);if(o?n=t.slice(o[0].length):t.endsWith("!")&&(n=t.slice(0,-1)),n)return{matcher:n,body:a=>(a.forEach(i=>{i[1]&&(i[1]+=" !important")}),a)}}}}var Mo=W("print","@media print"),Uo={name:"media",match(e,t){let r=B("media-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??"";if(a===""&&(a=t.theme.media?.[n]??""),a)return{matcher:o,handle:(i,c)=>c({...i,parent:`${i.parent?`${i.parent} $$ `:""}@media ${a}`})}}},multiPass:!0};var Fo={name:"supports",match(e,t){let r=B("supports-",e,t.generator.config.separators);if(r){let[n,o]=r,a=s.bracket(n)??"";if(a===""&&(a=t.theme.supports?.[n]??""),a)return{matcher:o,handle:(i,c)=>c({...i,parent:`${i.parent?`${i.parent} $$ `:""}@supports ${a}`})}}},multiPass:!0};var Le=Object.fromEntries([["first-letter","::first-letter"],["first-line","::first-line"],"any-link","link","visited","target",["open","[open]"],"hover","active","focus-visible","focus-within","focus","autofill","enabled","disabled","read-only","read-write","placeholder-shown","default","checked","indeterminate","valid","invalid","in-range","out-of-range","required","optional","root","empty",["even-of-type",":nth-of-type(even)"],["even",":nth-child(even)"],["odd-of-type",":nth-of-type(odd)"],["odd",":nth-child(odd)"],"first-of-type",["first",":first-child"],"last-of-type",["last",":last-child"],"only-child","only-of-type",["backdrop-element","::backdrop"],["placeholder","::placeholder"],["before","::before"],["after","::after"],["selection","::selection"],["marker","::marker"],["file","::file-selector-button"]].map(e=>Array.isArray(e)?e:[e,`:${e}`])),Be=Object.fromEntries([["backdrop","::backdrop"]].map(e=>Array.isArray(e)?e:[e,`:${e}`])),Ks=["not","is","where","has"],Jr=Object.entries(Le).filter(([,e])=>!e.startsWith("::")).map(([e])=>e).join("|"),Qr=Object.entries(Be).filter(([,e])=>!e.startsWith("::")).map(([e])=>e).join("|"),De=Ks.join("|");function Lo(e){if(e==="focus")return{sort:10,noMerge:!0};if(e==="active")return{sort:20,noMerge:!0}}function yr(e,t,r){let n=new RegExp(`^(${Y(t)}:)(\\S+)${Y(r)}\\1`),o,a,i,c=p=>{let f=ie(`${e}-`,p,[]);if(!f)return;let[u,g]=f,m=s.bracket(u);if(m==null)return;let C=g.split(o,1)?.[0]??"",V=`${t}${ae(C)}`;return[C,p.slice(p.length-(g.length-C.length-1)),m.includes("&")?m.replace(/&/g,V):`${V}${m}`]},l=p=>{let f=p.match(a)||p.match(i);if(!f)return;let[u,g,m]=f,C=f[3]??"",V=Le[m]||Be[m]||`:${m}`;return g&&(V=`:${g}(${V})`),[C,p.slice(u.length),`${t}${ae(C)}${V}`,m]};return{name:`pseudo:${e}`,match(p,f){if(o&&a&&i||(o=new RegExp(`(?:${f.generator.config.separators.join("|")})`),a=new RegExp(`^${e}-(?:(?:(${De})-)?(${Jr}))(?:(/\\w+))?(?:${f.generator.config.separators.join("|")})`),i=new RegExp(`^${e}-(?:(?:(${De})-)?(${Qr}))(?:(/\\w+))?(?:${f.generator.config.separators.filter(R=>R!=="-").join("|")})`)),!p.startsWith(e))return;let u=c(p)||l(p);if(!u)return;let[g,m,C,V=""]=u;return g!==""&&X("The labeled variant is experimental and may not follow semver."),{matcher:m,handle:(R,O)=>O({...R,prefix:`${C}${r}${R.prefix}`.replace(n,"$1$2:"),...Lo(V)})}},multiPass:!0}}var qs=["::-webkit-resizer","::-webkit-scrollbar","::-webkit-scrollbar-button","::-webkit-scrollbar-corner","::-webkit-scrollbar-thumb","::-webkit-scrollbar-track","::-webkit-scrollbar-track-piece","::file-selector-button"],Wo=Object.entries(Le).map(([e])=>e).join("|"),Do=Object.entries(Be).map(([e])=>e).join("|");function Bo(){let e,t;return{name:"pseudo",match(r,n){e&&e||(e=new RegExp(`^(${Wo})(?:${n.generator.config.separators.join("|")})`),t=new RegExp(`^(${Do})(?:${n.generator.config.separators.filter(a=>a!=="-").join("|")})`));let o=r.match(e)||r.match(t);if(o){let a=Le[o[1]]||Be[o[1]]||`:${o[1]}`;return{matcher:r.slice(o[0].length),handle:(i,c)=>{let l=a.startsWith("::")&&!qs.includes(a)?{pseudo:`${i.pseudo}${a}`}:{selector:`${i.selector}${a}`};return c({...i,...l,...Lo(o[1])})}}}},multiPass:!0,autocomplete:`(${Wo}|${Do}):`}}function No(){let e,t;return{match(r,n){e&&t||(e=new RegExp(`^(${De})-(${Jr})(?:${n.generator.config.separators.join("|")})`),t=new RegExp(`^(${De})-(${Qr})(?:${n.generator.config.separators.filter(a=>a!=="-").join("|")})`));let o=r.match(e)||r.match(t);if(o){let a=o[1],i=Le[o[2]]||Be[o[2]]||`:${o[2]}`;return{matcher:r.slice(o[0].length),selector:c=>`${c}:${a}(${i})`}}},multiPass:!0,autocomplete:`(${De})-(${Jr}|${Qr}):`}}function Ho(e={}){let t=!!e?.attributifyPseudo;return[yr("group",t?'[group=""]':".group"," "),yr("peer",t?'[peer=""]':".peer","~"),yr("parent",t?'[parent=""]':".parent",">"),yr("previous",t?'[previous=""]':".previous","+")]}var Ys=/(part-\[(.+)]:)(.+)/,Go={match(e){let t=e.match(Ys);if(t){let r=`part(${t[2]})`;return{matcher:e.slice(t[1].length),selector:n=>`${n}::${r}`}}},multiPass:!0};function vr(e){return[vo,Ro,jo,To,Eo,Po,_o(),Fo,Mo,Uo,ko(),...wo,Bo(),No(),...Ho(e),Go,...Co(e),...zo,Vo,So,Ao]}function Io(e={}){return e.dark=e.dark??"class",e.attributifyPseudo=e.attributifyPseudo??!1,e.preflight=e.preflight??!0,e.variablePrefix=e.variablePrefix??"un-",{name:"@unocss/preset-mini",theme:yo,rules:Jn,variants:vr(e),options:e,prefix:e.prefix,postprocess:Xs(e.variablePrefix),preflights:e.preflight?Zs(On,e.variablePrefix):[],extractorDefault:e.arbitraryVariants===!1?void 0:An}}function Xs(e){if(e!=="un-")return t=>{t.entries.forEach(r=>{r[0]=r[0].replace(/^--un-/,`--${e}`),typeof r[1]=="string"&&(r[1]=r[1].replace(/var\(--un-/g,`var(--${e}`))})}}function Zs(e,t){return t!=="un-"?e.map(r=>({...r,getCSS:(()=>async n=>{let o=await r.getCSS(n);if(o)return o.replace(/--un-/g,`--${t}`)})()})):e}var Ko=[[/^(?:animate-)?keyframes-(.+)$/,([,e],{theme:t})=>{let r=t.animation?.keyframes?.[e];if(r)return[`@keyframes ${e}${r}`,{animation:e}]},{autocomplete:["animate-keyframes-$animation.keyframes","keyframes-$animation.keyframes"]}],[/^animate-(.+)$/,([,e],{theme:t})=>{let r=t.animation?.keyframes?.[e];if(r){let n=t.animation?.durations?.[e]??"1s",o=t.animation?.timingFns?.[e]??"linear",a=t.animation?.counts?.[e]??1,i=t.animation?.properties?.[e];return[`@keyframes ${e}${r}`,{animation:`${e} ${n} ${o} ${a}`,...i}]}return{animation:s.bracket.cssvar(e)}},{autocomplete:"animate-$animation.keyframes"}],[/^animate-name-(.+)/,([,e])=>({"animation-name":s.bracket.cssvar(e)??e})],[/^animate-duration-(.+)$/,([,e],{theme:t})=>({"animation-duration":t.duration?.[e||"DEFAULT"]??s.bracket.cssvar.time(e)}),{autocomplete:["animate-duration","animate-duration-$duration"]}],[/^animate-delay-(.+)$/,([,e],{theme:t})=>({"animation-delay":t.duration?.[e||"DEFAULT"]??s.bracket.cssvar.time(e)}),{autocomplete:["animate-delay","animate-delay-$duration"]}],[/^animate-ease(?:-(.+))?$/,([,e],{theme:t})=>({"animation-timing-function":t.easing?.[e||"DEFAULT"]??s.bracket.cssvar(e)}),{autocomplete:["animate-ease","animate-ease-$easing"]}],[/^animate-(fill-mode-|fill-|mode-)?(.+)$/,([,e,t])=>["none","forwards","backwards","both",e?k:[]].includes(t)?{"animation-fill-mode":t}:void 0,{autocomplete:["animate-(fill|mode|fill-mode)","animate-(fill|mode|fill-mode)-(none|forwards|backwards|both|inherit|initial|revert|revert-layer|unset)","animate-(none|forwards|backwards|both|inherit|initial|revert|revert-layer|unset)"]}],[/^animate-(direction-)?(.+)$/,([,e,t])=>["normal","reverse","alternate","alternate-reverse",e?k:[]].includes(t)?{"animation-direction":t}:void 0,{autocomplete:["animate-direction","animate-direction-(normal|reverse|alternate|alternate-reverse|inherit|initial|revert|revert-layer|unset)","animate-(normal|reverse|alternate|alternate-reverse|inherit|initial|revert|revert-layer|unset)"]}],[/^animate-(?:iteration-|count-|iteration-count-)(.+)$/,([,e])=>({"animation-iteration-count":s.bracket.cssvar(e)??e.replace(/\-/g,",")}),{autocomplete:["animate-(iteration|count|iteration-count)","animate-(iteration|count|iteration-count)-"]}],[/^animate-(play-state-|play-|state-)?(.+)$/,([,e,t])=>["paused","running",e?k:[]].includes(t)?{"animation-play-state":t}:void 0,{autocomplete:["animate-(play|state|play-state)","animate-(play|state|play-state)-(paused|running|inherit|initial|revert|revert-layer|unset)","animate-(paused|running|inherit|initial|revert|revert-layer|unset)"]}],["animate-none",{animation:"none"}],...h("animate","animation")];function qo(e){return e?U(e,0):"rgba(255,255,255,0)"}function Js(e,t,r,n){return t?n!=null?U(t,n):U(t,`var(--un-${e}-opacity, ${pe(t)})`):U(r,n)}function en(){return([,e,t],{theme:r})=>{let n=xe(t,r);if(!n)return;let{alpha:o,color:a,cssColor:i}=n;if(!a)return;let c=Js(e,i,a,o);switch(e){case"from":return{"--un-gradient-from-position":"0%","--un-gradient-from":`${c} var(--un-gradient-from-position)`,"--un-gradient-to-position":"100%","--un-gradient-to":`${qo(i)} var(--un-gradient-to-position)`,"--un-gradient-stops":"var(--un-gradient-from), var(--un-gradient-to)"};case"via":return{"--un-gradient-via-position":"50%","--un-gradient-to":qo(i),"--un-gradient-stops":`var(--un-gradient-from), ${c} var(--un-gradient-via-position), var(--un-gradient-to)`};case"to":return{"--un-gradient-to-position":"100%","--un-gradient-to":`${c} var(--un-gradient-to-position)`}}}}function Qs(){return([,e,t])=>({[`--un-gradient-${e}-position`]:`${Number(s.bracket.cssvar.percent(t))*100}%`})}var ec=/^\[url\(.+\)\]$/,tc=/^\[length:.+\]$/,rc=/^\[position:.+\]$/,Yo=[[/^bg-(.+)$/,([,e])=>{if(ec.test(e))return{"--un-url":s.bracket(e),"background-image":"var(--un-url)"};if(tc.test(e)&&s.bracketOfLength(e)!=null)return{"background-size":s.bracketOfLength(e).split(" ").map(t=>s.fraction.auto.px.cssvar(t)??t).join(" ")};if(rc.test(e)&&s.bracketOfPosition(e)!=null)return{"background-position":s.bracketOfPosition(e).split(" ").map(t=>s.position.fraction.auto.px.cssvar(t)??t).join(" ")}}],[/^bg-gradient-(.+)$/,([,e])=>({"--un-gradient":s.bracket(e)}),{autocomplete:["bg-gradient","bg-gradient-(from|to|via)","bg-gradient-(from|to|via)-$colors","bg-gradient-(from|to|via)-(op|opacity)","bg-gradient-(from|to|via)-(op|opacity)-"]}],[/^(?:bg-gradient-)?stops-(\[.+\])$/,([,e])=>({"--un-gradient-stops":s.bracket(e)})],[/^(?:bg-gradient-)?(from)-(.+)$/,en()],[/^(?:bg-gradient-)?(via)-(.+)$/,en()],[/^(?:bg-gradient-)?(to)-(.+)$/,en()],[/^(?:bg-gradient-)?(from|via|to)-op(?:acity)?-?(.+)$/,([,e,t])=>({[`--un-${e}-opacity`]:s.bracket.percent(t)})],[/^(from|via|to)-([\d\.]+)%$/,Qs()],[/^bg-gradient-((?:repeating-)?(?:linear|radial|conic))$/,([,e])=>({"background-image":`${e}-gradient(var(--un-gradient, var(--un-gradient-stops, rgba(255, 255, 255, 0))))`}),{autocomplete:["bg-gradient-repeating","bg-gradient-(linear|radial|conic)","bg-gradient-repeating-(linear|radial|conic)"]}],[/^bg-gradient-to-([rltb]{1,2})$/,([,e])=>{if(e in M)return{"--un-gradient-shape":`to ${M[e]}`,"--un-gradient":"var(--un-gradient-shape), var(--un-gradient-stops)","background-image":"linear-gradient(var(--un-gradient))"}},{autocomplete:`bg-gradient-to-(${Object.keys(M).filter(e=>e.length<=2&&Array.from(e).every(t=>"rltb".includes(t))).join("|")})`}],[/^(?:bg-gradient-)?shape-(.+)$/,([,e])=>{let t=e in M?`to ${M[e]}`:s.bracket(e);if(t!=null)return{"--un-gradient-shape":t,"--un-gradient":"var(--un-gradient-shape), var(--un-gradient-stops)"}},{autocomplete:["bg-gradient-shape",`bg-gradient-shape-(${Object.keys(M).join("|")})`,`shape-(${Object.keys(M).join("|")})`]}],["bg-none",{"background-image":"none"}],["box-decoration-slice",{"box-decoration-break":"slice"}],["box-decoration-clone",{"box-decoration-break":"clone"}],...h("box-decoration","box-decoration-break"),["bg-auto",{"background-size":"auto"}],["bg-cover",{"background-size":"cover"}],["bg-contain",{"background-size":"contain"}],["bg-fixed",{"background-attachment":"fixed"}],["bg-local",{"background-attachment":"local"}],["bg-scroll",{"background-attachment":"scroll"}],["bg-clip-border",{"-webkit-background-clip":"border-box","background-clip":"border-box"}],["bg-clip-content",{"-webkit-background-clip":"content-box","background-clip":"content-box"}],["bg-clip-padding",{"-webkit-background-clip":"padding-box","background-clip":"padding-box"}],["bg-clip-text",{"-webkit-background-clip":"text","background-clip":"text"}],...k.map(e=>[`bg-clip-${e}`,{"-webkit-background-clip":e,"background-clip":e}]),[/^bg-([-\w]{3,})$/,([,e])=>({"background-position":M[e]})],["bg-repeat",{"background-repeat":"repeat"}],["bg-no-repeat",{"background-repeat":"no-repeat"}],["bg-repeat-x",{"background-repeat":"repeat-x"}],["bg-repeat-y",{"background-repeat":"repeat-y"}],["bg-repeat-round",{"background-repeat":"round"}],["bg-repeat-space",{"background-repeat":"space"}],...h("bg-repeat","background-repeat"),["bg-origin-border",{"background-origin":"border-box"}],["bg-origin-padding",{"background-origin":"padding-box"}],["bg-origin-content",{"background-origin":"content-box"}],...h("bg-origin","background-origin")];var tn={disc:"disc",circle:"circle",square:"square",decimal:"decimal","zero-decimal":"decimal-leading-zero",greek:"lower-greek",roman:"lower-roman","upper-roman":"upper-roman",alpha:"lower-alpha","upper-alpha":"upper-alpha",latin:"lower-latin","upper-latin":"upper-latin"},Xo=[[/^list-(.+?)(?:-(outside|inside))?$/,([,e,t])=>{let r=tn[e];if(r)return t?{"list-style-position":t,"list-style-type":r}:{"list-style-type":r}},{autocomplete:[`list-(${Object.keys(tn).join("|")})`,`list-(${Object.keys(tn).join("|")})-(outside|inside)`]}],["list-outside",{"list-style-position":"outside"}],["list-inside",{"list-style-position":"inside"}],["list-none",{"list-style-type":"none"}],[/^list-image-(.+)$/,([,e])=>{if(/^\[url\(.+\)\]$/.test(e))return{"list-style-image":s.bracket(e)}}],["list-image-none",{"list-style-image":"none"}],...h("list","list-style-type")],Zo=[[/^accent-(.+)$/,z("accent-color","accent"),{autocomplete:"accent-$colors"}],[/^accent-op(?:acity)?-?(.+)$/,([,e])=>({"--un-accent-opacity":s.bracket.percent(e)}),{autocomplete:["accent-(op|opacity)","accent-(op|opacity)-"]}]],Jo=[[/^caret-(.+)$/,z("caret-color","caret"),{autocomplete:"caret-$colors"}],[/^caret-op(?:acity)?-?(.+)$/,([,e])=>({"--un-caret-opacity":s.bracket.percent(e)}),{autocomplete:["caret-(op|opacity)","caret-(op|opacity)-"]}]],Qo=[["image-render-auto",{"image-rendering":"auto"}],["image-render-edge",{"image-rendering":"crisp-edges"}],["image-render-pixel",[["-ms-interpolation-mode","nearest-neighbor"],["image-rendering","-webkit-optimize-contrast"],["image-rendering","-moz-crisp-edges"],["image-rendering","-o-pixelated"],["image-rendering","pixelated"]]]],ea=[["overscroll-auto",{"overscroll-behavior":"auto"}],["overscroll-contain",{"overscroll-behavior":"contain"}],["overscroll-none",{"overscroll-behavior":"none"}],...h("overscroll","overscroll-behavior"),["overscroll-x-auto",{"overscroll-behavior-x":"auto"}],["overscroll-x-contain",{"overscroll-behavior-x":"contain"}],["overscroll-x-none",{"overscroll-behavior-x":"none"}],...h("overscroll-x","overscroll-behavior-x"),["overscroll-y-auto",{"overscroll-behavior-y":"auto"}],["overscroll-y-contain",{"overscroll-behavior-y":"contain"}],["overscroll-y-none",{"overscroll-behavior-y":"none"}],...h("overscroll-y","overscroll-behavior-y")],ta=[["scroll-auto",{"scroll-behavior":"auto"}],["scroll-smooth",{"scroll-behavior":"smooth"}],...h("scroll","scroll-behavior")];var ra=[[/^columns-(.+)$/,([,e])=>({columns:s.bracket.global.number.auto.numberWithUnit(e)}),{autocomplete:"columns-"}],["break-before-auto",{"break-before":"auto"}],["break-before-avoid",{"break-before":"avoid"}],["break-before-all",{"break-before":"all"}],["break-before-avoid-page",{"break-before":"avoid-page"}],["break-before-page",{"break-before":"page"}],["break-before-left",{"break-before":"left"}],["break-before-right",{"break-before":"right"}],["break-before-column",{"break-before":"column"}],...h("break-before"),["break-inside-auto",{"break-inside":"auto"}],["break-inside-avoid",{"break-inside":"avoid"}],["break-inside-avoid-page",{"break-inside":"avoid-page"}],["break-inside-avoid-column",{"break-inside":"avoid-column"}],...h("break-inside"),["break-after-auto",{"break-after":"auto"}],["break-after-avoid",{"break-after":"avoid"}],["break-after-all",{"break-after":"all"}],["break-after-avoid-page",{"break-after":"avoid-page"}],["break-after-page",{"break-after":"page"}],["break-after-left",{"break-after":"left"}],["break-after-right",{"break-after":"right"}],["break-after-column",{"break-after":"column"}],...h("break-after")];var nc=/@media \(min-width: (.+)\)/,na=[[/^__container$/,(e,t)=>{let{theme:r,variantHandlers:n}=t,o=r.container?.padding,a;j(o)?a=o:a=o?.DEFAULT;let i=r.container?.maxWidth,c;for(let p of n){let f=p.handle?.({},u=>u)?.parent;if(j(f)){let u=f.match(nc)?.[1];if(u){let g=le(t)??{},m=Object.keys(g).find(C=>g[C]===u);i?m&&(c=i?.[m]):c=u,m&&!j(o)&&(a=o?.[m]??a)}}}let l={"max-width":c};return n.length||(l.width="100%"),r.container?.center&&(l["margin-left"]="auto",l["margin-right"]="auto"),o&&(l["padding-left"]=a,l["padding-right"]=a),l},{internal:!0}]],oa=[[/^(?:(\w+)[:-])?container$/,([,e],t)=>{let r=Object.keys(le(t)??{});if(e){if(!r.includes(e))return;r=r.slice(r.indexOf(e))}let n=r.map(o=>`${o}:__container`);return e||n.unshift("__container"),n}]];var aa={"--un-blur":S,"--un-brightness":S,"--un-contrast":S,"--un-drop-shadow":S,"--un-grayscale":S,"--un-hue-rotate":S,"--un-invert":S,"--un-saturate":S,"--un-sepia":S},$r="var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)",ia={"--un-backdrop-blur":S,"--un-backdrop-brightness":S,"--un-backdrop-contrast":S,"--un-backdrop-grayscale":S,"--un-backdrop-hue-rotate":S,"--un-backdrop-invert":S,"--un-backdrop-opacity":S,"--un-backdrop-saturate":S,"--un-backdrop-sepia":S},kr="var(--un-backdrop-blur) var(--un-backdrop-brightness) var(--un-backdrop-contrast) var(--un-backdrop-grayscale) var(--un-backdrop-hue-rotate) var(--un-backdrop-invert) var(--un-backdrop-opacity) var(--un-backdrop-saturate) var(--un-backdrop-sepia)";function rn(e){let t=s.bracket.cssvar(e||"");if(t!=null||(t=e?s.percent(e):"1",t!=null&&parseFloat(t)<=1))return t}function ee(e,t){return([,r,n],{theme:o})=>{let a=t(n,o)??(n==="none"?"0":"");if(a!=="")return r?{[`--un-${r}${e}`]:`${e}(${a})`,"-webkit-backdrop-filter":kr,"backdrop-filter":kr}:{[`--un-${e}`]:`${e}(${a})`,filter:$r}}}function oc([,e],{theme:t}){let r=t.dropShadow?.[e||"DEFAULT"];if(r!=null)return{"--un-drop-shadow":`drop-shadow(${ye(r,"--un-drop-shadow-color").join(") drop-shadow(")})`,filter:$r};if(r=s.bracket.cssvar(e),r!=null)return{"--un-drop-shadow":`drop-shadow(${r})`,filter:$r}}var sa=[[/^(?:(backdrop-)|filter-)?blur(?:-(.+))?$/,ee("blur",(e,t)=>t.blur?.[e||"DEFAULT"]||s.bracket.cssvar.px(e)),{autocomplete:["(backdrop|filter)-blur-$blur","blur-$blur","filter-blur"]}],[/^(?:(backdrop-)|filter-)?brightness-(.+)$/,ee("brightness",e=>s.bracket.cssvar.percent(e)),{autocomplete:["(backdrop|filter)-brightness-","brightness-"]}],[/^(?:(backdrop-)|filter-)?contrast-(.+)$/,ee("contrast",e=>s.bracket.cssvar.percent(e)),{autocomplete:["(backdrop|filter)-contrast-","contrast-"]}],[/^(?:filter-)?drop-shadow(?:-(.+))?$/,oc,{autocomplete:["filter-drop","filter-drop-shadow","filter-drop-shadow-color","drop-shadow","drop-shadow-color","filter-drop-shadow-$dropShadow","drop-shadow-$dropShadow","filter-drop-shadow-color-$colors","drop-shadow-color-$colors","filter-drop-shadow-color-(op|opacity)","drop-shadow-color-(op|opacity)","filter-drop-shadow-color-(op|opacity)-","drop-shadow-color-(op|opacity)-"]}],[/^(?:filter-)?drop-shadow-color-(.+)$/,z("--un-drop-shadow-color","drop-shadow")],[/^(?:filter-)?drop-shadow-color-op(?:acity)?-?(.+)$/,([,e])=>({"--un-drop-shadow-opacity":s.bracket.percent(e)})],[/^(?:(backdrop-)|filter-)?grayscale(?:-(.+))?$/,ee("grayscale",rn),{autocomplete:["(backdrop|filter)-grayscale","(backdrop|filter)-grayscale-","grayscale-"]}],[/^(?:(backdrop-)|filter-)?hue-rotate-(.+)$/,ee("hue-rotate",e=>s.bracket.cssvar.degree(e))],[/^(?:(backdrop-)|filter-)?invert(?:-(.+))?$/,ee("invert",rn),{autocomplete:["(backdrop|filter)-invert","(backdrop|filter)-invert-","invert-"]}],[/^(backdrop-)op(?:acity)-(.+)$/,ee("opacity",e=>s.bracket.cssvar.percent(e)),{autocomplete:["backdrop-(op|opacity)","backdrop-(op|opacity)-"]}],[/^(?:(backdrop-)|filter-)?saturate-(.+)$/,ee("saturate",e=>s.bracket.cssvar.percent(e)),{autocomplete:["(backdrop|filter)-saturate","(backdrop|filter)-saturate-","saturate-"]}],[/^(?:(backdrop-)|filter-)?sepia(?:-(.+))?$/,ee("sepia",rn),{autocomplete:["(backdrop|filter)-sepia","(backdrop|filter)-sepia-","sepia-"]}],["filter",{filter:$r}],["backdrop-filter",{"-webkit-backdrop-filter":kr,"backdrop-filter":kr}],["filter-none",{filter:"none"}],["backdrop-filter-none",{"-webkit-backdrop-filter":"none","backdrop-filter":"none"}],...k.map(e=>[`filter-${e}`,{filter:e}]),...k.map(e=>[`backdrop-filter-${e}`,{"-webkit-backdrop-filter":e,"backdrop-filter":e}])];var la=[[/^space-?([xy])-?(-?.+)$/,ca,{autocomplete:["space-(x|y|block|inline)","space-(x|y|block|inline)-reverse","space-(x|y|block|inline)-$spacing"]}],[/^space-?([xy])-reverse$/,([,e])=>({[`--un-space-${e}-reverse`]:1})],[/^space-(block|inline)-(-?.+)$/,ca],[/^space-(block|inline)-reverse$/,([,e])=>({[`--un-space-${e}-reverse`]:1})]];function ca([,e,t],{theme:r}){let n=r.spacing?.[t||"DEFAULT"]??s.bracket.cssvar.auto.fraction.rem(t||"1");if(n!=null){n==="0"&&(n="0px");let o=F[e].map(a=>{let i=`margin${a}`,c=a.endsWith("right")||a.endsWith("bottom")?`calc(${n} * var(--un-space-${e}-reverse))`:`calc(${n} * calc(1 - var(--un-space-${e}-reverse)))`;return[i,c]});if(o)return[[`--un-space-${e}-reverse`,0],...o]}}var pa=[["uppercase",{"text-transform":"uppercase"}],["lowercase",{"text-transform":"lowercase"}],["capitalize",{"text-transform":"capitalize"}],["normal-case",{"text-transform":"none"}]],fa=[...["manual","auto","none",...k].map(e=>[`hyphens-${e}`,{"-webkit-hyphens":e,"-ms-hyphens":e,hyphens:e}])],ua=[["write-vertical-right",{"writing-mode":"vertical-rl"}],["write-vertical-left",{"writing-mode":"vertical-lr"}],["write-normal",{"writing-mode":"horizontal-tb"}],...h("write","writing-mode")],da=[["write-orient-mixed",{"text-orientation":"mixed"}],["write-orient-sideways",{"text-orientation":"sideways"}],["write-orient-upright",{"text-orientation":"upright"}],...h("write-orient","text-orientation")],ma=[["sr-only",{position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0,0,0,0)","white-space":"nowrap","border-width":0}],["not-sr-only",{position:"static",width:"auto",height:"auto",padding:"0",margin:"0",overflow:"visible",clip:"auto","white-space":"normal"}]],ga=[["isolate",{isolation:"isolate"}],["isolate-auto",{isolation:"auto"}],["isolation-auto",{isolation:"auto"}]],ba=[["object-cover",{"object-fit":"cover"}],["object-contain",{"object-fit":"contain"}],["object-fill",{"object-fit":"fill"}],["object-scale-down",{"object-fit":"scale-down"}],["object-none",{"object-fit":"none"}],[/^object-(.+)$/,([,e])=>{if(M[e])return{"object-position":M[e]};if(s.bracketOfPosition(e)!=null)return{"object-position":s.bracketOfPosition(e).split(" ").map(t=>s.position.fraction.auto.px.cssvar(t)??t).join(" ")}},{autocomplete:`object-(${Object.keys(M).join("|")})`}]],ha=[["bg-blend-multiply",{"background-blend-mode":"multiply"}],["bg-blend-screen",{"background-blend-mode":"screen"}],["bg-blend-overlay",{"background-blend-mode":"overlay"}],["bg-blend-darken",{"background-blend-mode":"darken"}],["bg-blend-lighten",{"background-blend-mode":"lighten"}],["bg-blend-color-dodge",{"background-blend-mode":"color-dodge"}],["bg-blend-color-burn",{"background-blend-mode":"color-burn"}],["bg-blend-hard-light",{"background-blend-mode":"hard-light"}],["bg-blend-soft-light",{"background-blend-mode":"soft-light"}],["bg-blend-difference",{"background-blend-mode":"difference"}],["bg-blend-exclusion",{"background-blend-mode":"exclusion"}],["bg-blend-hue",{"background-blend-mode":"hue"}],["bg-blend-saturation",{"background-blend-mode":"saturation"}],["bg-blend-color",{"background-blend-mode":"color"}],["bg-blend-luminosity",{"background-blend-mode":"luminosity"}],["bg-blend-normal",{"background-blend-mode":"normal"}],...h("bg-blend","background-blend")],xa=[["mix-blend-multiply",{"mix-blend-mode":"multiply"}],["mix-blend-screen",{"mix-blend-mode":"screen"}],["mix-blend-overlay",{"mix-blend-mode":"overlay"}],["mix-blend-darken",{"mix-blend-mode":"darken"}],["mix-blend-lighten",{"mix-blend-mode":"lighten"}],["mix-blend-color-dodge",{"mix-blend-mode":"color-dodge"}],["mix-blend-color-burn",{"mix-blend-mode":"color-burn"}],["mix-blend-hard-light",{"mix-blend-mode":"hard-light"}],["mix-blend-soft-light",{"mix-blend-mode":"soft-light"}],["mix-blend-difference",{"mix-blend-mode":"difference"}],["mix-blend-exclusion",{"mix-blend-mode":"exclusion"}],["mix-blend-hue",{"mix-blend-mode":"hue"}],["mix-blend-saturation",{"mix-blend-mode":"saturation"}],["mix-blend-color",{"mix-blend-mode":"color"}],["mix-blend-luminosity",{"mix-blend-mode":"luminosity"}],["mix-blend-plus-lighter",{"mix-blend-mode":"plus-lighter"}],["mix-blend-normal",{"mix-blend-mode":"normal"}],...h("mix-blend")];var va={"--un-border-spacing-x":0,"--un-border-spacing-y":0},ya="var(--un-border-spacing-x) var(--un-border-spacing-y)",$a=[["inline-table",{display:"inline-table"}],["table",{display:"table"}],["table-caption",{display:"table-caption"}],["table-cell",{display:"table-cell"}],["table-column",{display:"table-column"}],["table-column-group",{display:"table-column-group"}],["table-footer-group",{display:"table-footer-group"}],["table-header-group",{display:"table-header-group"}],["table-row",{display:"table-row"}],["table-row-group",{display:"table-row-group"}],["border-collapse",{"border-collapse":"collapse"}],["border-separate",{"border-collapse":"separate"}],[/^border-spacing-(.+)$/,([,e],{theme:t})=>{let r=t.spacing?.[e]??s.bracket.cssvar.global.auto.fraction.rem(e);if(r!=null)return{"--un-border-spacing-x":r,"--un-border-spacing-y":r,"border-spacing":ya}},{autocomplete:["border-spacing","border-spacing-$spacing"]}],[/^border-spacing-([xy])-(.+)$/,([,e,t],{theme:r})=>{let n=r.spacing?.[t]??s.bracket.cssvar.global.auto.fraction.rem(t);if(n!=null)return{[`--un-border-spacing-${e}`]:n,"border-spacing":ya}},{autocomplete:["border-spacing-(x|y)","border-spacing-(x|y)-$spacing"]}],["caption-top",{"caption-side":"top"}],["caption-bottom",{"caption-side":"bottom"}],["table-auto",{"table-layout":"auto"}],["table-fixed",{"table-layout":"fixed"}],["table-empty-cells-visible",{"empty-cells":"show"}],["table-empty-cells-hidden",{"empty-cells":"hide"}]];var ac={"bg-blend":"background-blend-mode","bg-clip":"-webkit-background-clip","bg-gradient":"linear-gradient","bg-image":"background-image","bg-origin":"background-origin","bg-position":"background-position","bg-repeat":"background-repeat","bg-size":"background-size","mix-blend":"mix-blend-mode",object:"object-fit","object-position":"object-position",write:"writing-mode","write-orient":"text-orientation"},ka=[[/^(.+?)-(\$.+)$/,([,e,t])=>{let r=ac[e];if(r)return{[r]:s.cssvar(t)}}]];var wa=[[/^divide-?([xy])$/,wr,{autocomplete:["divide-(x|y|block|inline)","divide-(x|y|block|inline)-reverse","divide-(x|y|block|inline)-$lineWidth"]}],[/^divide-?([xy])-?(-?.+)$/,wr],[/^divide-?([xy])-reverse$/,([,e])=>({[`--un-divide-${e}-reverse`]:1})],[/^divide-(block|inline)$/,wr],[/^divide-(block|inline)-(-?.+)$/,wr],[/^divide-(block|inline)-reverse$/,([,e])=>({[`--un-divide-${e}-reverse`]:1})],[/^divide-(.+)$/,z("border-color","divide"),{autocomplete:"divide-$colors"}],[/^divide-op(?:acity)?-?(.+)$/,([,e])=>({"--un-divide-opacity":s.bracket.percent(e)}),{autocomplete:["divide-(op|opacity)","divide-(op|opacity)-"]}],...fe.map(e=>[`divide-${e}`,{"border-style":e}])];function wr([,e,t],{theme:r}){let n=r.lineWidth?.[t||"DEFAULT"]??s.bracket.cssvar.px(t||"1");if(n!=null){n==="0"&&(n="0px");let o=F[e].map(a=>{let i=`border${a}-width`,c=a.endsWith("right")||a.endsWith("bottom")?`calc(${n} * var(--un-divide-${e}-reverse))`:`calc(${n} * calc(1 - var(--un-divide-${e}-reverse)))`;return[i,c]});if(o)return[[`--un-divide-${e}-reverse`,0],...o]}}var Sa=[[/^line-clamp-(\d+)$/,([,e])=>({overflow:"hidden",display:"-webkit-box","-webkit-box-orient":"vertical","-webkit-line-clamp":e,"line-clamp":e}),{autocomplete:["line-clamp","line-clamp-"]}],...["none",...k].map(e=>[`line-clamp-${e}`,{overflow:"visible",display:"block","-webkit-box-orient":"horizontal","-webkit-line-clamp":e,"line-clamp":e}])];var Ca={"--un-ordinal":S,"--un-slashed-zero":S,"--un-numeric-figure":S,"--un-numeric-spacing":S,"--un-numeric-fraction":S};function se(e){return{...e,"font-variant-numeric":"var(--un-ordinal) var(--un-slashed-zero) var(--un-numeric-figure) var(--un-numeric-spacing) var(--un-numeric-fraction)"}}var Ra=[[/^ordinal$/,()=>se({"--un-ordinal":"ordinal"}),{autocomplete:"ordinal"}],[/^slashed-zero$/,()=>se({"--un-slashed-zero":"slashed-zero"}),{autocomplete:"slashed-zero"}],[/^lining-nums$/,()=>se({"--un-numeric-figure":"lining-nums"}),{autocomplete:"lining-nums"}],[/^oldstyle-nums$/,()=>se({"--un-numeric-figure":"oldstyle-nums"}),{autocomplete:"oldstyle-nums"}],[/^proportional-nums$/,()=>se({"--un-numeric-spacing":"proportional-nums"}),{autocomplete:"proportional-nums"}],[/^tabular-nums$/,()=>se({"--un-numeric-spacing":"tabular-nums"}),{autocomplete:"tabular-nums"}],[/^diagonal-fractions$/,()=>se({"--un-numeric-fraction":"diagonal-fractions"}),{autocomplete:"diagonal-fractions"}],[/^stacked-fractions$/,()=>se({"--un-numeric-fraction":"stacked-fractions"}),{autocomplete:"stacked-fractions"}],["normal-nums",{"font-variant-numeric":"normal"}]];var za={"--un-pan-x":S,"--un-pan-y":S,"--un-pinch-zoom":S},nn="var(--un-pan-x) var(--un-pan-y) var(--un-pinch-zoom)",Ta=[[/^touch-pan-(x|left|right)$/,([,e])=>({"--un-pan-x":`pan-${e}`,"touch-action":nn}),{autocomplete:["touch-pan","touch-pan-(x|left|right|y|up|down)"]}],[/^touch-pan-(y|up|down)$/,([,e])=>({"--un-pan-y":`pan-${e}`,"touch-action":nn})],["touch-pinch-zoom",{"--un-pinch-zoom":"pinch-zoom","touch-action":nn}],["touch-auto",{"touch-action":"auto"}],["touch-manipulation",{"touch-action":"manipulation"}],["touch-none",{"touch-action":"none"}],...h("touch","touch-action")];var ja={"--un-scroll-snap-strictness":"proximity"},Ea=[[/^snap-(x|y)$/,([,e])=>({"scroll-snap-type":`${e} var(--un-scroll-snap-strictness)`}),{autocomplete:"snap-(x|y|both)"}],[/^snap-both$/,()=>({"scroll-snap-type":"both var(--un-scroll-snap-strictness)"})],["snap-mandatory",{"--un-scroll-snap-strictness":"mandatory"}],["snap-proximity",{"--un-scroll-snap-strictness":"proximity"}],["snap-none",{"scroll-snap-type":"none"}],["snap-start",{"scroll-snap-align":"start"}],["snap-end",{"scroll-snap-align":"end"}],["snap-center",{"scroll-snap-align":"center"}],["snap-align-none",{"scroll-snap-align":"none"}],["snap-normal",{"scroll-snap-stop":"normal"}],["snap-always",{"scroll-snap-stop":"always"}],[/^scroll-ma?()-?(-?.+)$/,A("scroll-margin"),{autocomplete:["scroll-(m|p|ma|pa|block|inline)","scroll-(m|p|ma|pa|block|inline)-$spacing","scroll-(m|p|ma|pa|block|inline)-(x|y|r|l|t|b|bs|be|is|ie)","scroll-(m|p|ma|pa|block|inline)-(x|y|r|l|t|b|bs|be|is|ie)-$spacing"]}],[/^scroll-m-?([xy])-?(-?.+)$/,A("scroll-margin")],[/^scroll-m-?([rltb])-?(-?.+)$/,A("scroll-margin")],[/^scroll-m-(block|inline)-(-?.+)$/,A("scroll-margin")],[/^scroll-m-?([bi][se])-?(-?.+)$/,A("scroll-margin")],[/^scroll-pa?()-?(-?.+)$/,A("scroll-padding")],[/^scroll-p-?([xy])-?(-?.+)$/,A("scroll-padding")],[/^scroll-p-?([rltb])-?(-?.+)$/,A("scroll-padding")],[/^scroll-p-(block|inline)-(-?.+)$/,A("scroll-padding")],[/^scroll-p-?([bi][se])-?(-?.+)$/,A("scroll-padding")]];var Va=[[/^\$ placeholder-(.+)$/,z("color","placeholder"),{autocomplete:"placeholder-$colors"}],[/^\$ placeholder-op(?:acity)?-?(.+)$/,([,e])=>({"--un-placeholder-opacity":s.bracket.percent(e)}),{autocomplete:["placeholder-(op|opacity)","placeholder-(op|opacity)-"]}]];var Aa=[gr,ka,br,na,Kt,ma,qt,Gt,Mt,Dt,Sa,ga,Bt,Ut,Ot,Lt,ur,Nt,Ht,pr,lr,Rt,$a,mr,Ko,It,Ta,Xt,Yt,Ea,Xo,bt,ra,Ft,Pe,Oe,At,Wt,la,wa,_t,ea,ta,tr,Zt,er,xt,$t,Yo,xr,ba,fr,ft,jt,pt,zt,rr,pa,nr,Ra,vt,wt,or,Tt,Et,Vt,fa,ua,da,Jo,Zo,yt,ha,xa,cr,gt,ir,Qo,sa,Ct,ht,Jt,Qt,Va,kt,hr].flat(1);var Oa=[...oa];var on={inherit:"inherit",current:"currentColor",transparent:"transparent",black:"#000",white:"#fff",rose:{50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337",950:"#4c0519"},pink:{50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843",950:"#500724"},fuchsia:{50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75",950:"#4a044e"},purple:{50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87",950:"#3b0764"},violet:{50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95",950:"#2e1065"},indigo:{50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81",950:"#1e1b4b"},blue:{50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a",950:"#172554"},sky:{50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e",950:"#082f49"},cyan:{50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63",950:"#083344"},teal:{50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},emerald:{50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b",950:"#022c22"},green:{50:"#f0fdf4",100:"#dcfce7",200:"#bbf7d0",300:"#86efac",400:"#4ade80",500:"#22c55e",600:"#16a34a",700:"#15803d",800:"#166534",900:"#14532d",950:"#052e16"},lime:{50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314",950:"#1a2e05"},yellow:{50:"#fefce8",100:"#fef9c3",200:"#fef08a",300:"#fde047",400:"#facc15",500:"#eab308",600:"#ca8a04",700:"#a16207",800:"#854d0e",900:"#713f12",950:"#422006"},amber:{50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},orange:{50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12",950:"#431407"},red:{50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d",950:"#450a0a"},gray:{50:"#f9fafb",100:"#f3f4f6",200:"#e5e7eb",300:"#d1d5db",400:"#9ca3af",500:"#6b7280",600:"#4b5563",700:"#374151",800:"#1f2937",900:"#111827",950:"#030712"},slate:{50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a",950:"#020617"},zinc:{50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b",950:"#09090b"},neutral:{50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717",950:"#0a0a0a"},stone:{50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917",950:"#0c0a09"},light:{50:"#fdfdfd",100:"#fcfcfc",200:"#fafafa",300:"#f8f9fa",400:"#f6f6f6",500:"#f2f2f2",600:"#f1f3f5",700:"#e9ecef",800:"#dee2e6",900:"#dde1e3",950:"#d8dcdf"},dark:{50:"#4a4a4a",100:"#3c3c3c",200:"#323232",300:"#2d2d2d",400:"#222222",500:"#1f1f1f",600:"#1c1c1e",700:"#1b1b1b",800:"#181818",900:"#0f0f0f",950:"#080808"},get lightblue(){return this.sky},get lightBlue(){return this.sky},get warmgray(){return this.stone},get warmGray(){return this.stone},get truegray(){return this.neutral},get trueGray(){return this.neutral},get coolgray(){return this.gray},get coolGray(){return this.gray},get bluegray(){return this.slate},get blueGray(){return this.slate}};Object.values(on).forEach(e=>{typeof e!="string"&&e!==void 0&&(e.DEFAULT=e.DEFAULT||e[400],Object.keys(e).forEach(t=>{let r=+t/100;r===Math.round(r)&&(e[r]=e[t])}))});var J={l:["-left"],r:["-right"],t:["-top"],b:["-bottom"],s:["-inline-start"],e:["-inline-end"],x:["-left","-right"],y:["-top","-bottom"],"":[""],bs:["-block-start"],be:["-block-end"],is:["-inline-start"],ie:["-inline-end"],block:["-block-start","-block-end"],inline:["-inline-start","-inline-end"]},ic={...J,s:["-inset-inline-start"],start:["-inset-inline-start"],e:["-inset-inline-end"],end:["-inset-inline-end"],bs:["-inset-block-start"],be:["-inset-block-end"],is:["-inset-inline-start"],ie:["-inset-inline-end"],block:["-inset-block-start","-inset-block-end"],inline:["-inset-inline-start","-inset-inline-end"]},an={l:["-top-left","-bottom-left"],r:["-top-right","-bottom-right"],t:["-top-left","-top-right"],b:["-bottom-left","-bottom-right"],tl:["-top-left"],lt:["-top-left"],tr:["-top-right"],rt:["-top-right"],bl:["-bottom-left"],lb:["-bottom-left"],br:["-bottom-right"],rb:["-bottom-right"],"":[""],bs:["-start-start","-start-end"],be:["-end-start","-end-end"],s:["-end-start","-start-start"],is:["-end-start","-start-start"],e:["-start-end","-end-end"],ie:["-start-end","-end-end"],ss:["-start-start"],"bs-is":["-start-start"],"is-bs":["-start-start"],se:["-start-end"],"bs-ie":["-start-end"],"ie-bs":["-start-end"],es:["-end-start"],"be-is":["-end-start"],"is-be":["-end-start"],ee:["-end-end"],"be-ie":["-end-end"],"ie-be":["-end-end"]},Rr={x:["-x"],y:["-y"],z:["-z"],"":["-x","-y"]},Pa=["top","top center","top left","top right","bottom","bottom center","bottom left","bottom right","left","left center","left top","left bottom","right","right center","right top","right bottom","center","center top","center bottom","center left","center right","center center"],Ne=Object.assign({},...Pa.map(e=>({[e.replace(/ /,"-")]:e})),...Pa.map(e=>({[e.replace(/\b(\w)\w+/g,"$1").replace(/ /,"")]:e}))),K=["inherit","initial","revert","revert-layer","unset"],He=/^(-?\d*(?:\.\d+)?)(px|pt|pc|%|r?(?:em|ex|lh|cap|ch|ic)|(?:[sld]?v|cq)(?:[whib]|min|max)|in|cm|mm|rpx)?$/i,_a=/^(-?\d*(?:\.\d+)?)$/i,Ma=/^(px)$/i,sc=["color","border-color","background-color","flex-grow","flex","flex-shrink","caret-color","font","gap","opacity","visibility","z-index","font-weight","zoom","text-shadow","transform","box-shadow","background-position","left","right","top","bottom","object-position","max-height","min-height","max-width","min-width","height","width","border-width","margin","padding","outline-width","outline-offset","font-size","line-height","text-indent","vertical-align","border-spacing","letter-spacing","word-spacing","stroke","filter","backdrop-filter","fill","mask","mask-size","mask-border","clip-path","clip","border-radius"];function I(e){return e.toFixed(10).replace(/\.0+$/,"").replace(/(\.\d+?)0+$/,"$1")}function cc(e){let t=e.match(He);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(n&&!Number.isNaN(o))return`${I(o)}${n}`}function lc(e){if(e==="auto"||e==="a")return"auto"}function pc(e){if(e.match(Ma))return`1${e}`;let t=e.match(He);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${I(o)}${n}`:`${I(o/4)}rem`}function fc(e){if(e.match(Ma))return`1${e}`;let t=e.match(He);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${I(o)}${n}`:`${I(o)}px`}function uc(e){if(!_a.test(e))return;let t=parseFloat(e);if(!Number.isNaN(t))return I(t)}function dc(e){if(e.endsWith("%")&&(e=e.slice(0,-1)),!_a.test(e))return;let t=parseFloat(e);if(!Number.isNaN(t))return`${I(t/100)}`}function mc(e){if(e==="full")return"100%";let[t,r]=e.split("/"),n=parseFloat(t)/parseFloat(r);if(!Number.isNaN(n))return n===0?"0":`${I(n*100)}%`}var gc=/^\[(color|length|position|quoted|string):/i;function zr(e,t){if(e&&e.startsWith("[")&&e.endsWith("]")){let r,n,o=e.match(gc);if(o?(t||(n=o[1]),r=e.slice(o[0].length,-1)):r=e.slice(1,-1),!r||r==='=""')return;r.startsWith("--")&&(r=`var(${r})`);let a=0;for(let i of r)if(i==="[")a+=1;else if(i==="]"&&(a-=1,a<0))return;if(a)return;switch(n){case"string":return r.replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_");case"quoted":return r.replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_").replace(/(["\\])/g,"\\$1").replace(/^(.+)$/,'"$1"')}return r.replace(/(url\(.*?\))/g,i=>i.replace(/_/g,"\\_")).replace(/(^|[^\\])_/g,"$1 ").replace(/\\_/g,"_").replace(/(?:calc|clamp|max|min)\((.*)/g,i=>{let c=[];return i.replace(/var\((--.+?)[,)]/g,(l,p)=>(c.push(p),l.replace(p,"--un-calc"))).replace(/(-?\d*\.?\d(?!\b-\d.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g,"$1 $2 ").replace(/--un-calc/g,()=>c.shift())})}}function bc(e){return zr(e)}function hc(e){return zr(e,"color")}function xc(e){return zr(e,"length")}function yc(e){return zr(e,"position")}function vc(e){if(e.match(/^\$\S/))return`var(--${ae(e.slice(1))})`}function $c(e){let t=e.match(/^(-?[0-9.]+)(s|ms)?$/i);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0&&!n?"0s":n?`${I(o)}${n}`:`${I(o)}ms`}function kc(e){let t=e.match(/^(-?[0-9.]+)(deg|rad|grad|turn)?$/i);if(!t)return;let[,r,n]=t,o=parseFloat(r);if(!Number.isNaN(o))return o===0?"0":n?`${I(o)}${n}`:`${I(o)}deg`}function wc(e){if(K.includes(e))return e}function Sc(e){if(e.split(",").every(t=>sc.includes(t)))return e}function Cc(e){if(["top","left","right","bottom","center"].includes(e))return e}var Rc={__proto__:null,numberWithUnit:cc,auto:lc,rem:pc,px:fc,number:uc,percent:dc,fraction:mc,bracket:bc,bracketOfColor:hc,bracketOfLength:xc,bracketOfPosition:yc,cssvar:vc,time:$c,degree:kc,global:wc,properties:Sc,position:Cc},b=ot(Rc);function Sr(e,t){let r=e.colors,n=-1;for(let o of t){if(n+=1,r&&typeof r!="string"){let a=t.slice(n).join("-").replace(/(-[a-z])/g,i=>i.slice(1).toUpperCase());if(r[a])return r[a];if(r[o]){r=r[o];continue}}return}return r}function sn(e,t){let r=e.split(/(?:\/|:)/);return r[0]===`[${t}`?[r.slice(0,2).join(":"),r[2]]:r}function Tr(e,t){let[r,n]=sn(e,"color"),o=r.replace(/([a-z])([0-9])/g,"$1-$2").split(/-/g),[a]=o;if(!a)return;let i,c=b.bracketOfColor(r),l=c||r;if(b.numberWithUnit(l))return;if(l.match(/^#[\da-fA-F]+/g)?i=l:l.match(/^hex-[\da-fA-F]+/g)?i=`#${l.slice(4)}`:r.startsWith("$")&&(i=b.cssvar(r)),i=i||c,!i){let f=Sr(t,[r]);typeof f=="string"&&(i=f)}let p="DEFAULT";if(!i){let f,[u]=o.slice(-1);u.match(/^\d+$/)?(p=u,f=Sr(t,o.slice(0,-1)),!f||typeof f=="string"?i=void 0:i=f[p]):(f=Sr(t,o),!f&&o.length<=2&&([,p=p]=o,f=Sr(t,[a])),typeof f=="string"?i=f:p&&f&&(i=f[p]))}return{opacity:n,name:a,no:p,color:i,cssColor:Da(i),alpha:b.bracket.cssvar.percent(n??"")}}function Q(e,t,r){return([,n],{theme:o})=>{let a=Tr(n,o);if(!a)return;let{alpha:i,color:c,cssColor:l}=a,p={};if(l?i!=null?p[e]=te(l,i):(p[`--un-${t}-opacity`]=jr(l),p[e]=te(l,`var(--un-${t}-opacity)`)):c&&(p[e]=te(c,i)),r?.(p)!==!1)return p}}function Ua(e,t){let r=[];e=T(e);for(let n=0;n[`${e}-${r}`,{[t??e]:r}])}function zc(e,t,r,n){if(e===""||(j(n)&&(n=[n]),n.length===0))return;let o=e.length,a=0;for(let i=0;ir)return;let a=zc(e,"(",")",t);if(!a)return;let[i,c]=a;n.push(i),e=c}if(n.length>0)return n}var cn=["hsl","hsla","hwb","lab","lch","oklab","oklch","rgb","rgba"],Wa=["%alpha",""],Tc=new RegExp(Wa.map(e=>Y(e)).join("|"));function Da(e=""){let t=jc(e);if(t==null||t===!1)return;let{type:r,components:n,alpha:o}=t,a=r.toLowerCase();if(n.length!==0&&!(["rgba","hsla"].includes(a)&&o==null)&&!(cn.includes(a)&&![1,3].includes(n.length)))return{type:a,components:n.map(i=>typeof i=="string"?i.trim():i),alpha:typeof o=="string"?o.trim():o}}function jr(e){let t=e.alpha??1;return typeof t=="string"&&Wa.includes(t)?1:t}function te(e,t){if(typeof e=="string")return e.replace(Tc,`${t??1}`);let{components:r}=e,{alpha:n,type:o}=e;return n=t??n,o=o.toLowerCase(),["hsla","hsl","rgba","rgb"].includes(o)?`${o.replace("a","")}a(${r.join(",")}${n==null?"":`,${n}`})`:(n=n==null?"":` / ${n}`,cn.includes(o)?`${o}(${r.join(" ")}${n})`:`color(${o} ${r.join(" ")}${n})`)}function jc(e){if(!e)return;let t=Ec(e);if(t!=null||(t=Vc(e),t!=null)||(t=Ac(e),t!=null)||(t=Pc(e),t!=null)||(t=_c(e),t!=null))return t}function Ec(e){let[,t]=e.match(/^#([\da-f]+)$/i)||[];if(t)switch(t.length){case 3:case 4:let r=Array.from(t,o=>Number.parseInt(o,16)).map(o=>o<<4|o);return{type:"rgb",components:r.slice(0,3),alpha:t.length===3?void 0:Math.round(r[3]/255*100)/100};case 6:case 8:let n=Number.parseInt(t,16);return{type:"rgb",components:t.length===6?[n>>16&255,n>>8&255,n&255]:[n>>24&255,n>>16&255,n>>8&255],alpha:t.length===6?void 0:Math.round((n&255)/255*100)/100}}}function Vc(e){let t={rebeccapurple:[102,51,153,1]}[e];if(t!=null)return{type:"rgb",components:t.slice(0,3),alpha:t[3]}}function Ac(e){let t=e.match(/^(rgb|rgba|hsl|hsla)\((.+)\)$/i);if(!t)return;let[,r,n]=t,o=Cr(n,",",5);if(o){if([3,4].includes(o.length))return{type:r,components:o.slice(0,3),alpha:o[3]};if(o.length!==1)return!1}}var Oc=new RegExp(`^(${cn.join("|")})\\((.+)\\)$`,"i");function Pc(e){let t=e.match(Oc);if(!t)return;let[,r,n]=t,o=La(`${r} ${n}`);if(o){let{alpha:a,components:[i,...c]}=o;return{type:i,components:c,alpha:a}}}function _c(e){let t=e.match(/^color\((.+)\)$/);if(!t)return;let r=La(t[1]);if(r){let{alpha:n,components:[o,...a]}=r;return{type:o,components:a,alpha:n}}}function La(e){let t=Cr(e," ");if(!t)return;let r=t.length;if(t[r-2]==="/")return{components:t.slice(0,r-2),alpha:t[r-1]};if(t[r-2]!=null&&(t[r-2].endsWith("/")||t[r-1].startsWith("/"))){let a=t.splice(r-2);t.push(a.join(" ")),--r}let n=Cr(t[r-1],"/",2);if(!n)return;if(n.length===1||n[n.length-1]==="")return{components:t};let o=n.pop();return t[r-1]=n.join("/"),{components:t,alpha:o}}var Ba={mid:"middle",base:"baseline",btm:"bottom",baseline:"baseline",top:"top",start:"top",middle:"middle",bottom:"bottom",end:"bottom","text-top":"text-top","text-bottom":"text-bottom",sub:"sub",super:"super",...Object.fromEntries(K.map(e=>[e,e]))},yd=[[/^(?:vertical|align|v)-([-\w]+)$/,([,e])=>({"vertical-align":Ba[e]}),{autocomplete:`(vertical|align|v)-(${Object.keys(Ba).join("|")})`}]],vd=["center","left","right","justify","start","end"].map(e=>[`text-${e}`,{"text-align":e}]),$d=[[/^outline-(?:width-|size-)?(.+)$/,([,e],{theme:t})=>({"outline-width":t.lineWidth?.[e]??b.bracket.cssvar.global.px(e)}),{autocomplete:"outline-(width|size)-"}],[/^outline-(?:color-)?(.+)$/,Q("outline-color","outline-color"),{autocomplete:"outline-$colors"}],[/^outline-offset-(.+)$/,([,e],{theme:t})=>({"outline-offset":t.lineWidth?.[e]??b.bracket.cssvar.global.px(e)}),{autocomplete:"outline-(offset)-"}],["outline",{"outline-style":"solid"}],...["auto","dashed","dotted","double","hidden","solid","groove","ridge","inset","outset",...K].map(e=>[`outline-${e}`,{"outline-style":e}]),["outline-none",{outline:"2px solid transparent","outline-offset":"2px"}]];var Xe=["solid","dashed","dotted","double","hidden","none","groove","ridge","inset","outset",...K],kd=[[/^(?:border|b)()(?:-(.+))?$/,Ge,{autocomplete:"(border|b)-"}],[/^(?:border|b)-([xy])(?:-(.+))?$/,Ge],[/^(?:border|b)-([rltbse])(?:-(.+))?$/,Ge],[/^(?:border|b)-(block|inline)(?:-(.+))?$/,Ge],[/^(?:border|b)-([bi][se])(?:-(.+))?$/,Ge],[/^(?:border|b)-()(?:width|size)-(.+)$/,we,{autocomplete:["(border|b)-","(border|b)--"]}],[/^(?:border|b)-([xy])-(?:width|size)-(.+)$/,we],[/^(?:border|b)-([rltbse])-(?:width|size)-(.+)$/,we],[/^(?:border|b)-(block|inline)-(?:width|size)-(.+)$/,we],[/^(?:border|b)-([bi][se])-(?:width|size)-(.+)$/,we],[/^(?:border|b)-()(?:color-)?(.+)$/,Ie,{autocomplete:["(border|b)-$colors","(border|b)--$colors"]}],[/^(?:border|b)-([xy])-(?:color-)?(.+)$/,Ie],[/^(?:border|b)-([rltbse])-(?:color-)?(.+)$/,Ie],[/^(?:border|b)-(block|inline)-(?:color-)?(.+)$/,Ie],[/^(?:border|b)-([bi][se])-(?:color-)?(.+)$/,Ie],[/^(?:border|b)-()op(?:acity)?-?(.+)$/,Ke,{autocomplete:"(border|b)-(op|opacity)-"}],[/^(?:border|b)-([xy])-op(?:acity)?-?(.+)$/,Ke],[/^(?:border|b)-([rltbse])-op(?:acity)?-?(.+)$/,Ke],[/^(?:border|b)-(block|inline)-op(?:acity)?-?(.+)$/,Ke],[/^(?:border|b)-([bi][se])-op(?:acity)?-?(.+)$/,Ke],[/^(?:border-|b-)?(?:rounded|rd)()(?:-(.+))?$/,qe,{autocomplete:["(border|b)-(rounded|rd)","(border|b)-(rounded|rd)-","(rounded|rd)","(rounded|rd)-"]}],[/^(?:border-|b-)?(?:rounded|rd)-([rltbse])(?:-(.+))?$/,qe],[/^(?:border-|b-)?(?:rounded|rd)-([rltb]{2})(?:-(.+))?$/,qe],[/^(?:border-|b-)?(?:rounded|rd)-([bise][se])(?:-(.+))?$/,qe],[/^(?:border-|b-)?(?:rounded|rd)-([bi][se]-[bi][se])(?:-(.+))?$/,qe],[/^(?:border|b)-(?:style-)?()(.+)$/,Ye,{autocomplete:["(border|b)-style",`(border|b)-(${Xe.join("|")})`,"(border|b)--style",`(border|b)--(${Xe.join("|")})`,`(border|b)--style-(${Xe.join("|")})`,`(border|b)-style-(${Xe.join("|")})`]}],[/^(?:border|b)-([xy])-(?:style-)?(.+)$/,Ye],[/^(?:border|b)-([rltbse])-(?:style-)?(.+)$/,Ye],[/^(?:border|b)-(block|inline)-(?:style-)?(.+)$/,Ye],[/^(?:border|b)-([bi][se])-(?:style-)?(.+)$/,Ye]];function Mc(e){return([,t],r)=>{let n=Tr(t,r);if(!n)return;let{alpha:o,color:a,cssColor:i}=n;if(i)return o!=null?{[`border${e}-color`]:te(i,o)}:e===""?{"--un-border-opacity":jr(i),"border-color":te(i,"var(--un-border-opacity)")}:{"--un-border-opacity":jr(i),[`--un-border${e}-opacity`]:"var(--un-border-opacity)",[`border${e}-color`]:te(i,`var(--un-border${e}-opacity)`)};if(a)return{[`border${e}-color`]:te(a,o)}}}function Ge(e,t){return we(e,t)}function we([,e="",t],{theme:r}){let n=r.lineWidth?.[t||"DEFAULT"]??b.bracket.cssvar.global.px(t||"1");if(e in J&&n!=null)return J[e].map(o=>[`border${o}-width`,n])}function Ie([,e="",t],{theme:r}){if(e in J&&Fa(t,r))return Object.assign({},...J[e].map(n=>Mc(n)(["",t],r)))}function Ke([,e="",t]){let r=b.bracket.percent.cssvar(t);if(e in J&&r!=null)return J[e].map(n=>[`--un-border${n}-opacity`,r])}function qe([,e="",t],{theme:r}){let n=r.borderRadius?.[t||"DEFAULT"]||b.bracket.cssvar.global.fraction.rem(t||"1");if(e in an&&n!=null)return an[e].map(o=>[`border${o}-radius`,n])}function Ye([,e="",t]){if(Xe.includes(t)&&e in J)return J[e].map(r=>[`border${r}-style`,t])}var wd=[[/^(?:color|c)-(.+)$/,Q("color","text"),{autocomplete:"(color|c)-$colors"}],[/^text-(.+)$/,Q("color","text",e=>!e.color?.toString().match(He)),{autocomplete:"text-$colors"}],[/^(?:text|color|c)-(.+)$/,([,e])=>K.includes(e)?{color:e}:void 0,{autocomplete:`(text|color|c)-(${K.join("|")})`}],[/^(?:text|color|c)-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"(text|color|c)-(op|opacity)-"}]],Sd=[[/^bg-(.+)$/,Q("background-color","bg"),{autocomplete:"bg-$colors"}],[/^bg-op(?:acity)?-?(.+)$/,([,e])=>({"--un-bg-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"bg-(op|opacity)-"}]],Na=["solid","double","dotted","dashed","wavy",...K],Cd=[[/^(?:decoration-)?(underline|overline|line-through)$/,([,e])=>({"text-decoration-line":e}),{autocomplete:"decoration-(underline|overline|line-through)"}],[/^(?:underline|decoration)-(?:size-)?(.+)$/,([,e],{theme:t})=>({"text-decoration-thickness":t.lineWidth?.[e]??b.bracket.cssvar.global.px(e)}),{autocomplete:"(underline|decoration)-"}],[/^(?:underline|decoration)-(auto|from-font)$/,([,e])=>({"text-decoration-thickness":e}),{autocomplete:"(underline|decoration)-(auto|from-font)"}],[/^(?:underline|decoration)-(.+)$/,(e,t)=>{let r=Q("text-decoration-color","line")(e,t);if(r)return{"-webkit-text-decoration-color":r["text-decoration-color"],...r}},{autocomplete:"(underline|decoration)-$colors"}],[/^(?:underline|decoration)-op(?:acity)?-?(.+)$/,([,e])=>({"--un-line-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"(underline|decoration)-(op|opacity)-"}],[/^(?:underline|decoration)-offset-(.+)$/,([,e],{theme:t})=>({"text-underline-offset":t.lineWidth?.[e]??b.auto.bracket.cssvar.global.px(e)}),{autocomplete:"(underline|decoration)-(offset)-"}],...Na.map(e=>[`underline-${e}`,{"text-decoration-style":e}]),...Na.map(e=>[`decoration-${e}`,{"text-decoration-style":e}]),["no-underline",{"text-decoration":"none"}],["decoration-none",{"text-decoration":"none"}]],Vr={all:"all",colors:["color","background-color","border-color","outline-color","text-decoration-color","fill","stroke"].join(","),none:"none",opacity:"opacity",shadow:"box-shadow",transform:"transform"};function Ha(e){return b.properties(e)??Vr[e]}var Rd=[[/^transition(?:-([a-z-]+(?:,[a-z-]+)*))?(?:-(\d+))?$/,([,e,t],{theme:r})=>{let n=e!=null?Ha(e):[Vr.colors,"opacity","box-shadow","transform","filter","backdrop-filter"].join(",");if(n){let o=r.duration?.[t||"DEFAULT"]??b.time(t||"150");return{"transition-property":n,"transition-timing-function":"cubic-bezier(0.4, 0, 0.2, 1)","transition-duration":o}}},{autocomplete:`transition-(${Object.keys(Vr).join("|")})`}],[/^(?:transition-)?duration-(.+)$/,([,e],{theme:t})=>({"transition-duration":t.duration?.[e||"DEFAULT"]??b.bracket.cssvar.time(e)}),{autocomplete:["transition-duration-$duration","duration-$duration"]}],[/^(?:transition-)?delay-(.+)$/,([,e],{theme:t})=>({"transition-delay":t.duration?.[e||"DEFAULT"]??b.bracket.cssvar.time(e)}),{autocomplete:["transition-delay-$duration","delay-$duration"]}],[/^(?:transition-)?ease(?:-(.+))?$/,([,e],{theme:t})=>({"transition-timing-function":t.easing?.[e||"DEFAULT"]??b.bracket.cssvar(e)}),{autocomplete:["transition-ease-(linear|in|out|in-out|DEFAULT)","ease-(linear|in|out|in-out|DEFAULT)"]}],[/^(?:transition-)?property-(.+)$/,([,e])=>({"transition-property":b.bracket.global(e)||Ha(e)}),{autocomplete:[`transition-property-(${[...K,...Object.keys(Vr)].join("|")})`]}],["transition-none",{transition:"none"}],...P("transition")],Ga={thin:"100",extralight:"200",light:"300",normal:"400",medium:"500",semibold:"600",bold:"700",extrabold:"800",black:"900"};function Ia(e,t){return t.lineHeight?.[e]||b.bracket.cssvar.global.rem(e)}var zd=[[/^font-(.+)$/,([,e],{theme:t})=>({"font-family":t.fontFamily?.[e]||b.bracket.cssvar.global(e)}),{autocomplete:"font-$fontFamily"}],[/^text-(.+)$/,([,e="base"],{theme:t})=>{let[r,n]=sn(e,"length"),o=T(t.fontSize?.[r]),a=n?Ia(n,t):void 0;if(o?.[0]){let[c,l]=o;return{"font-size":c,"line-height":a??l??"1"}}let i=b.bracketOfLength.rem(r);return a&&i?{"font-size":i,"line-height":a}:{"font-size":b.bracketOfLength.rem(e)}},{autocomplete:"text-$fontSize"}],[/^text-size-(.+)$/,([,e],{theme:t})=>{let n=T(t.fontSize?.[e])?.[0]??b.bracket.cssvar.global.rem(e);if(n!=null)return{"font-size":n}},{autocomplete:"text-size-$fontSize"}],[/^(?:font|fw)-?([^-]+)$/,([,e])=>({"font-weight":Ga[e]||b.bracket.global.number(e)}),{autocomplete:`(font|fw)-(100|200|300|400|500|600|700|800|900|${Object.keys(Ga).join("|")})`}],[/^(?:font-)?(?:leading|lh|line-height)-(.+)$/,([,e],{theme:t})=>({"line-height":Ia(e,t)}),{autocomplete:"(leading|lh|line-height)-$lineHeight"}],["font-synthesis-weight",{"font-synthesis":"weight"}],["font-synthesis-style",{"font-synthesis":"style"}],["font-synthesis-small-caps",{"font-synthesis":"small-caps"}],["font-synthesis-none",{"font-synthesis":"none"}],[/^font-synthesis-(.+)$/,([,e])=>({"font-synthesis":b.bracket.cssvar.global(e)})],[/^(?:font-)?tracking-(.+)$/,([,e],{theme:t})=>({"letter-spacing":t.letterSpacing?.[e]||b.bracket.cssvar.global.rem(e)}),{autocomplete:"tracking-$letterSpacing"}],[/^(?:font-)?word-spacing-(.+)$/,([,e],{theme:t})=>({"word-spacing":t.wordSpacing?.[e]||b.bracket.cssvar.global.rem(e)}),{autocomplete:"word-spacing-$wordSpacing"}]];var Td=[[/^text-stroke(?:-(.+))?$/,([,e],{theme:t})=>({"-webkit-text-stroke-width":t.textStrokeWidth?.[e||"DEFAULT"]||b.bracket.cssvar.px(e)}),{autocomplete:"text-stroke-$textStrokeWidth"}],[/^text-stroke-(.+)$/,Q("-webkit-text-stroke-color","text-stroke"),{autocomplete:"text-stroke-$colors"}],[/^text-stroke-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-stroke-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"text-stroke-(op|opacity)-"}]],jd=[[/^text-shadow(?:-(.+))?$/,([,e],{theme:t})=>{let r=t.textShadow?.[e||"DEFAULT"];return r!=null?{"--un-text-shadow":Ua(r,"--un-text-shadow-color").join(","),"text-shadow":"var(--un-text-shadow)"}:{"text-shadow":b.bracket.cssvar.global(e)}},{autocomplete:"text-shadow-$textShadow"}],[/^text-shadow-color-(.+)$/,Q("--un-text-shadow-color","text-shadow"),{autocomplete:"text-shadow-color-$colors"}],[/^text-shadow-color-op(?:acity)?-?(.+)$/,([,e])=>({"--un-text-shadow-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"text-shadow-color-(op|opacity)-"}]],Er=["auto","hidden","clip","visible","scroll","overlay",...K],Ed=[[/^(?:overflow|of)-(.+)$/,([,e])=>Er.includes(e)?{overflow:e}:void 0,{autocomplete:[`(overflow|of)-(${Er.join("|")})`,`(overflow|of)-(x|y)-(${Er.join("|")})`]}],[/^(?:overflow|of)-([xy])-(.+)$/,([,e,t])=>Er.includes(t)?{[`overflow-${e}`]:t}:void 0]];var Uc=[["justify-start",{"justify-content":"flex-start"}],["justify-end",{"justify-content":"flex-end"}],["justify-center",{"justify-content":"center"}],["justify-between",{"justify-content":"space-between"}],["justify-around",{"justify-content":"space-around"}],["justify-evenly",{"justify-content":"space-evenly"}],["justify-stretch",{"justify-content":"stretch"}],...P("justify","justify-content"),["justify-items-start",{"justify-items":"start"}],["justify-items-end",{"justify-items":"end"}],["justify-items-center",{"justify-items":"center"}],["justify-items-stretch",{"justify-items":"stretch"}],...P("justify-items"),["justify-self-auto",{"justify-self":"auto"}],["justify-self-start",{"justify-self":"start"}],["justify-self-end",{"justify-self":"end"}],["justify-self-center",{"justify-self":"center"}],["justify-self-stretch",{"justify-self":"stretch"}],...P("justify-self")];var Fc=[["content-center",{"align-content":"center"}],["content-start",{"align-content":"flex-start"}],["content-end",{"align-content":"flex-end"}],["content-between",{"align-content":"space-between"}],["content-around",{"align-content":"space-around"}],["content-evenly",{"align-content":"space-evenly"}],...P("content","align-content"),["items-start",{"align-items":"flex-start"}],["items-end",{"align-items":"flex-end"}],["items-center",{"align-items":"center"}],["items-baseline",{"align-items":"baseline"}],["items-stretch",{"align-items":"stretch"}],...P("items","align-items"),["self-auto",{"align-self":"auto"}],["self-start",{"align-self":"flex-start"}],["self-end",{"align-self":"flex-end"}],["self-center",{"align-self":"center"}],["self-stretch",{"align-self":"stretch"}],["self-baseline",{"align-self":"baseline"}],...P("self","align-self")],Vd=[["place-content-center",{"place-content":"center"}],["place-content-start",{"place-content":"start"}],["place-content-end",{"place-content":"end"}],["place-content-between",{"place-content":"space-between"}],["place-content-around",{"place-content":"space-around"}],["place-content-evenly",{"place-content":"space-evenly"}],["place-content-stretch",{"place-content":"stretch"}],...P("place-content"),["place-items-start",{"place-items":"start"}],["place-items-end",{"place-items":"end"}],["place-items-center",{"place-items":"center"}],["place-items-stretch",{"place-items":"stretch"}],...P("place-items"),["place-self-auto",{"place-self":"auto"}],["place-self-start",{"place-self":"start"}],["place-self-end",{"place-self":"end"}],["place-self-center",{"place-self":"center"}],["place-self-stretch",{"place-self":"stretch"}],...P("place-self")],Ad=[...Uc,...Fc].flatMap(([e,t])=>[[`flex-${e}`,t],[`grid-${e}`,t]]);var Od=[["float-left",{float:"left"}],["float-right",{float:"right"}],["float-none",{float:"none"}],...P("float"),["clear-left",{clear:"left"}],["clear-right",{clear:"right"}],["clear-both",{clear:"both"}],["clear-none",{clear:"none"}],...P("clear")];var Pd=[["box-border",{"box-sizing":"border-box"}],["box-content",{"box-sizing":"content-box"}],...P("box","box-sizing")],Wc=["auto","default","none","context-menu","help","pointer","progress","wait","cell","crosshair","text","vertical-text","alias","copy","move","no-drop","not-allowed","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out"];var Ja=" ";var _d=[["visible",{visibility:"visible"}],["invisible",{visibility:"hidden"}],["backface-visible",{"backface-visibility":"visible"}],["backface-hidden",{"backface-visibility":"hidden"}],...P("backface","backface-visibility")],Md=[[/^cursor-(.+)$/,([,e])=>({cursor:b.bracket.cssvar.global(e)})],...Wc.map(e=>[`cursor-${e}`,{cursor:e}])];var Ud=[["pointer-events-auto",{"pointer-events":"auto"}],["pointer-events-none",{"pointer-events":"none"}],...P("pointer-events")],Fd=[["resize-x",{resize:"horizontal"}],["resize-y",{resize:"vertical"}],["resize",{resize:"both"}],["resize-none",{resize:"none"}],...P("resize")],Wd=[["select-auto",{"-webkit-user-select":"auto","user-select":"auto"}],["select-all",{"-webkit-user-select":"all","user-select":"all"}],["select-text",{"-webkit-user-select":"text","user-select":"text"}],["select-none",{"-webkit-user-select":"none","user-select":"none"}],...P("select","user-select")];var Dd=[[/^intrinsic-size-(.+)$/,([,e])=>({"contain-intrinsic-size":b.bracket.cssvar.global.fraction.rem(e)}),{autocomplete:"intrinsic-size-"}],["content-visibility-visible",{"content-visibility":"visible"}],["content-visibility-hidden",{"content-visibility":"hidden"}],["content-visibility-auto",{"content-visibility":"auto"}],...P("content-visibility")];var Ld=[["case-upper",{"text-transform":"uppercase"}],["case-lower",{"text-transform":"lowercase"}],["case-capital",{"text-transform":"capitalize"}],["case-normal",{"text-transform":"none"}],...P("case","text-transform")];var Qa={"--un-ring-inset":Ja,"--un-ring-offset-width":"0px","--un-ring-offset-color":"#fff","--un-ring-width":"0px","--un-ring-color":"rgba(147,197,253,0.5)","--un-shadow":"0 0 rgba(0,0,0,0)"},Bd=[[/^ring(?:-(.+))?$/,([,e],{theme:t})=>{let r=t.ringWidth?.[e||"DEFAULT"]??b.px(e||"1");if(r)return{"--un-ring-width":r,"--un-ring-offset-shadow":"var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color)","--un-ring-shadow":"var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color)","box-shadow":"var(--un-ring-offset-shadow), var(--un-ring-shadow), var(--un-shadow)"}},{autocomplete:"ring-$ringWidth"}],[/^ring-(?:width-|size-)(.+)$/,([,e],{theme:t})=>({"--un-ring-width":t.lineWidth?.[e]??b.bracket.cssvar.px(e)}),{autocomplete:"ring-(width|size)-$lineWidth"}],["ring-offset",{"--un-ring-offset-width":"1px"}],[/^ring-offset-(?:width-|size-)?(.+)$/,([,e],{theme:t})=>({"--un-ring-offset-width":t.lineWidth?.[e]??b.bracket.cssvar.px(e)}),{autocomplete:"ring-offset-(width|size)-$lineWidth"}],[/^ring-(.+)$/,Q("--un-ring-color","ring"),{autocomplete:"ring-$colors"}],[/^ring-op(?:acity)?-?(.+)$/,([,e])=>({"--un-ring-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"ring-(op|opacity)-"}],[/^ring-offset-(.+)$/,Q("--un-ring-offset-color","ring-offset"),{autocomplete:"ring-offset-$colors"}],[/^ring-offset-op(?:acity)?-?(.+)$/,([,e])=>({"--un-ring-offset-opacity":b.bracket.percent.cssvar(e)}),{autocomplete:"ring-offset-(op|opacity)-"}],["ring-inset",{"--un-ring-inset":"inset"}]],ei={"--un-ring-offset-shadow":"0 0 rgba(0,0,0,0)","--un-ring-shadow":"0 0 rgba(0,0,0,0)","--un-shadow-inset":Ja,"--un-shadow":"0 0 rgba(0,0,0,0)"};var Ka=["translate","rotate","scale"],de=["translateX(var(--un-translate-x))","translateY(var(--un-translate-y))","translateZ(var(--un-translate-z))","rotate(var(--un-rotate))","rotateX(var(--un-rotate-x))","rotateY(var(--un-rotate-y))","rotateZ(var(--un-rotate-z))","skewX(var(--un-skew-x))","skewY(var(--un-skew-y))","scaleX(var(--un-scale-x))","scaleY(var(--un-scale-y))","scaleZ(var(--un-scale-z))"].join(" "),Dc=["translate3d(var(--un-translate-x), var(--un-translate-y), var(--un-translate-z))","rotate(var(--un-rotate))","rotateX(var(--un-rotate-x))","rotateY(var(--un-rotate-y))","rotateZ(var(--un-rotate-z))","skewX(var(--un-skew-x))","skewY(var(--un-skew-y))","scaleX(var(--un-scale-x))","scaleY(var(--un-scale-y))","scaleZ(var(--un-scale-z))"].join(" "),ti={"--un-rotate":0,"--un-rotate-x":0,"--un-rotate-y":0,"--un-rotate-z":0,"--un-scale-x":1,"--un-scale-y":1,"--un-scale-z":1,"--un-skew-x":0,"--un-skew-y":0,"--un-translate-x":0,"--un-translate-y":0,"--un-translate-z":0},Nd=[[/^(?:transform-)?origin-(.+)$/,([,e])=>({"transform-origin":Ne[e]??b.bracket.cssvar(e)}),{autocomplete:[`transform-origin-(${Object.keys(Ne).join("|")})`,`origin-(${Object.keys(Ne).join("|")})`]}],[/^(?:transform-)?perspect(?:ive)?-(.+)$/,([,e])=>{let t=b.bracket.cssvar.px.numberWithUnit(e);if(t!=null)return{"-webkit-perspective":t,perspective:t}}],[/^(?:transform-)?perspect(?:ive)?-origin-(.+)$/,([,e])=>{let t=b.bracket.cssvar(e)??(e.length>=3?Ne[e]:void 0);if(t!=null)return{"-webkit-perspective-origin":t,"perspective-origin":t}}],[/^(?:transform-)?translate-()(.+)$/,qa],[/^(?:transform-)?translate-([xyz])-(.+)$/,qa],[/^(?:transform-)?rotate-()(.+)$/,Xa],[/^(?:transform-)?rotate-([xyz])-(.+)$/,Xa],[/^(?:transform-)?skew-()(.+)$/,Za],[/^(?:transform-)?skew-([xy])-(.+)$/,Za,{autocomplete:["transform-skew-(x|y)-"]}],[/^(?:transform-)?scale-()(.+)$/,Ya],[/^(?:transform-)?scale-([xyz])-(.+)$/,Ya,{autocomplete:[`transform-(${Ka.join("|")})-`,`transform-(${Ka.join("|")})-(x|y|z)-`]}],[/^(?:transform-)?preserve-3d$/,()=>({"transform-style":"preserve-3d"})],[/^(?:transform-)?preserve-flat$/,()=>({"transform-style":"flat"})],["transform",{transform:de}],["transform-cpu",{transform:de}],["transform-gpu",{transform:Dc}],["transform-none",{transform:"none"}],...P("transform")];function qa([,e,t],{theme:r}){let n=r.spacing?.[t]??b.bracket.cssvar.fraction.rem(t);if(n!=null)return[...Rr[e].map(o=>[`--un-translate${o}`,n]),["transform",de]]}function Ya([,e,t]){let r=b.bracket.cssvar.fraction.percent(t);if(r!=null)return[...Rr[e].map(n=>[`--un-scale${n}`,r]),["transform",de]]}function Xa([,e="",t]){let r=b.bracket.cssvar.degree(t);if(r!=null)return e?{"--un-rotate":0,[`--un-rotate-${e}`]:r,transform:de}:{"--un-rotate-x":0,"--un-rotate-y":0,"--un-rotate-z":0,"--un-rotate":r,transform:de}}function Za([,e,t]){let r=b.bracket.cssvar.degree(t);if(r!=null)return[...Rr[e].map(n=>[`--un-skew${n}`,r]),["transform",de]]}var ri={sans:["ui-sans-serif","system-ui","-apple-system","BlinkMacSystemFont",'"Segoe UI"',"Roboto",'"Helvetica Neue"',"Arial",'"Noto Sans"',"sans-serif",'"Apple Color Emoji"','"Segoe UI Emoji"','"Segoe UI Symbol"','"Noto Color Emoji"'].join(","),serif:["ui-serif","Georgia","Cambria",'"Times New Roman"',"Times","serif"].join(","),mono:["ui-monospace","SFMono-Regular","Menlo","Monaco","Consolas",'"Liberation Mono"','"Courier New"',"monospace"].join(",")},ni={xs:["0.75rem","1rem"],sm:["0.875rem","1.25rem"],base:["1rem","1.5rem"],lg:["1.125rem","1.75rem"],xl:["1.25rem","1.75rem"],"2xl":["1.5rem","2rem"],"3xl":["1.875rem","2.25rem"],"4xl":["2.25rem","2.5rem"],"5xl":["3rem","1"],"6xl":["3.75rem","1"],"7xl":["4.5rem","1"],"8xl":["6rem","1"],"9xl":["8rem","1"]},oi={DEFAULT:"1.5rem",xs:"0.5rem",sm:"1rem",md:"1.5rem",lg:"2rem",xl:"2.5rem","2xl":"3rem","3xl":"4rem"},ai={DEFAULT:"1.5rem",none:"0",sm:"thin",md:"medium",lg:"thick"},ii={DEFAULT:["0 0 1px rgba(0,0,0,0.2)","0 0 1px rgba(1,0,5,0.1)"],none:"0 0 rgba(0,0,0,0)",sm:"1px 1px 3px rgba(36,37,47,0.25)",md:["0 1px 2px rgba(30,29,39,0.19)","1px 2px 4px rgba(54,64,147,0.18)"],lg:["3px 3px 6px rgba(0,0,0,0.26)","0 0 5px rgba(15,3,86,0.22)"],xl:["1px 1px 3px rgba(0,0,0,0.29)","2px 4px 7px rgba(73,64,125,0.35)"]},si={none:"1",tight:"1.25",snug:"1.375",normal:"1.5",relaxed:"1.625",loose:"2"},fn={tighter:"-0.05em",tight:"-0.025em",normal:"0em",wide:"0.025em",wider:"0.05em",widest:"0.1em"},ci=fn,un={sm:"640px",md:"768px",lg:"1024px",xl:"1280px","2xl":"1536px"},li={...un},pi={DEFAULT:"1px",none:"0"},fi={DEFAULT:"1rem",none:"0",xs:"0.75rem",sm:"0.875rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem","5xl":"3rem","6xl":"3.75rem","7xl":"4.5rem","8xl":"6rem","9xl":"8rem"},ui={DEFAULT:"150ms",none:"0s",75:"75ms",100:"100ms",150:"150ms",200:"200ms",300:"300ms",500:"500ms",700:"700ms",1e3:"1000ms"},di={DEFAULT:"0.25rem",none:"0",sm:"0.125rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},mi={DEFAULT:["var(--un-shadow-inset) 0 1px 3px 0 rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 1px 2px -1px rgba(0,0,0,0.1)"],none:"0 0 rgba(0,0,0,0)",sm:"var(--un-shadow-inset) 0 1px 2px 0 rgba(0,0,0,0.05)",md:["var(--un-shadow-inset) 0 4px 6px -1px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 2px 4px -2px rgba(0,0,0,0.1)"],lg:["var(--un-shadow-inset) 0 10px 15px -3px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 4px 6px -4px rgba(0,0,0,0.1)"],xl:["var(--un-shadow-inset) 0 20px 25px -5px rgba(0,0,0,0.1)","var(--un-shadow-inset) 0 8px 10px -6px rgba(0,0,0,0.1)"],"2xl":"var(--un-shadow-inset) 0 25px 50px -12px rgba(0,0,0,0.25)",inner:"inset 0 2px 4px 0 rgba(0,0,0,0.05)"},gi={DEFAULT:"cubic-bezier(0.4, 0, 0.2, 1)",linear:"linear",in:"cubic-bezier(0.4, 0, 1, 1)",out:"cubic-bezier(0, 0, 0.2, 1)","in-out":"cubic-bezier(0.4, 0, 0.2, 1)"},bi={DEFAULT:"1px",none:"0"},hi={DEFAULT:"8px",0:"0",sm:"4px",md:"12px",lg:"16px",xl:"24px","2xl":"40px","3xl":"64px"},xi={DEFAULT:["0 1px 2px rgba(0,0,0,0.1)","0 1px 1px rgba(0,0,0,0.06)"],sm:"0 1px 1px rgba(0,0,0,0.05)",md:["0 4px 3px rgba(0,0,0,0.07)","0 2px 2px rgba(0,0,0,0.06)"],lg:["0 10px 8px rgba(0,0,0,0.04)","0 4px 3px rgba(0,0,0,0.1)"],xl:["0 20px 13px rgba(0,0,0,0.03)","0 8px 5px rgba(0,0,0,0.08)"],"2xl":"0 25px 25px rgba(0,0,0,0.15)",none:"0 0 rgba(0,0,0,0)"},Se={xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem",prose:"65ch"},ln={auto:"auto",...Se,screen:"100vw"},Ze={none:"none",...Se,screen:"100vw"},pn={auto:"auto",...Se,screen:"100vh"},Je={none:"none",...Se,screen:"100vh"},yi=Object.fromEntries(Object.entries(Se).map(([e,t])=>[e,`(min-width: ${t})`])),vi={...ti,...ei,...Qa},dn={width:ln,height:pn,maxWidth:Ze,maxHeight:Je,minWidth:Ze,minHeight:Je,inlineSize:ln,blockSize:pn,maxInlineSize:Ze,maxBlockSize:Je,minInlineSize:Ze,minBlockSize:Je,colors:on,fontFamily:ri,fontSize:ni,breakpoints:un,verticalBreakpoints:li,borderRadius:di,lineHeight:si,letterSpacing:fn,wordSpacing:ci,boxShadow:mi,textIndent:oi,textShadow:ii,textStrokeWidth:ai,blur:hi,dropShadow:xi,easing:gi,lineWidth:pi,spacing:fi,duration:ui,ringWidth:bi,preflightBase:vi,containers:yi};var $i={...dn,aria:{busy:'busy="true"',checked:'checked="true"',disabled:'disabled="true"',expanded:'expanded="true"',hidden:'hidden="true"',pressed:'pressed="true"',readonly:'readonly="true"',required:'required="true"',selected:'selected="true"'},animation:{keyframes:{pulse:"{0%, 100% {opacity:1} 50% {opacity:.5}}",bounce:"{0%, 100% {transform:translateY(-25%);animation-timing-function:cubic-bezier(0.8,0,1,1)} 50% {transform:translateY(0);animation-timing-function:cubic-bezier(0,0,0.2,1)}}",spin:"{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",ping:"{0%{transform:scale(1);opacity:1}75%,100%{transform:scale(2);opacity:0}}","bounce-alt":"{from,20%,53%,80%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1);transform:translate3d(0,0,0)}40%,43%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-30px,0)}70%{animation-timing-function:cubic-bezier(0.755,0.05,0.855,0.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}",flash:"{from,50%,to{opacity:1}25%,75%{opacity:0}}","pulse-alt":"{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scale3d(1,1,1)}}","rubber-band":"{from{transform:scale3d(1,1,1)}30%{transform:scale3d(1.25,0.75,1)}40%{transform:scale3d(0.75,1.25,1)}50%{transform:scale3d(1.15,0.85,1)}65%{transform:scale3d(0.95,1.05,1)}75%{transform:scale3d(1.05,0.95,1)}to{transform:scale3d(1,1,1)}}","shake-x":"{from,to{transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}","shake-y":"{from,to{transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{transform:translate3d(0,-10px,0)}20%,40%,60%,80%{transform:translate3d(0,10px,0)}}","head-shake":"{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}",swing:"{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}to{transform:rotate3d(0,0,1,0deg)}}",tada:"{from{transform:scale3d(1,1,1)}10%,20%{transform:scale3d(0.9,0.9,0.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}to{transform:scale3d(1,1,1)}}",wobble:"{from{transform:translate3d(0,0,0)}15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}to{transform:translate3d(0,0,0)}}",jello:"{from,11.1% to{transform:translate3d(0,0,0)}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg)skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-0.78125deg) skewY(-0.78125deg)}77.7%{transform:skewX(0.390625deg) skewY(0.390625deg)}88.8%{transform:skewX(-0.1953125deg) skewY(-0.1953125deg)}}","heart-beat":"{0%{transform:scale(1)}14%{transform:scale(1.3)}28%{transform:scale(1)}42%{transform:scale(1.3)}70%{transform:scale(1)}}",hinge:"{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate3d(0,0,1,80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate3d(0,0,1,60deg);transform-origin:top left;animation-timing-function:ease-in-out}to{transform:translate3d(0,700px,0);opacity:0}}","jack-in-the-box":"{from{opacity:0;transform-origin:center bottom;transform:scale(0.1) rotate(30deg)}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{transform:scale(1)}}","light-speed-in-left":"{from{opacity:0;transform:translate3d(-100%,0,0) skewX(-30deg)}60%{opacity:1;transform:skewX(20deg)}80%{transform:skewX(-5deg)}to{transform:translate3d(0,0,0)}}","light-speed-in-right":"{from{opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{opacity:1;transform:skewX(20deg)}80%{transform:skewX(-5deg)}to{transform:translate3d(0,0,0)}}","light-speed-out-left":"{from{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0) skewX(30deg)}}","light-speed-out-right":"{from{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}",flip:"{from{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(0.95,0.95,0.95) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}to{transform:perspective(400px) scale3d(1,1,1) translate3d(0,0,0) rotate3d(0,1,0,0deg);animation-timing-function:ease-in}}","flip-in-x":"{from{transform:perspective(400px) rotate3d(1,0,0,90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}to{transform:perspective(400px)}}","flip-in-y":"{from{transform:perspective(400px) rotate3d(0,1,0,90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(0,1,0,-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(0,1,0,-5deg)}to{transform:perspective(400px)}}","flip-out-x":"{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}to{transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}","flip-out-y":"{from{transform:perspective(400px)}30%{transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}to{transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}","rotate-in":"{from{transform-origin:center;transform:rotate3d(0,0,1,-200deg);opacity:0}to{transform-origin:center;transform:translate3d(0,0,0);opacity:1}}","rotate-in-down-left":"{from{transform-origin:left bottom;transform:rotate3d(0,0,1,-45deg);opacity:0}to{transform-origin:left bottom;transform:translate3d(0,0,0);opacity:1}}","rotate-in-down-right":"{from{transform-origin:right bottom;transform:rotate3d(0,0,1,45deg);opacity:0}to{transform-origin:right bottom;transform:translate3d(0,0,0);opacity:1}}","rotate-in-up-left":"{from{transform-origin:left top;transform:rotate3d(0,0,1,45deg);opacity:0}to{transform-origin:left top;transform:translate3d(0,0,0);opacity:1}}","rotate-in-up-right":"{from{transform-origin:right bottom;transform:rotate3d(0,0,1,-90deg);opacity:0}to{transform-origin:right bottom;transform:translate3d(0,0,0);opacity:1}}","rotate-out":"{from{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate3d(0,0,1,200deg);opacity:0}}","rotate-out-down-left":"{from{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate3d(0,0,1,45deg);opacity:0}}","rotate-out-down-right":"{from{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate3d(0,0,1,-45deg);opacity:0}}","rotate-out-up-left":"{from{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate3d(0,0,1,-45deg);opacity:0}}","rotate-out-up-right":"{from{transform-origin:right bottom;opacity:1}to{transform-origin:left bottom;transform:rotate3d(0,0,1,90deg);opacity:0}}","roll-in":"{from{opacity:0;transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}to{opacity:1;transform:translate3d(0,0,0)}}","roll-out":"{from{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}","zoom-in":"{from{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}","zoom-in-down":"{from{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","zoom-in-left":"{from{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","zoom-in-right":"{from{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","zoom-in-up":"{from{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","zoom-out":"{from{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}to{opacity:0}}","zoom-out-down":"{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}to{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","zoom-out-left":"{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(0.1) translate3d(-2000px,0,0);transform-origin:left center}}","zoom-out-right":"{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(0.1) translate3d(2000px,0,0);transform-origin:right center}}","zoom-out-up":"{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}to{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}","bounce-in":"{from,20%,40%,60%,80%,to{animation-timing-function:ease-in-out}0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(0.9,0.9,0.9)}60%{transform:scale3d(1.03,1.03,1.03);opacity:1}80%{transform:scale3d(0.97,0.97,0.97)}to{opacity:1;transform:scale3d(1,1,1)}}","bounce-in-down":"{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:translate3d(0,0,0)}}","bounce-in-left":"{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:translate3d(0,0,0)}}","bounce-in-right":"{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:translate3d(0,0,0)}}","bounce-in-up":"{from,60%,75%,90%,to{animation-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translate3d(0,0,0)}}","bounce-out":"{20%{transform:scale3d(0.9,0.9,0.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(0.3,0.3,0.3)}}","bounce-out-down":"{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}","bounce-out-left":"{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}","bounce-out-right":"{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}","bounce-out-up":"{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}","slide-in-down":"{from{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}","slide-in-left":"{from{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}","slide-in-right":"{from{transform:translate3d(100%,0,0);visibility:visible}to{transform:translate3d(0,0,0)}}","slide-in-up":"{from{transform:translate3d(0,100%,0);visibility:visible}to{transform:translate3d(0,0,0)}}","slide-out-down":"{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,100%,0)}}","slide-out-left":"{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}","slide-out-right":"{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}","slide-out-up":"{from{transform:translate3d(0,0,0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}","fade-in":"{from{opacity:0}to{opacity:1}}","fade-in-down":"{from{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-down-big":"{from{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-left":"{from{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-left-big":"{from{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-right":"{from{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-right-big":"{from{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-up":"{from{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-up-big":"{from{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-top-left":"{from{opacity:0;transform:translate3d(-100%,-100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-top-right":"{from{opacity:0;transform:translate3d(100%,-100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-bottom-left":"{from{opacity:0;transform:translate3d(-100%,100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-in-bottom-right":"{from{opacity:0;transform:translate3d(100%,100%,0)}to{opacity:1;transform:translate3d(0,0,0)}}","fade-out":"{from{opacity:1}to{opacity:0}}","fade-out-down":"{from{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}","fade-out-down-big":"{from{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}","fade-out-left":"{from{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}","fade-out-left-big":"{from{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}","fade-out-right":"{from{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}","fade-out-right-big":"{from{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}","fade-out-up":"{from{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}","fade-out-up-big":"{from{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}","fade-out-top-left":"{from{opacity:1;transform:translate3d(0,0,0)}to{opacity:0;transform:translate3d(-100%,-100%,0)}}","fade-out-top-right":"{from{opacity:1;transform:translate3d(0,0,0)}to{opacity:0;transform:translate3d(100%,-100%,0)}}","fade-out-bottom-left":"{from{opacity:1;transform:translate3d(0,0,0)}to{opacity:0;transform:translate3d(-100%,100%,0)}}","fade-out-bottom-right":"{from{opacity:1;transform:translate3d(0,0,0)}to{opacity:0;transform:translate3d(100%,100%,0)}}","back-in-up":"{0%{opacity:0.7;transform:translateY(1200px) scale(0.7)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:1;transform:scale(1)}}","back-in-down":"{0%{opacity:0.7;transform:translateY(-1200px) scale(0.7)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:1;transform:scale(1)}}","back-in-right":"{0%{opacity:0.7;transform:translateX(2000px) scale(0.7)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:1;transform:scale(1)}}","back-in-left":"{0%{opacity:0.7;transform:translateX(-2000px) scale(0.7)}80%{opacity:0.7;transform:translateX(0px) scale(0.7)}100%{opacity:1;transform:scale(1)}}","back-out-up":"{0%{opacity:1;transform:scale(1)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:0.7;transform:translateY(-700px) scale(0.7)}}","back-out-down":"{0%{opacity:1;transform:scale(1)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:0.7;transform:translateY(700px) scale(0.7)}}","back-out-right":"{0%{opacity:1;transform:scale(1)}80%{opacity:0.7;transform:translateY(0px) scale(0.7)}100%{opacity:0.7;transform:translateX(2000px) scale(0.7)}}","back-out-left":"{0%{opacity:1;transform:scale(1)}80%{opacity:0.7;transform:translateX(-2000px) scale(0.7)}100%{opacity:0.7;transform:translateY(-700px) scale(0.7)}}"},durations:{pulse:"2s","heart-beat":"1.3s","bounce-in":"0.75s","bounce-out":"0.75s","flip-out-x":"0.75s","flip-out-y":"0.75s",hinge:"2s"},timingFns:{pulse:"cubic-bezier(0.4,0,.6,1)",ping:"cubic-bezier(0,0,.2,1)","head-shake":"ease-in-out","heart-beat":"ease-in-out","pulse-alt":"ease-in-out","light-speed-in-left":"ease-out","light-speed-in-right":"ease-out","light-speed-out-left":"ease-in","light-speed-out-right":"ease-in"},properties:{"bounce-alt":{"transform-origin":"center bottom"},jello:{"transform-origin":"center"},swing:{"transform-origin":"top center"},flip:{"backface-visibility":"visible"},"flip-in-x":{"backface-visibility":"visible !important"},"flip-in-y":{"backface-visibility":"visible !important"},"flip-out-x":{"backface-visibility":"visible !important"},"flip-out-y":{"backface-visibility":"visible !important"},"rotate-in":{"transform-origin":"center"},"rotate-in-down-left":{"transform-origin":"left bottom"},"rotate-in-down-right":{"transform-origin":"right bottom"},"rotate-in-up-left":{"transform-origin":"left bottom"},"rotate-in-up-right":{"transform-origin":"right bottom"},"rotate-out":{"transform-origin":"center"},"rotate-out-down-left":{"transform-origin":"left bottom"},"rotate-out-down-right":{"transform-origin":"right bottom"},"rotate-out-up-left":{"transform-origin":"left bottom"},"rotate-out-up-right":{"transform-origin":"right bottom"},hinge:{"transform-origin":"top left"},"zoom-out-down":{"transform-origin":"center bottom"},"zoom-out-left":{"transform-origin":"left center"},"zoom-out-right":{"transform-origin":"right center"},"zoom-out-up":{"transform-origin":"center bottom"}},counts:{spin:"infinite",ping:"infinite",pulse:"infinite","pulse-alt":"infinite",bounce:"infinite","bounce-alt":"infinite"}},media:{portrait:"(orientation: portrait)",landscape:"(orientation: landscape)",os_dark:"(prefers-color-scheme: dark)",os_light:"(prefers-color-scheme: light)",motion_ok:"(prefers-reduced-motion: no-preference)",motion_not_ok:"(prefers-reduced-motion: reduce)",high_contrast:"(prefers-contrast: high)",low_contrast:"(prefers-contrast: low)",opacity_ok:"(prefers-reduced-transparency: no-preference)",opacity_not_ok:"(prefers-reduced-transparency: reduce)",useData_ok:"(prefers-reduced-data: no-preference)",useData_not_ok:"(prefers-reduced-data: reduce)",touch:"(hover: none) and (pointer: coarse)",stylus:"(hover: none) and (pointer: fine)",pointer:"(hover) and (pointer: coarse)",mouse:"(hover) and (pointer: fine)",hd_color:"(dynamic-range: high)"},supports:{grid:"(display: grid)"},preflightBase:{...dr,...za,...ja,...Ca,...va,...sr,...ar,...aa,...ia}};var ki=[N("svg",e=>({selector:`${e.selector} svg`}))];var wi=[N(".dark",e=>({prefix:`.dark $$ ${e.prefix}`})),N(".light",e=>({prefix:`.light $$ ${e.prefix}`})),W("@dark","@media (prefers-color-scheme: dark)"),W("@light","@media (prefers-color-scheme: light)")];var Si=[N("@hover",e=>(X("The @hover variant is experimental and may not follow semver."),{parent:`${e.parent?`${e.parent} $$ `:""}@media (hover: hover) and (pointer: fine)`,selector:`${e.selector||""}:hover`}))];var Ci=[W("contrast-more","@media (prefers-contrast: more)"),W("contrast-less","@media (prefers-contrast: less)")],Ri=[W("motion-reduce","@media (prefers-reduced-motion: reduce)"),W("motion-safe","@media (prefers-reduced-motion: no-preference)")],zi=[W("landscape","@media (orientation: landscape)"),W("portrait","@media (orientation: portrait)")];var Ti=e=>{if(!e.startsWith("_")&&(/space-?([xy])-?(-?.+)$/.test(e)||/divide-/.test(e)))return{matcher:e,selector:t=>`${t}>:not([hidden])~:not([hidden])`}};var ji=(e,{theme:t})=>{let r=e.match(/^(.*)\b(placeholder-)(.+)$/);if(r){let[,n="",o,a]=r;if(ve(a,t)||Lc(a))return{matcher:`${n}placeholder-$ ${o}${a}`}}};function Lc(e){let t=e.match(/^op(?:acity)?-?(.+)$/);return t&&t[1]!=null?s.bracket.percent(t[1])!=null:!1}function Ei(e){return[ji,Ti,...vr(e),...Ci,...zi,...Ri,...ki,...wi,...Si]}function Vi(e={}){return{...Io(e),name:"@unocss/preset-wind",theme:$i,rules:Aa,shortcuts:Oa,variants:Ei(e)}}function Ai(e,t,r){return`calc(${t} + (${e} - ${t}) * ${r} / 100)`}function Oi(e,t,r){let n=[e,t],o=[];for(let i=0;i<2;++i){let c=typeof n[i]=="string"?$e(n[i]):n[i];if(!c||!["rgb","rgba"].includes(c.type))return;o.push(c)}let a=[];for(let i=0;i<3;++i)a.push(Ai(o[0].components[i],o[1].components[i],r));return{type:"rgb",components:a,alpha:Ai(o[0].alpha??1,o[1].alpha??1,r)}}function Pi(e,t){return Oi("#fff",e,t)}function _i(e,t){return Oi("#000",e,t)}function Bc(e,t){let r=parseFloat(`${t}`);if(!Number.isNaN(r))return r>0?_i(e,t):Pi(e,-r)}var Nc={tint:Pi,shade:_i,shift:Bc};function Mi(){let e;return{name:"mix",match(t,r){e||(e=new RegExp(`^mix-(tint|shade|shift)-(-?\\d{1,3})(?:${r.generator.config.separators.join("|")})`));let n=t.match(e);if(n)return{matcher:t.slice(n[0].length),body:o=>(o.forEach(a=>{if(a[1]){let i=$e(`${a[1]}`);if(i){let c=Nc[n[1]](i,n[2]);c&&(a[1]=U(c))}}}),o)}}}}function Hc(e={}){let t=Vi(e);return{...t,name:"@unocss/preset-uno",variants:[...t.variants,Mi()]}}var Ui=Hc;function Gc(e){return e.replace(/-(\w)/g,(t,r)=>r?r.toUpperCase():"")}function Fi(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Wi(e){return e.replace(/(?:^|\B)([A-Z])/g,"-$1").toLowerCase()}var Di=["Webkit","Moz","ms"];function Li(e){let t={};function r(n){let o=t[n];if(o)return o;let a=Gc(n);if(a!=="filter"&&a in e)return t[n]=Wi(a);a=Fi(a);for(let i=0;in.forEach(o=>{o[0].startsWith("--")||(o[0]=r(o[0]))})}function Bi(e){return e.replace(/&/g,"&").replace(/>/g,">").replace(/</g,"<")}function mn(e={}){if(typeof window>"u"){console.warn("@unocss/runtime been used in non-browser environment, skipped.");return}let t=window,r=window.document,n=()=>r.documentElement,o=t.__unocss||{},a=Object.assign({},e,o.runtime),i=a.defaults||{},c=a.cloakAttribute??"un-cloak";a.autoPrefix&&(i.postprocess=T(i.postprocess)).unshift(Li(r.createElement("div").style)),a.configResolved?.(o,i);let l=Vn(o,i),p=new Map,f=!0,u=new Set,g,m,C=[],V=()=>new Promise(v=>{C.push(v),m!=null&&clearTimeout(m),m=setTimeout(()=>E().then(()=>{let x=C;C=[],x.forEach(w=>w())}),0)});function R(v){if(v.nodeType!==1)return;let x=v;x.hasAttribute(c)&&x.removeAttribute(c),x.querySelectorAll(`[${c}]`).forEach(w=>{w.removeAttribute(c)})}function O(v,x){let w=p.get(v);if(!w)if(w=r.createElement("style"),w.setAttribute("data-unocss-runtime-layer",v),p.set(v,w),x==null)n().prepend(w);else{let L=O(x),H=L.parentNode;H?H.insertBefore(w,L.nextSibling):n().prepend(w)}return w}async function E(){let v=await l.generate(u);return v.layers.reduce((x,w)=>(O(w,x).innerHTML=v.getLayer(w)??"",w),void 0),u=v.matched,{...v,getStyleElement:x=>p.get(x),getStyleElements:()=>p}}async function y(v){let x=u.size;await l.applyExtractors(v,void 0,u),x!==u.size&&await V()}async function d(){let v=r.body,x=v&&v.outerHTML;x&&(await y(`${x} ${Bi(x)}`),R(n()),R(v))}let $=new MutationObserver(v=>{f||v.forEach(async x=>{if(x.target.nodeType!==1)return;let w=x.target;for(let L of p)if(w===L[1])return;if(x.type==="childList")x.addedNodes.forEach(async L=>{if(L.nodeType!==1)return;let H=L;g&&!g(H)||(await y(H.outerHTML),R(H))});else{if(g&&!g(w))return;if(x.attributeName!==c){let L=Array.from(w.attributes).map(ne=>ne.value?`${ne.name}="${ne.value}"`:ne.name).join(" "),H=`<${w.tagName.toLowerCase()} ${L}>`;await y(H)}w.hasAttribute(c)&&w.removeAttribute(c)}})}),_=!1;function D(){if(_)return;let v=n()||r.body;v&&($.observe(v,{childList:!0,subtree:!0,attributes:!0}),_=!0)}function re(){a.bypassDefined&&Ic(l.blocked),d(),D()}function me(){r.readyState==="loading"?t.addEventListener("DOMContentLoaded",re):re()}let Qe=t.__unocss_runtime=t.__unocss_runtime={version:l.version,uno:l,async extract(v){j(v)||(v.forEach(x=>u.add(x)),v=""),await y(v)},extractAll:d,inspect(v){g=v},toggleObserver(v){v===void 0?f=!f:f=!!v,!_&&!f&&me()},update:E};a.ready?.(Qe)!==!1&&(f=!1,me())}function Ic(e=new Set){for(let t=0;to.selectorText?.split(/,/g)||[]).forEach(o=>{o&&(o=o.trim(),o.startsWith(".")&&(o=o.slice(1)),e.add(o))})}catch{continue}}return e}mn({defaults:{presets:[Ui()]}});})(); diff --git a/resources/sitehome_model/assets/js/user_settings.js b/resources/sitehome_model/assets/js/user_settings.js new file mode 100644 index 0000000..e7a83c2 --- /dev/null +++ b/resources/sitehome_model/assets/js/user_settings.js @@ -0,0 +1,384 @@ +const login_messages = document.getElementById('user-messages-inpt'); +const otp_section = document.getElementById('otp-section'); +const input_password = document.getElementById('user-password-inpt'); +const input_repeat_password = document.getElementById('user-repeat-password-inpt'); +const password_secure_bar = document.getElementById('password-secure-bar'); +const password_secure_val = document.getElementById('password-secure-val'); +const password_suggestions = document.getElementById('password-suggestions'); +const password_warning = document.getElementById('password-warning'); +const password_error = document.getElementById('password-error'); +const get_otp_info = () => { + const otp_url = document.getElementById('user-totp-url'); + if (otp_url && otp_url.value !== '') { + const otp_message = document.getElementById('totp-message'); + const url = new URL(otp_url.value); + if (url && url.searchParams) { + let algo=''; + let digits=''; + if (totp_algorithm) { + algo = totp_algorithm; + } else { + algo = url.searchParams.get('algorithm') || ''; + } + if (algo !== '') { + algo = `Algorithm: ${algo} | `; + } + if (totp_digits) { + digits = totp_digits || 0; + } + if (digits > 0) { + digits = `| Digits: ${digits}`; + } + const issuer = `Issuer: ${url.searchParams.get('issuer') || ''}`; + otp_message.innerHTML = ` ${algo} ${issuer} ${digits}`; + } + } +} +const check_value = async (name,value,elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + const elem_error = document.getElementById(`${name}-error`); + let res = await check_item(name,value); + if (elem_error) { elem_error.innerHTML = res} + if (res != '') { + elem.focus(); + return false; + } + return true; +}; +const set_name = async (elem) => { + if (elem.value == '' ) { + login_messages.innerHTML='Please include a valid name'; + return false; + } + return await check_value('name',elem.value,elem); +}; +const set_email = async (elem) => { + if (elem.value == '' || !elem.value.includes('@')) { + login_messages.innerHTML='Please include a valid email'; + return false; + } + return await check_value('email',elem.value,elem); +}; +const set_totp = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } +}; +const make_role_chips = (elem) => { + const arr_items = elem.value == '' ? [] : elem.value.split(','); + const roles_chips = document.getElementById('roles-chips'); + if (roles_chips) { + roles_chips.innerHTML=''; + if (arr_items.length == 0) { return; } + arr_items.forEach(name => { + if (name.replaceAll(' ','') !== '') { + const chip = document.createElement("span"); + chip.id = `badge-${name}`; + const arr_classes = "inline-flex items-center px-2 py-1 mr-2 text-sm font-medium text-blue-800 bg-blue-100 rounded dark:bg-blue-900 dark:text-blue-300".split(" "); + chip.classList.add(...arr_classes); + if (elem.disabled) { + chip.innerHTML = `${name}`; + } else { + chip.innerHTML = `${name} `; + } + roles_chips.append(chip); + if (!elem.disabled) { + document.getElementById(`badge-${name}`).addEventListener('click', (ev) => { + ev.preventDefault(); + chip.remove(); + elem.value = arr_items.filter(it => it != name).join(','); + }); + } + } + }); + } +}; +const set_role = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + make_role_chips(elem); +}; +const set_items = (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } +}; +const clean_password_messages = () => { + if (password_secure_bar) { password_secure_bar.style.width = '0%'; } + if (password_secure_val) { password_secure_val.innerHTML=0; } + if (password_suggestions) { password_suggestions.innerHTML=''; } + if (password_warning) { password_warning.innerHTML=''; } + if (password_error) { password_error.innerHTML=''; } +}; +const set_password = async (elem) => { + if (login_messages.innerHTML!='') { login_messages.innerHTML=''; } + clean_password_messages(); + const feedback = await check_item('password',elem.value); + if (password_secure_bar) { password_secure_bar.style.width = `${parseInt(feedback.score)*10}%`; } + if (password_secure_val) { password_secure_val.innerHTML=feedback.score; } + if (password_suggestions) { password_suggestions.innerHTML=feedback.suggestions; } + if (password_warning) { password_warning.innerHTML=feedback.warning; } + if (PASSWORD_SCORE && feedback.score < PASSWORD_SCORE) { + elem.focus(); + if (password_error) { + password_error.innerHTML = `Password under score value: ${PASSWORD_SCORE}`; + } + return false; + } + if (input_password.value !== input_repeat_password.value) { + login_messages.innerHTML = 'Password and repetition not mactch'; + elem.focus(); + return false; + } + return true; +}; +const change_use_totp = (elem) => { + if (otp_section) { otp_section.classList.toggle('hidden'); } + if (!elem.checked) { + reset_totp(true); + } else { + const otp_auth = document.getElementById('user-totp-inpt'); + const otp_code = document.getElementById('user-totp-code') + if (otp_auth && otp_code && otp_code.value != 0 ) { + otp_auth.parentElement.classList.remove('hidden'); + } + } +}; +const reset_totp = (hide_parent) => { + const otp_auth = document.getElementById('user-totp-inpt'); + const otp_code = document.getElementById('user-totp-code'); + if (otp_code) { otp_code.value='' } + const otp_text = document.getElementById('otp-code-text'); + if (otp_text) { otp_text.innerHTML='' } + const otp_qr = document.getElementById('otp-code-qr'); + if (otp_qr) { otp_qr.innerHTML='' } + const copy_code = document.getElementById('copy-code'); + const totp_message = document.getElementById('totp-message'); + if (totp_message) { totp_message.innerHTML=''} + const totp_recovery_message = document.getElementById('totp-recovery-message'); + if (totp_recovery_message) { totp_recovery_message.classList.remove('hidden')} + if (copy_code) { copy_code.classList.add('hidden') } + if (otp_auth) { + otp_auth.value = ''; + if (hide_parent) { otp_auth.parentElement.classList.add('hidden') } + } +}; +const on_reset_totp = (elem) => { + if (elem.checked) { + reset_totp(false); + } +}; +const set_theme = (elem) => { + if (settings && settings.elements) { + const sel_theme = elem.value; + const element = document.getElementsByTagName('html')[0]; + const curr_theme = element.classList.contains('dark') ? 'dark': 'light'; + if (curr_theme != sel_theme) { + if (sel_theme != 'dark' && element.classList.contains('dark')) { + element.classList.remove('dark'); + } else { + element.classList.add('dark'); + } + } + } +}; +const copy_otp_code = (elem) => { + const content = document.getElementById('user-totp-code').value || ''; + if (content == '') { return } + const toast_target = document.getElementById('toast-copy-totp-code'); + navigator.clipboard.writeText(content).then( + () => { + if (toast_target) { + utils.css('show', toast_target); + setTimeout(() => { + utils.css('hide', toast_target); + }, settings.toast_copy_timeout); + } + }, + ); +}; +const check_item = async (name, value) => { + if (CHECK_URL) { + const data = { + name, + value + }; + const response = await fetch(CHECK_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + } + }); + login_messages.innerHTML=''; + if (response.ok && response.status === 200 ) { + if (name == 'password') { + const text = await response.text(); + const arr_text = text.split('|'); + return { + score: arr_text[0] || 0, + suggestions: arr_text[1].replace('\n','
') || '', + warning: arr_text[2] || '', + }; + } else { + return ''; + } + } else { + return `Enter a valid value for ${name}`; + } + } +}; +const log_in = async () => { + login_messages.innerHTML=''; + const elem_name = document.getElementById('user-name-inpt'); + if (elem_name) { + if (elem_name.value == '') { + login_messages.innerHTML='Enter a name'; + return; + } + const data_name = elem_name.dataset.val; + if (data_name != elem_name.value) { if (! await set_name(elem_name)) { return; } } + } + const name = elem_name ? elem_name.value : ''; + const elem_password = document.getElementById('user-password-inpt'); + if (elem_password) { + if (elem_password.value == '') { + login_messages.innerHTML='Please include a password'; + return; + } + if (!set_password(elem_password)) { return; } + } + const password = elem_password ? elem_password.value : ''; + let otp_code = ''; + let otp_url = ''; + let otp_auth = ''; + const elem_otp_code = document.getElementById('user-totp-code'); + if (elem_otp_code) { + otp_code = elem_otp_code.value; + otp_url = document.getElementById('user-totp-url').value || '' + otp_auth = document.getElementById('user-totp-inpt').value || ''; + if (otp_code != '') { + if (otp_auth == '' && totp_mode == "mandatory") { + login_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + if (totp_mode == 'mandatory' || document.getElementById('use-totp').checked) { + const numbers = /^[0-9]+$/; + if(! otp_auth.match(numbers) || otp_auth.length != totp_digits ) { + login_messages.innerHTML='Please enter a valid TOTP code'; + return; + } + } + } + } + const elem_roles = document.getElementById('user-roles-inpt'); + var roles = ''; + if (elem_roles) { roles = elem_roles.value; } + const elem_fullname= document.getElementById('user-fullname-inpt'); + var fullname = ''; + if (elem_fullname) { fullname = elem_fullname.value; } + const elem_description = document.getElementById('user-description-inpt'); + var description=''; + if (elem_description) { description = elem_description.value; } + const elem_email = document.getElementById('user-email-inpt'); + if (elem_email) { + const data_email = elem_email.dataset.val; + if (data_email != elem_email.value) { if (! await set_email(elem_email)) { return; } } + } + const email = elem_email ? elem_email.value : ''; + const elem_theme = document.getElementById('theme-select'); + var theme=''; + var items={}; + if (elem_theme){ + theme= elem_theme.value; + items = {'theme': theme }; + } + if (INVITE_KEY && INVITE_KEY != '') { + items.invite_key = INVITE_KEY; + } + if (INVITE_ID && INVITE_ID != '') { + items.invite_id = INVITE_ID; + } + const data = { + id: id_user ? id_user : '0', + name, + fullname, + description, + email, + password, + otp_code, + otp_url, + otp_auth, + roles, + items, + //timestamp: new Date().toLocaleString(), + }; + const response = await fetch(SIGNIN_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + // 'cookie': document.cookie, + } + }); + if (response.ok && response.status === 200 ) { + location.href='/'; + } else { + login_messages.innerHTML='Signin response was not OK'; + // throw new Error('Signin response was not OK'); + return false; + } +}; +window.addEventListener('load', () => { + get_otp_info(); + const show_password = document.getElementById('show-password'); + const show_repeat_password = document.getElementById('show-repeat-password'); + const otp_code_text = document.getElementById('otp-code-text') + const section_title = document.getElementById('section-title') + const back_btn = document.getElementById('back-btn') + const user_roles = document.getElementById('user-roles-inpt'); + if (show_password) { + show_password.addEventListener('click', (ev) => { + ev.preventDefault(); + [...show_password.children].forEach(it => { + it.classList.toggle('hidden'); + }); + if (input_password.type == 'password') { + input_password.type = 'text'; + } else { + input_password.type = 'password'; + } + }); + } + if (show_repeat_password) { + show_repeat_password.addEventListener('click', (ev) => { + ev.preventDefault(); + [...show_repeat_password.children].forEach(it => { + it.classList.toggle('hidden'); + }); + if (input_repeat_password.type == 'password') { + input_repeat_password.type = 'text'; + } else { + input_repeat_password.type = 'password'; + } + }); + } + if (otp_code_text) { + otp_code_text.addEventListener('click', (ev) => { + ev.preventDefault(); + copy_otp_code(ev); + }); + } + if (back_btn && BACK_URL) { + back_btn.addEventListener('click', (ev) => { + ev.preventDefault(); + location.href=BACK_URL; + }); + } + if (section_title && TITLE_URL) { + section_title.addEventListener('click', (ev) => { + ev.preventDefault(); + location.href=TITLE_URL; + }); + } + if (user_roles) { + make_role_chips(user_roles); + } +}); diff --git a/resources/sitehome_model/assets/js/user_view.js b/resources/sitehome_model/assets/js/user_view.js new file mode 100644 index 0000000..5912649 --- /dev/null +++ b/resources/sitehome_model/assets/js/user_view.js @@ -0,0 +1,24 @@ +const make_role_chips = (elem) => { + const arr_items = elem.value == '' ? [] : elem.value.split(','); + const roles_chips = document.getElementById('roles-chips'); + if (roles_chips) { + roles_chips.innerHTML=''; + if (arr_items.length == 0) { return; } + arr_items.forEach(name => { + if (name.replaceAll(' ','') !== '') { + const chip = document.createElement("span"); + chip.id = `badge-${name}`; + const arr_classes = "inline-flex items-center px-2 py-1 mr-2 text-sm font-medium text-blue-800 bg-blue-100 rounded dark:bg-blue-900 dark:text-blue-300".split(" "); + chip.classList.add(...arr_classes); + chip.innerHTML = `${name}`; + roles_chips.append(chip); + } + }); + } +}; +window.addEventListener('load', () => { + const user_roles = document.getElementById('user-roles-inpt'); + if (user_roles) { + make_role_chips(user_roles); + } +}); diff --git a/resources/sitehome_model/assets/js/users.js b/resources/sitehome_model/assets/js/users.js new file mode 100644 index 0000000..c1c3519 --- /dev/null +++ b/resources/sitehome_model/assets/js/users.js @@ -0,0 +1,437 @@ +let usrs_env = {}; +let usrs_elem = {}; + +const load_elem = () => { + usrs_elem = Object.freeze({ + table: document.getElementById('table-usrs'), + modal: document.getElementById('edit-user-modal'), + dropdown_action: document.getElementById('dropdown-action'), + search_inpt: document.getElementById('table-search-usrs'), + search_clean: document.getElementById('clean-search'), + checkbox_all: document.getElementById('checkbox-all'), + count_select: document.getElementById('count-select'), + alert_danger: document.getElementById('alert-danger'), + danger_message: document.getElementById('danger-message'), + alert_info: document.getElementById('alert-info'), + info_message: document.getElementById('info-message'), + checkbox_all: document.getElementById('checkbox-all'), + alert_timeout: 4000, + form: { + name: document.getElementById('usr-name'), + fullname: document.getElementById('usr-fullname'), + email: document.getElementById('usr-email'), + description: document.getElementById('usr-description'), + roles: document.getElementById('usr-roles'), + items: document.getElementById('usr-items'), + status: document.getElementById('usr-status'), + current_status: document.getElementById('current-usr-status'), + isadmin: document.getElementById('usr-isadmin'), + otp_enabled: document.getElementById('usr-otp-enabled'), + otp_verified: document.getElementById('usr-otp-verified'), + otp_defs: document.getElementById('usr-otp-defs'), + }, + }) +}; +const set_user_status = (value,color) => { + if (usrs_elem.form.current_status && usrs_elem.form.status) { + usrs_elem.form.status.value=value; + usrs_elem.form.current_status.innerHTML= + `
${value}
`; + } +}; +const edit_row = (pos) => { + const id = usrs_env.data && usrs_env.data[pos] ? usrs_env.data[pos] : -1 + console.log(id); + if (id > -1) { + edit_usr(`${id}`); + } +}; +const close_usr = () => { + if (usrs_env.modal.hide) { + usrs_env.modal.hide(); + } +}; +const fill_form = () => { + usrs_elem.form.name.value = usrs_env.user.name; + usrs_elem.form.fullname.value = usrs_env.user.fullname; + usrs_elem.form.email.value = usrs_env.user.email; + usrs_elem.form.description.value = usrs_env.user.description; + usrs_elem.form.roles.value = usrs_env.user.roles; + usrs_elem.form.items.value = usrs_env.user.items; + usrs_elem.form.status.value = usrs_env.user.status; + usrs_env.user.isadmin == 1 ? + usrs_elem.form.isadmin.checked=true : + usrs_elem.form.isadmin.checked=false; + usrs_env.user.otp_enabled == 1 ? + usrs_elem.form.otp_enabled.checked = true : + usrs_elem.form.otp_enabled.checked = false; + usrs_env.user.otp_verified == 1 ? + usrs_elem.form.otp_verified.checked = true : + usrs_elem.form.otp_verified.checked = false ; + usrs_elem.form.otp_defs.value = usrs_env.user.otp_defs; + let color = ''; + switch (usrs_elem.form.status.value) { + case 'Active': + color='green'; + break; + case 'Created': + color='blue'; + break; + case 'Pending': + color='orange'; + break; + case 'Lock': + color='red'; + break; + default: + color='yellow'; + } + set_user_status(usrs_elem.form.status.value,color); +}; +const collect_form = () => { + usrs_env.user.name = usrs_elem.form.name.value; + usrs_env.user.fullname = usrs_elem.form.fullname.value; + usrs_env.user.email = usrs_elem.form.email.value; + usrs_env.user.description = usrs_elem.form.description.value; + usrs_env.user.roles = usrs_elem.form.roles.value; + usrs_env.user.items = usrs_elem.form.items.value; + usrs_env.user.status = usrs_elem.form.status.value; + usrs_elem.form.isadmin.checked ? + usrs_env.user.isadmin = true : + usrs_env.user.isadmin = false; + usrs_elem.form.otp_enabled.checked ? + usrs_env.user.otp_enabled = true : + usrs_env.user.otp_enabled = false; + usrs_elem.form.otp_verified.checked ? + usrs_env.user.otp_verified = true : + usrs_env.user.otp_verified = false; + usrs_env.user.otp_defs = usrs_elem.form.otp_defs.value; +}; +const edit_usr = async (id) => { + if (usrs_env.modal.show) { + const res = await get_user('id',id); + if (res.status && res.data.id == id) { + usrs_env.user = res.data; + fill_form(); + usrs_env.modal.show(); + } + } +}; +const save_all_usr = async (ev) => { + ev.preventDefault(); + if (usrs_env.modal.show && usrs_env.user) { + collect_form(); + const res = await save_user(usrs_env.user); + // if (res.status) { + usrs_env.modal.hide(); + } +}; +const on_search = (el) => { + const tbody = usrs_elem.table.getElementsByTagName('tbody')[0]; + let total = 0; + let count_select = 0; + [...tbody.getElementsByTagName('tr')].forEach(tr => { + total +=1; + if (tr.dataset.row && tr.dataset.row.includes(el.value)) { + tr.classList.remove('hidden'); + count_select +=1; + } else { + tr.classList.add('hidden'); + } + }); + if (usrs_elem.count_select) { + if (count_select == total) { + usrs_elem.count_select.innerHTML=''; + } else { + usrs_elem.count_select.innerHTML=`${count_select} of`; + } + } +}; +const on_search_keydown = (el,event) => { + switch (event.key) { + case 'Delete': + case 'Home': + clean_search(); + break; + case 'Enter': + break; + default: + on_search(el); + } +} +const clean_search = () => { + usrs_elem.search_inpt.value=''; + on_search(usrs_elem.search_inpt); +}; +const load_data = () => { + const js_data = document.getElementById('js-data'); + if (js_data) { js_data.remove(); } + usrs_env.data = []; + if (users_list) { + try { + usrs_env.data = JSON.parse(users_list) + } catch (error) { + usrs_env.data = []; + } + users_list=''; + } +}; +const on_check_all = (el,ev) => { + ev.preventDefault(); + if (usrs_elem.checkbox_all) { + const state = usrs_elem.checkbox_all.checked; + [...usrs_elem.table.getElementsByClassName('col-check')].forEach(it => { + it.checked = state; + }); + } +}; +const table_sort = (col) => { + const tbody = usrs_elem.table.getElementsByTagName('tbody')[0]; + const rows = tbody.getElementsByTagName('tr'); + const arrow_up = document.getElementById(`${col}-arrow-up`); + const arrow_down = document.getElementById(`${col}-arrow-down`); + const col_rows = []; + [...rows].forEach(it => { + const data=it.dataset.row.split(':'); + switch (col) { + case 'name': + col_rows.push({ky: data[0], tr:it}) + break; + case 'fullname': + col_rows.push({ky: data[1], tr:it}) + break; + case 'email': + col_rows.push({ky: data[2], tr:it}) + break; + case 'description': + col_rows.push({ky: data[3], tr:it}) + break; + case 'roles': + col_rows.push({ky: data[4], tr:it}) + break; + case 'status': + col_rows.push({ky: data[5], tr:it}) + break; + case 'isadmin': + col_rows.push({ky: data[6], tr:it}) + break; + } + }) + if (col_rows.length == 0) { return; } + const is_asc = !usrs_env.cols[col].asc; + usrs_env.cols[col].asc = is_asc; + if (is_asc) { + if (arrow_up) { arrow_up.classList.remove('hidden'); } + if (arrow_down) { arrow_down.classList.add('hidden'); } + } else { + if (arrow_up) { arrow_up.classList.add('hidden'); } + if (arrow_down) { arrow_down.classList.remove('hidden'); } + } + col_rows.sort((a,b) => { + if (is_asc) { + if (a.ky > b.ky) { return 1; } + if (a.ky < b.ky) { return -1; } + } else { + if (a.ky > b.ky) { return -1; } + if (a.ky < b.ky) { return 1; } + } + // a must be equal to b + return 0; + }); + tbody.innerHTM=''; + col_rows.forEach(it => tbody.append(it.tr)); +}; +const alert_danger = (task,message) => { + if (usrs_elem.danger_message && usrs_elem.alert_danger) { + usrs_elem.danger_message.innerHTML=message; + switch (task) { + case 'show': + usrs_elem.alert_danger.classList.remove('hidden'); + setTimeout(() => { + usrs_elem.alert_danger.classList.add('hidden'); + }, usrs_elem.alert_timeout); + break; + default: + usrs_elem.alert_danger.classList.add('hidden'); + } + } +}; +const alert_info = (task,message) => { + if (usrs_elem.info_message && usrs_elem.alert_info) { + usrs_elem.info_message.innerHTML=message; + switch (task) { + case 'show': + usrs_elem.alert_info.classList.remove('hidden'); + setTimeout(() => { + usrs_elem.alert_info.classList.add('hidden'); + }, usrs_elem.alert_timeout); + break; + default: + usrs_elem.alert_info.classList.add('hidden'); + } + } +}; +const post_fetch = async (source,url = '',source_data) => { + if (url == '') { return } + const response = await fetch(url, { + method: 'POST', + body: JSON.stringify(source_data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + } + }); + alert_danger('hide',''); + alert_info('hide',''); + if (response.ok && response.status === 200 ) { + if (source == 'get_user') { + const name = source_data.name; + const value = source_data.value; + const data = await response.json(); + if (data[name] && data[name] == value){ + return {status: true, data } + } else { + alert_danger('show',`No data found for ${name}`) + return {status: false, data: {}}; + } + } else { + const data = await response.text(); + if (data != '') { alert_info('show',data); } + return {status: true, data } + } + } else if ( response.status === 401 ) { + alert_danger('show','Error connection, SESSION expired ? Try Reload !') + return {status: false, data: {}}; + } else if ( response.status === 400 ) { + alert_danger('show','Error connection, bad request. No data found !') + return {status: false, data: {}}; + } else { + alert_danger('show','Error connection, no data available') + return {status: false, data: {}}; + } +}; +const get_user = async (name, value) => { + if (GETUSER_URL) { + const data = { + name, + value + }; + return await post_fetch('get_user', GETUSER_URL,data); + } +}; +const save_user = async (data) => { + if (SAVEUSER_URL) { + return await post_fetch('save_user', SAVEUSER_URL,data); + } +}; +const list_act_items = () => { + let act_items=[]; + if (usrs_elem.checkbox_all) { + const state = usrs_elem.checkbox_all.checked; + [...usrs_elem.table.getElementsByClassName('col-check')].forEach(it => { + if (it.checked && it.dataset.col) { + if (usrs_env && usrs_env.data && usrs_env.data[it.dataset.col]) { + act_items.push({ + id: `${usrs_env.data[it.dataset.col]}`, + src: it, + }); + } + } + }); + } + return act_items; +}; +const act_reset_password = async () => { + if (RESETPASSWD_URL) { + if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); } + list_act_items().forEach(async (it) => { + const res = await post_fetch('act_reset_password', RESETPASSWD_URL,{ + name: "id", value: it.id + }); + if (res.status) { it.src.checked = false;} + }); + if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;} + } +}; +const act_reset_totp = async () => { + if (RESETTOTP_URL) { + if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); } + list_act_items().forEach(async (it) => { + const res = await post_fetch('act_reset_totp', RESETTOTP_URL,{ + name: "id", value: it.id + }); + if (res.status) { it.src.checked = false; } + }); + if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;} + } +}; +const act_set_isadmin = async () => { + if (SETADMIN_URL) { + if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); } + list_act_items().forEach(async (it) => { + const res = await post_fetch('act_set_isadmin', SETADMIN_URL,{ + name: "id", value: it.id + }); + if (res.status) { it.src.checked = false;} + }); + if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;} + } +}; +const act_delete = async () => { + if (DELETEUSER_URL) { + if (usrs_elem.dropdown_action) { usrs_elem.dropdown_action.classList.add('hidden'); } + list_act_items().forEach(async (it) => { + const res = await post_fetch('act_delete', DELETEUSER_URL,{ + name: "id", value: it.id + }); + if (res.status) { it.src.checked = false;} + }); + if (usrs_elem.checkbox_all) { usrs_elem.checkbox_all.checked=false;} + } +}; +window.addEventListener('load', () => { +// get_otp_info(); + load_data(); + load_elem(); + // if (usrs_elem && usrs_elem.search_clean) { + // usrs_elem.search_clean.addEventListener('click', (ev) => { + // ev.preventDefault(); + // usrs_elem.search_inpt.value=''; + // }); + // } + if (usrs_elem && usrs_elem.table) { + usrs_env.cols = {}; + const thead = usrs_elem.table.getElementsByTagName('thead'); + if (thead[0]) { + [...thead[0].getElementsByTagName('th')].forEach(col => { + const th = col.dataset.th; + if (th != 'check') { + usrs_env.cols[th]={asc: false}; + col.addEventListener('click', (ev) => { + ev.preventDefault(); + const src = col; + const th = src.dataset.th; + console.log(`${th}`); + table_sort(th); + }); + } + }); + } + } + // options with default values + const options = { + placement: 'bottom-right', + backdrop: 'dynamic', + backdropClasses: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40', + closable: true, + onHide: () => { + console.log('modal is hidden'); + }, + onShow: () => { + console.log('modal is shown'); + }, + onToggle: () => { + console.log('modal has been toggled'); + } + }; + usrs_env.modal = new Modal(usrs_elem.modal, options); +}); \ No newline at end of file diff --git a/resources/sitehome_model/assets/js/utils.js b/resources/sitehome_model/assets/js/utils.js new file mode 100644 index 0000000..55ada10 --- /dev/null +++ b/resources/sitehome_model/assets/js/utils.js @@ -0,0 +1,127 @@ +let _trace_bin=[]; +const utils = { + /* To avoid checking element and global css tasks handling + utils.css('toggle','main-header','',document,'h-10!') + utils.css('get','img','tag:3') + */ + css: (task, css_target, typ='object', root=document, css_name=['hidden'] ) => { + let target = typeof css_target == 'string' ? undefined : css_target; + let is_array = false; + const elem_toggle = (elem, css_class) => { + if (elem.classList) { + if (elem.classList.contains(css_class)) { + elem.classList.remove(css_class); + } else { + elem.classList.add(css_class); + } + } + } + let css_typ = typ; + if (task == 'get' && typ === 'object') { css_typ='id';} + let pos = -1; + if (css_typ.includes(':')) { + const arr_css = typ.split(':'); + css_typ = arr_css[0]; + pos = arr_css[1]; + } + if (typeof target === 'undefined') { + switch(css_typ) { + case 'object': + case 'id': + target = document.getElementById(css_target); + break; + case 'class': + if (root.getElementsByClassName) { + is_array=true; + if (pos != -1) { + const class_targets = root.getElementsByClassName(css_target); + if (class_targets && class_targets[pos]) { target = class_targets[pos]; } + } else { + target = root.getElementsByClassName(css_target); + } + } + break; + case 'tag': + if (root.getElementsByClassName) { + is_array=true; + if (pos != -1) { + const tag_targets = root.getElementsByTagName(css_target); + if (tag_targets && tag_targets[pos]) { target = tag_targets[pos]; } + } else { + target = root.getElementsByTagName(css_target); + } + } + break; + default: + target = document.getElementById(css_target); + } + } + if (target) { + if (typeof target.classList == 'undefined') { is_array = true;} + switch (task) { + case 'get': + return target; + break; + case 'is_add': + case 'is_hide': + if (is_array) { + return target[0].classList && target[0].classList.contains(css_name) ? true : false; + } else { + return target.classList && target.classList.contains(css_name) ? true : false; + } + break; + case 'add': + case 'hide': + if (is_array) { + [...target].forEach(it => { if (it.classList) { it.classList.add(css_name);} }); + } else { + if (target.classList) target.classList.add(css_name); + } + return target; + break; + case 'remove': + case 'show': + if (is_array) { + [...target].forEach(it => { if (it.classList) { it.classList.remove(css_name);} } ); + } else { + if (target.classList) target.classList.remove(css_name); + } + return target; + break; + case 'is_show': + case 'is_show': + if (is_array) { + return target[0].classList && !target[0].classList.contains(css_name) ? true : false; + } else { + return target.classList && !target.classList.contains(css_name) ? true : false; + } + break; + case 'toggle': + if (is_array) { + [...target].forEach(it => elem_toggle(it, css_name)); + } else { + elem_toggle(target, css_name); + } + return target; + default: + break; + } + } + return target; + }, + update_session: async (data) => { + if (UPDATE_SESSION_URL) { + const response = await fetch(UPDATE_SESSION_URL, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-type': 'application/json; charset=UTF-8', + } + }); + if (!response.ok && response.status != 200 ) { + throw new Error('Update session was not OK'); + return false; + } + } + }, +}; \ No newline at end of file diff --git a/resources/sitehome_model/assets/script.js b/resources/sitehome_model/assets/script.js new file mode 100644 index 0000000..184dfcc --- /dev/null +++ b/resources/sitehome_model/assets/script.js @@ -0,0 +1 @@ +console.log("Hello, World!"); diff --git a/resources/sitehome_model/data/sessions.db b/resources/sitehome_model/data/sessions.db new file mode 100644 index 0000000..9f5c22c Binary files /dev/null and b/resources/sitehome_model/data/sessions.db differ diff --git a/resources/sitehome_model/data/users b/resources/sitehome_model/data/users new file mode 100644 index 0000000..e69de29 diff --git a/resources/sitehome_model/data/users.db b/resources/sitehome_model/data/users.db new file mode 100644 index 0000000..a57bb74 Binary files /dev/null and b/resources/sitehome_model/data/users.db differ diff --git a/resources/sitehome_model/dist/index.html b/resources/sitehome_model/dist/index.html new file mode 100644 index 0000000..f305694 --- /dev/null +++ b/resources/sitehome_model/dist/index.html @@ -0,0 +1 @@ +Hi from DIST index.html diff --git a/resources/sitehome_model/dist/script.js b/resources/sitehome_model/dist/script.js new file mode 100644 index 0000000..184dfcc --- /dev/null +++ b/resources/sitehome_model/dist/script.js @@ -0,0 +1 @@ +console.log("Hello, World!"); diff --git a/resources/sitehome_model/docserver/.nojekyll b/resources/sitehome_model/docserver/.nojekyll new file mode 100644 index 0000000..f173110 --- /dev/null +++ b/resources/sitehome_model/docserver/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/resources/sitehome_model/docserver/CNAME b/resources/sitehome_model/docserver/CNAME new file mode 100644 index 0000000..d6ead12 --- /dev/null +++ b/resources/sitehome_model/docserver/CNAME @@ -0,0 +1 @@ +cl diff --git a/resources/sitehome_model/docserver/FontAwesome/css/font-awesome.css b/resources/sitehome_model/docserver/FontAwesome/css/font-awesome.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/resources/sitehome_model/docserver/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/FontAwesome.ttf b/resources/sitehome_model/docserver/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/resources/sitehome_model/docserver/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.eot b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.svg b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.ttf b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff2 b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/resources/sitehome_model/docserver/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/resources/sitehome_model/docserver/ace.js b/resources/sitehome_model/docserver/ace.js new file mode 100644 index 0000000..e8435a5 --- /dev/null +++ b/resources/sitehome_model/docserver/ace.js @@ -0,0 +1,43 @@ +/* +Copyright (c) 2010, Ajax.org B.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ajax.org B.V. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=i.match(/ Gecko\/\d+/),t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(i.split(" Edge/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isAndroid=i.indexOf("Android")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(i)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIPad||t.isAndroid}),ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function o(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0;if(typeof document!="undefined"){var s=document.createElement("div");t.HI_DPI&&s.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof s.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),s=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*"}},t,n;for(n in e.FUNCTION_KEYS)t=e.FUNCTION_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);for(n in e.PRINTABLE_KEYS)t=e.PRINTABLE_KEYS[n].toLowerCase(),e[t]=parseInt(n,10);return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",function(){var t=["cmd","ctrl","alt","shift"];for(var n=Math.pow(2,t.length);n--;)e.KEY_MODS[n]=t.filter(function(t){return n&e.KEY_MODS[t]}).join("-")+"-"}(),e.KEY_MODS[0]="",e.KEY_MODS[-1]="input-",e}();r.mixin(t,i),t.keyCodeToString=function(e){var t=i[e];return typeof t!="string"&&(t=String.fromCharCode(e)),t.toLowerCase()}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){t.getModifierState&&(t.getModifierState("OS")||t.getModifierState("Win"))&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null)}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){var r,i;t.addListener(e,"touchstart",function(e){var t=e.touches,n=t[0];r=n.clientX,i=n.clientY}),t.addListener(e,"touchmove",function(e){var t=e.touches;if(t.length>1)return;var s=t[0];e.wheelX=r-s.clientX,e.wheelY=i-s.clientY,r=s.clientX,i=s.clientY,n(e)})},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=a(n,e,e.keyCode);return u=e.defaultPrevented,t}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){s[e.keyCode]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l++,i=function(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())};t.addListener(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n63,l=400,c=e("../lib/keys"),h=c.KEY_MODS,p=i.isIOS,d=p?/\s/:/\n/,v=function(e,t){function W(){x=!0,n.blur(),n.focus(),x=!1}function V(e){e.keyCode==27&&n.value.lengthC&&T[s]=="\n")o=c.end;else if(rC&&T.slice(0,s).split("\n").length>2)o=c.down;else if(s>C&&T[s-1]==" ")o=c.right,u=h.option;else if(s>C||s==C&&C!=N&&r==s)o=c.right;r!==s&&(u|=h.shift),o&&(t.onCommandKey(null,u,o),N=r,C=s,A(""))};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var v=!1,m=!1,g=!1,y=!1,b="",w=!0,E=!1;i.isMobile||(n.style.fontSize="1px");var S=!1,x=!1,T="",N=0,C=0;try{var k=document.activeElement===n}catch(L){}r.addListener(n,"blur",function(e){if(x)return;t.onBlur(e),k=!1}),r.addListener(n,"focus",function(e){if(x)return;k=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(A):A()}),this.$focusScroll=!1,this.focus=function(){if(b||f||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return k},t.on("beforeEndOperation",function(){if(t.curOp&&t.curOp.command.name=="insertstring")return;g&&(T=n.value="",z()),A()});var A=p?function(e){if(!k||v&&!e||y)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=T=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(N!=i||C!=s)&&n.setSelectionRange(i,s),N=i,C=s}:function(){if(g||y)return;if(!k&&!D)return;g=!0;var e=t.selection,r=e.getRange(),i=e.cursor.row,s=r.start.column,o=r.end.column,u=t.session.getLine(i);if(r.start.row!=i){var a=t.session.getLine(i-1);s=r.start.rowi+1?f.length:o,o+=u.length+1,u=u+"\n"+f}u.length>l&&(s=T.length&&e.value===T&&T&&e.selectionEnd!==C},M=function(e){if(g)return;v?v=!1:O(n)&&(t.selectAll(),A())},_=null;this.setInputHandler=function(e){_=e},this.getInputHandler=function(){return _};var D=!1,P=function(e,r){D&&(D=!1);if(m)return A(),e&&t.onPaste(e),m=!1,"";var i=n.selectionStart,s=n.selectionEnd,o=N,u=T.length-C,a=e,f=e.length-i,l=e.length-s,c=0;while(o>0&&T[c]==e[c])c++,o--;a=a.slice(c),c=1;while(u>0&&T.length-c>N-1&&T[T.length-c]==e[e.length-c])c++,u--;return f-=c-1,l-=c-1,a=a.slice(0,a.length-c+1),!r&&f==a.length&&!o&&!u&&!l?"":(y=!0,a&&!o&&!u&&!f&&!l||S?t.onTextInput(a):t.onTextInput(a,{extendLeft:o,extendRight:u,restoreStart:f,restoreEnd:l}),y=!1,T=e,N=i,C=s,a)},H=function(e){if(g)return U();var t=n.value,r=P(t,!0);(t.length>l+100||d.test(r))&&A()},B=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||u)return;var i=a||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return B(e,t,!0)}},j=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);B(e,s)?(p&&(A(s),v=s,setTimeout(function(){v=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(v=!0,n.value=s,n.select(),setTimeout(function(){v=!1,A(),i?t.onCut():t.onCopy()}))},F=function(e){j(e,!0)},I=function(e){j(e,!1)},q=function(e){var s=B(e);typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(A),r.preventDefault(e)):(n.value="",m=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",M),r.addListener(n,"input",H),r.addListener(n,"cut",F),r.addListener(n,"copy",I),r.addListener(n,"paste",q),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:I(e);break;case 86:q(e);break;case 88:F(e)}});var R=function(e){if(g||!t.onCompositionStart||t.$readOnly)return;g={};if(S)return;setTimeout(U,0),t.on("mousedown",W);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,g.markerRange=r,g.selectionStart=N,t.onCompositionStart(g),g.useTextareaForIME?(n.value="",T="",N=0,C=0):(n.msGetInputContext&&(g.context=n.msGetInputContext()),n.getInputContext&&(g.context=n.getInputContext()))},U=function(){if(!g||!t.onCompositionUpdate||t.$readOnly)return;if(S)return W();if(g.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;P(e),g.markerRange&&(g.context&&(g.markerRange.start.column=g.selectionStart=g.context.compositionStartOffset),g.markerRange.end.column=g.markerRange.start.column+C-g.selectionStart)}},z=function(e){if(!t.onCompositionEnd||t.$readOnly)return;g=!1,t.onCompositionEnd(),t.off("mousedown",W),e&&H()},X=o.delayedCall(U,50).schedule.bind(null,null);r.addListener(n,"compositionstart",R),r.addListener(n,"compositionupdate",U),r.addListener(n,"keyup",V),r.addListener(n,"keydown",X),r.addListener(n,"compositionend",z),this.getElement=function(){return n},this.setCommandMode=function(e){S=e,n.readOnly=!1},this.setReadOnly=function(e){S||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){E=e},this.onContextMenu=function(e){D=!0,A(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){b||(b=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(N+C)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){n.style.left=e.clientX-l-2+"px",n.style.top=Math.min(e.clientY-f-2,c)+"px"};h(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),clearTimeout($),i.isWin&&r.capture(t.container,h,J)},this.onContextMenuClose=J;var $,K=function(e){t.textInput.onContextMenu(e),J()};r.addListener(n,"mouseup",K),r.addListener(n,"mousedown",function(e){e.preventDefault(),J()}),r.addListener(t.renderer.scroller,"contextmenu",K),r.addListener(n,"contextmenu",K),p&&Q(e,t,n)};t.TextInput=v}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e)),t.setDefaultHandler("touchmove",this.onTouchMove.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
"),i.setHtml(f),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),f()};var f=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),f=function(){})};t.init=l}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor,s=this.editor.renderer;s.$keepTextAreaAtCursor&&(s.$keepTextAreaAtCursor=null);var o=this,a=function(e){if(!e)return;if(i.isWebKit&&!e.which&&o.releaseMouse)return o.releaseMouse();o.x=e.clientX,o.y=e.clientY,t&&t(e),o.mouseEvent=new u(e,o.editor),o.$mouseMoved=!0},f=function(e){n.off("beforeEndOperation",c),clearInterval(h),l(),o[o.state+"End"]&&o[o.state+"End"](e),o.state="",s.$keepTextAreaAtCursor==null&&(s.$keepTextAreaAtCursor=!0,s.$moveTextAreaToCursor()),o.isMousePressed=!1,o.$onCaptureMouseMove=o.releaseMouse=null,e&&o.onMouseEvent("mouseup",e),n.endOperation()},l=function(){o[o.state]&&o[o.state](),o.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){f(e)});var c=function(e){if(!o.releaseMouse)return;n.curOp.command.name&&n.curOp.selectionChanged&&(o[o.state+"End"]&&o[o.state+"End"](),o.state="",o.releaseMouse())};n.on("beforeEndOperation",c),n.startOperation({command:{name:"mouse"}}),o.$onCaptureMouseMove=a,o.releaseMouse=r.capture(this.editor.container,a,f);var h=setInterval(l,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimeout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";function i(e){e.on("click",function(t){var n=t.getDocumentPosition(),i=e.session,s=i.getFoldAt(n.row,n.column,1);s&&(t.getAccelKey()?i.removeFold(s):i.expandFold(s),t.stop());var o=t.domEvent&&t.domEvent.target;o&&r.hasCssClass(o,"ace_inline_button")&&r.hasCssClass(o,"ace_toggle_wrap")&&(i.setOption("wrap",!0),e.renderer.scrollCursorIntoView())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}var r=e("../lib/dom");t.FoldHandler=i}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/lib/bidiutil",["require","exports","module"],function(e,t,n){"use strict";function F(e,t,n,r){var i=s?d:p,c=null,h=null,v=null,m=0,g=null,y=null,b=-1,w=null,E=null,T=[];if(!r)for(w=0,r=[];w0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var i=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&i.row===this.lead.row&&i.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[i.row]&&(i.row>0||e>0)&&i.row++,this.moveCursorTo(i.row,i.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length-t+1,i=e.start.row,s=e.start.column;for(var o=0,u=0;o20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column!=t.column||!this.$insertRight)&&(a.start.column+=l,a.start.row+=f);if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$insertRight)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn()+s.value.length-2,f}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;if(!r)return;t=t||this.getLength(),e=e||0;for(var i=e;i=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()},this.isFullWidth=m}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e);if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0)return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&e.bgTokenizer&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;is.length||i.length<2||!i[1])return this.commands.exec("insertstring",this,t);for(var o=s.length;o--;){var u=s[o];u.isEmpty()||r.remove(u),r.insert(u.start,i[o])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.inVirtualSelectionMode||(this.session.mergeUndoDeltas=!1,this.mergeNextCommand=!1)),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()&&e.indexOf("\n")==-1){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new p(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&o<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;hp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;g.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(w.prototype),g.defineOptions(w.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?E.attach(this):E.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?E.attach(this):E.detach(this)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var E={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=w}),ace.define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;i0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLength(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+e.width+(i||0)+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1);var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow))},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":f.className="ace_line",r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/(\t)|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\uFEFF\uFFF9-\uFFFC]+)|(\u3000)|([\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3001-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]|[\uD800-\uDBFF][\uDC00-\uDFFF])/g,u=this.dom.createFragment(this.element),a,f=0;while(a=o.exec(r)){var l=a[1],c=a[2],h=a[3],p=a[4],d=a[5];if(!i.showInvisibles&&c)continue;var v=f!=a.index?r.slice(f,a.index):"";f=a.index+a[0].length,v&&u.appendChild(this.dom.createTextNode(v,this.element));if(l){var m=i.session.getScreenTabSize(t+a.index);u.appendChild(i.$tabStrings[m].cloneNode(!0)),t+=m-1}else if(c)if(i.showInvisibles){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space",g.textContent=s.stringRepeat(i.SPACE_CHAR,c.length),u.appendChild(g)}else u.appendChild(this.com.createTextNode(c,this.element));else if(h){var g=this.dom.createElement("span");g.className="ace_invisible ace_invisible_space ace_invalid",g.textContent=s.stringRepeat(i.SPACE_CHAR,h.length),u.appendChild(g)}else if(p){var y=i.showInvisibles?i.SPACE_CHAR:"";t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",g.textContent=i.showInvisibles?i.SPACE_CHAR:"",u.appendChild(g)}else if(d){t+=1;var g=this.dom.createElement("span");g.style.width=i.config.characterWidth*2+"px",g.className="ace_cjk",g.textContent=d,u.appendChild(g)}}u.appendChild(this.dom.createTextNode(f?r.slice(f):r,this.element));if(!this.$textToken[n.type]){var b="ace_"+n.type.replace(/\./g," ace_"),g=this.dom.createElement("span");n.type=="fold"&&(g.style.width=n.value.length*this.config.characterWidth+"px"),g.className=b,g.appendChild(u),e.appendChild(g)}else e.appendChild(u);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);if(r<=0||r>=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;s=o)u=this.$renderToken(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderToken(a,u,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;sthis.MAX_LINE_LENGTH)return this.$renderOverflowMessage(e,n,r,i);n=this.$renderToken(e,n,r,i)}},this.$renderOverflowMessage=function(e,t,n,r){this.$renderToken(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var i=this.dom.createElement("span");i.className="ace_inline_button ace_keyword ace_toggle_wrap",i.style.position="absolute",i.style.right="0",i.textContent="",e.appendChild(i)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showInvisibles&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";setTimeout(function(){r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=256,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.innerHTML=s.stringRepeat("X",f),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){var n=t[0].contentRect;e.checkForSizeChanges({height:n.height,width:n.width/f})}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){var t={height:(e||this.$measureNode).clientHeight,width:(e||this.$measureNode).clientWidth/f};return t.width===0||t.height===0?null:t},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,f);var t=this.$main.getBoundingClientRect();return t.width/f},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return t?(window.getComputedStyle(t).zoom||1)*e(t.parentElement):1},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,d=e("./lib/event_emitter").EventEmitter,v='.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;box-sizing: border-box;min-width: 100%;contain: style size layout;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;contain: style size layout;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {position: absolute;top: 0;left: 0;right: 0;padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {contain: strict;position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;contain: strict;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: transparent;color: inherit;z-index: 1000;opacity: 1;}.ace_composition_placeholder { color: transparent }.ace_composition_marker { border-bottom: 1px solid;position: absolute;border-radius: 0;margin-top: 1px;}[ace_nocontext=true] {transform: none!important;filter: none!important;perspective: none!important;clip-path: none!important;mask : none!important;contain: none!important;perspective: none!important;mix-blend-mode: initial!important;z-index: auto;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;height: 1000000px;contain: style size layout;}.ace_text-layer {font: inherit !important;position: absolute;height: 1000000px;width: 1000000px;contain: style size layout;}.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {contain: style size layout;position: absolute;top: 0;left: 0;right: 0;}.ace_hidpi .ace_text-layer,.ace_hidpi .ace_gutter-layer,.ace_hidpi .ace_content,.ace_hidpi .ace_gutter {contain: strict;will-change: transform;}.ace_hidpi .ace_text-layer > .ace_line, .ace_hidpi .ace_text-layer > .ace_line_group {contain: strict;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {transition: opacity 0.18s;}.ace_animate-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: step-end;animation-name: blink-ace-animate;animation-iteration-count: infinite;}.ace_animate-blinking.ace_smooth-blinking .ace_cursor {animation-duration: 1000ms;animation-timing-function: ease-in-out;animation-name: blink-ace-animate-smooth;}@keyframes blink-ace-animate {from, to { opacity: 1; }60% { opacity: 0; }}@keyframes blink-ace-animate-smooth {from, to { opacity: 1; }45% { opacity: 1; }60% { opacity: 0; }85% { opacity: 0; }}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;box-sizing: border-box;}.ace_line .ace_fold {box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_inline_button {border: 1px solid lightgray;display: inline-block;margin: -1px 8px;padding: 0 5px;pointer-events: auto;cursor: pointer;}.ace_inline_button:hover {border-color: gray;background: rgba(200,200,200,0.2);display: inline-block;pointer-events: auto;}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}',m=e("./lib/useragent"),g=m.isIE;i.importCssString(v,"ace_editor.css");var y=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!m.isIOS,this.$loop=new h(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight());if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){var e=this.textarea.style;if(!this.$keepTextAreaAtCursor){i.translate(this.textarea,-100,0);return}var t=this.$cursorLayer.$pixelPos;if(!t)return;var n=this.$composition;n&&n.markerRange&&(t=this.$cursorLayer.getPixelPosition(n.markerRange.start,!0));var r=this.layerConfig,s=t.top,o=t.left;s-=r.offset;var u=n&&n.useTextareaForIME?this.lineHeight:g?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1;if(!n)s+=this.lineHeight;else if(n.useTextareaForIME){var f=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(f)[0],u+=2}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,this.$size.height-u))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?this.$showGutter&&this.$gutterLayer.update(n):e&this.CHANGE_CURSOR&&this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0,a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText,e.keepTextAreaAtCursor=this.$keepTextAreaAtCursor),e.useTextareaForIME=this.$useTextareaForIME,this.$useTextareaForIME?(this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null,this.$cursorLayer.element.style.display=""},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}',t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
"),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,typeof define=="function"&&(t.define=define),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version="1.4.4"}); (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); diff --git a/resources/sitehome_model/docserver/adminusers.html b/resources/sitehome_model/docserver/adminusers.html new file mode 100644 index 0000000..279d3d3 --- /dev/null +++ b/resources/sitehome_model/docserver/adminusers.html @@ -0,0 +1,212 @@ + + + + + + Users Admin - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Users Admin

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/assets/css/custom.css b/resources/sitehome_model/docserver/assets/css/custom.css new file mode 100644 index 0000000..3ae439c --- /dev/null +++ b/resources/sitehome_model/docserver/assets/css/custom.css @@ -0,0 +1,12 @@ +li.part-title { padding-left: 0.5em; } +.navy .chapter li.part-title { background: #353f62; } +.light .chapter li.part-title { background: #9c9cf9; } +.coal .chapter li.part-title { background: #121516; } +.ayu .chapter li.part-title { background: #333334; } +.rust .chapter li.part-title { background: #6b4438; } +.cell24 { width: 2rem; height: 4rem; } + +.logo { width: 300px; height: 300px; } +.box { display: flex; align-items: center; justify-content: center; } + + diff --git a/resources/sitehome_model/docserver/assets/css/mdbook-admonish.css b/resources/sitehome_model/docserver/assets/css/mdbook-admonish.css new file mode 100644 index 0000000..244bc9a --- /dev/null +++ b/resources/sitehome_model/docserver/assets/css/mdbook-admonish.css @@ -0,0 +1,353 @@ +@charset "UTF-8"; +:root { + --md-admonition-icon--note: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--abstract: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--info: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--tip: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--success: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--question: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--warning: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--failure: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--danger: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--bug: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--example: + url("data:image/svg+xml;charset=utf-8,"); + --md-admonition-icon--quote: + url("data:image/svg+xml;charset=utf-8,"); + --md-details-icon: + url("data:image/svg+xml;charset=utf-8,"); +} + +:is(.admonition) { + display: flow-root; + margin: 1.5625em 0; + padding: 0 1.2rem; + color: var(--fg); + page-break-inside: avoid; + background-color: var(--bg); + border: 0 solid black; + border-inline-start-width: 0.4rem; + border-radius: 0.2rem; + box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1); +} +@media print { + :is(.admonition) { + box-shadow: none; + } +} +:is(.admonition) > * { + box-sizing: border-box; +} +:is(.admonition) :is(.admonition) { + margin-top: 1em; + margin-bottom: 1em; +} +:is(.admonition) > .tabbed-set:only-child { + margin-top: 0; +} +html :is(.admonition) > :last-child { + margin-bottom: 1.2rem; +} + +a.admonition-anchor-link { + display: none; + position: absolute; + left: -1.2rem; + padding-right: 1rem; +} +a.admonition-anchor-link:link, a.admonition-anchor-link:visited { + color: var(--fg); +} +a.admonition-anchor-link:link:hover, a.admonition-anchor-link:visited:hover { + text-decoration: none; +} +a.admonition-anchor-link::before { + content: "§"; +} + +:is(.admonition-title, summary) { + position: relative; + min-height: 4rem; + margin-block: 0; + margin-inline: -1.6rem -1.2rem; + padding-block: 0.8rem; + padding-inline: 4.4rem 1.2rem; + font-weight: 700; + background-color: rgba(68, 138, 255, 0.1); + display: flex; +} +:is(.admonition-title, summary) p { + margin: 0; +} +html :is(.admonition-title, summary):last-child { + margin-bottom: 0; +} +:is(.admonition-title, summary)::before { + position: absolute; + top: 0.625em; + inset-inline-start: 1.6rem; + width: 2rem; + height: 2rem; + background-color: #448aff; + mask-image: url('data:image/svg+xml;charset=utf-8,'); + -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,'); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-size: contain; + content: ""; +} +:is(.admonition-title, summary):hover a.admonition-anchor-link { + display: initial; +} + +details.admonition > summary.admonition-title::after { + position: absolute; + top: 0.625em; + inset-inline-end: 1.6rem; + height: 2rem; + width: 2rem; + background-color: currentcolor; + mask-image: var(--md-details-icon); + -webkit-mask-image: var(--md-details-icon); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-size: contain; + content: ""; + transform: rotate(0deg); + transition: transform 0.25s; +} +details[open].admonition > summary.admonition-title::after { + transform: rotate(90deg); +} + +:is(.admonition):is(.note) { + border-color: #448aff; +} + +:is(.note) > :is(.admonition-title, summary) { + background-color: rgba(68, 138, 255, 0.1); +} +:is(.note) > :is(.admonition-title, summary)::before { + background-color: #448aff; + mask-image: var(--md-admonition-icon--note); + -webkit-mask-image: var(--md-admonition-icon--note); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.abstract, .summary, .tldr) { + border-color: #00b0ff; +} + +:is(.abstract, .summary, .tldr) > :is(.admonition-title, summary) { + background-color: rgba(0, 176, 255, 0.1); +} +:is(.abstract, .summary, .tldr) > :is(.admonition-title, summary)::before { + background-color: #00b0ff; + mask-image: var(--md-admonition-icon--abstract); + -webkit-mask-image: var(--md-admonition-icon--abstract); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.info, .todo) { + border-color: #00b8d4; +} + +:is(.info, .todo) > :is(.admonition-title, summary) { + background-color: rgba(0, 184, 212, 0.1); +} +:is(.info, .todo) > :is(.admonition-title, summary)::before { + background-color: #00b8d4; + mask-image: var(--md-admonition-icon--info); + -webkit-mask-image: var(--md-admonition-icon--info); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.tip, .hint, .important) { + border-color: #00bfa5; +} + +:is(.tip, .hint, .important) > :is(.admonition-title, summary) { + background-color: rgba(0, 191, 165, 0.1); +} +:is(.tip, .hint, .important) > :is(.admonition-title, summary)::before { + background-color: #00bfa5; + mask-image: var(--md-admonition-icon--tip); + -webkit-mask-image: var(--md-admonition-icon--tip); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.success, .check, .done) { + border-color: #00c853; +} + +:is(.success, .check, .done) > :is(.admonition-title, summary) { + background-color: rgba(0, 200, 83, 0.1); +} +:is(.success, .check, .done) > :is(.admonition-title, summary)::before { + background-color: #00c853; + mask-image: var(--md-admonition-icon--success); + -webkit-mask-image: var(--md-admonition-icon--success); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.question, .help, .faq) { + border-color: #64dd17; +} + +:is(.question, .help, .faq) > :is(.admonition-title, summary) { + background-color: rgba(100, 221, 23, 0.1); +} +:is(.question, .help, .faq) > :is(.admonition-title, summary)::before { + background-color: #64dd17; + mask-image: var(--md-admonition-icon--question); + -webkit-mask-image: var(--md-admonition-icon--question); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.warning, .caution, .attention) { + border-color: #ff9100; +} + +:is(.warning, .caution, .attention) > :is(.admonition-title, summary) { + background-color: rgba(255, 145, 0, 0.1); +} +:is(.warning, .caution, .attention) > :is(.admonition-title, summary)::before { + background-color: #ff9100; + mask-image: var(--md-admonition-icon--warning); + -webkit-mask-image: var(--md-admonition-icon--warning); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.failure, .fail, .missing) { + border-color: #ff5252; +} + +:is(.failure, .fail, .missing) > :is(.admonition-title, summary) { + background-color: rgba(255, 82, 82, 0.1); +} +:is(.failure, .fail, .missing) > :is(.admonition-title, summary)::before { + background-color: #ff5252; + mask-image: var(--md-admonition-icon--failure); + -webkit-mask-image: var(--md-admonition-icon--failure); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.danger, .error) { + border-color: #ff1744; +} + +:is(.danger, .error) > :is(.admonition-title, summary) { + background-color: rgba(255, 23, 68, 0.1); +} +:is(.danger, .error) > :is(.admonition-title, summary)::before { + background-color: #ff1744; + mask-image: var(--md-admonition-icon--danger); + -webkit-mask-image: var(--md-admonition-icon--danger); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.bug) { + border-color: #f50057; +} + +:is(.bug) > :is(.admonition-title, summary) { + background-color: rgba(245, 0, 87, 0.1); +} +:is(.bug) > :is(.admonition-title, summary)::before { + background-color: #f50057; + mask-image: var(--md-admonition-icon--bug); + -webkit-mask-image: var(--md-admonition-icon--bug); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.example) { + border-color: #7c4dff; +} + +:is(.example) > :is(.admonition-title, summary) { + background-color: rgba(124, 77, 255, 0.1); +} +:is(.example) > :is(.admonition-title, summary)::before { + background-color: #7c4dff; + mask-image: var(--md-admonition-icon--example); + -webkit-mask-image: var(--md-admonition-icon--example); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +:is(.admonition):is(.quote, .cite) { + border-color: #9e9e9e; +} + +:is(.quote, .cite) > :is(.admonition-title, summary) { + background-color: rgba(158, 158, 158, 0.1); +} +:is(.quote, .cite) > :is(.admonition-title, summary)::before { + background-color: #9e9e9e; + mask-image: var(--md-admonition-icon--quote); + -webkit-mask-image: var(--md-admonition-icon--quote); + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; + mask-size: contain; + -webkit-mask-repeat: no-repeat; +} + +.navy :is(.admonition) { + background-color: var(--sidebar-bg); +} + +.ayu :is(.admonition), .coal :is(.admonition) { + background-color: var(--theme-hover); +} + +.rust :is(.admonition) { + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.rust .admonition-anchor-link:link, .rust .admonition-anchor-link:visited { + color: var(--sidebar-fg); +} diff --git a/resources/sitehome_model/docserver/auths.html b/resources/sitehome_model/docserver/auths.html new file mode 100644 index 0000000..2b09957 --- /dev/null +++ b/resources/sitehome_model/docserver/auths.html @@ -0,0 +1,212 @@ + + + + + + Users auths - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/ayu-highlight.css b/resources/sitehome_model/docserver/ayu-highlight.css new file mode 100644 index 0000000..32c9432 --- /dev/null +++ b/resources/sitehome_model/docserver/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/resources/sitehome_model/docserver/book.js b/resources/sitehome_model/docserver/book.js new file mode 100644 index 0000000..f2516be --- /dev/null +++ b/resources/sitehome_model/docserver/book.js @@ -0,0 +1,688 @@ +"use strict"; + +// Fix back button cache problem +window.onunload = function () { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + let code_block = playground.querySelector("code"); + + if (window.ace && code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) + ]); + } + + var playgrounds = Array.from(document.querySelectorAll(".playground")); + if (playgrounds.length > 0) { + fetch_with_timeout("https://play.rust-lang.org/meta/crates", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + let playground_crates = response.crates.map(item => item["id"]); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + let code_block = playground_block.querySelector("code"); + if (code_block.classList.contains("editable")) { + let editor = window.ace.edit(code_block); + editor.addEventListener("change", function (e) { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: "run", + bindKey: { + win: "Ctrl-Enter", + mac: "Ctrl-Enter" + }, + exec: _editor => run_rust_code(playground_block) + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + var play_button = pre_block.querySelector(".play-button"); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains("no_run")) { + play_button.classList.add("hidden"); + return; + } + + // get list of `extern crate`'s from snippet + var txt = playground_text(pre_block); + var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + var snippet_crates = []; + var item; + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + var all_available = snippet_crates.every(function (elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove("hidden"); + } else { + play_button.classList.add("hidden"); + } + } + + function run_rust_code(code_block) { + var result_block = code_block.querySelector(".result"); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + let text = playground_text(code_block); + let classes = code_block.querySelector('code').classList; + let edition = "2015"; + if(classes.contains("edition2018")) { + edition = "2018"; + } else if(classes.contains("edition2021")) { + edition = "2021"; + } + var params = { + version: "stable", + optimize: "0", + code: text, + edition: edition + }; + + if (text.indexOf("#![feature") !== -1) { + params.version = "nightly"; + } + + result_block.innerText = "Running..."; + + fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { + headers: { + 'Content-Type': "application/json", + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params) + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = "No output"; + result_block.classList.add("result-no-output"); + } else { + result_block.innerText = response.result; + result_block.classList.remove("result-no-output"); + } + }) + .catch(error => result_block.innerText = "Playground Communication: " + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + let code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function (node) {return !node.parentElement.classList.contains("header"); }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function (node) {return node.classList.contains("editable"); }) + .forEach(function (block) { block.classList.remove('language-rust'); }); + + code_nodes + .filter(function (node) {return !node.classList.contains("editable"); }) + .forEach(function (block) { hljs.highlightBlock(block); }); + } else { + code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function (block) { block.classList.add('hljs'); }); + + Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { + + var lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { return; } + block.classList.add("hide-boring"); + + var buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ""; + + // add expand button + var pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function (e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function (block) { + var pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var clipButton = document.createElement('button'); + clipButton.className = 'fa fa-copy clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { + // Add play button + var buttons = pre_block.querySelector(".buttons"); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + var runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', function (e) { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + var copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'fa fa-copy clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + let code_block = pre_block.querySelector("code"); + if (window.ace && code_block.classList.contains("editable")) { + var undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function () { + let editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + var html = document.querySelector('html'); + var themeToggleButton = document.getElementById('theme-toggle'); + var themePopup = document.getElementById('theme-list'); + var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + var stylesheets = { + ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), + tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), + highlight: document.querySelector("[href$='highlight.css']"), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector("button#" + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function (el) { + el.classList.remove('theme-selected'); + }); + themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_theme() { + var theme; + try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } + if (theme === null || theme === undefined) { + return default_theme; + } else { + return theme; + } + } + + function set_theme(theme, store = true) { + let ace_theme; + + if (theme == 'coal' || theme == 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = "ace/theme/tomorrow_night"; + } else if (theme == 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = "ace/theme/tomorrow_night"; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = "ace/theme/dawn"; + } + + setTimeout(function () { + themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function (editor) { + editor.setTheme(ace_theme); + }); + } + + var previousTheme = get_theme(); + + if (store) { + try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + updateThemeSelected(); + } + + // Set theme + var theme = get_theme(); + + set_theme(theme, false); + + themeToggleButton.addEventListener('click', function () { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function (e) { + var theme; + if (e.target.className === "theme") { + theme = e.target.id; + } else if (e.target.parentElement.className === "theme") { + theme = e.target.parentElement.id; + } else { + return; + } + set_theme(theme); + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (!themePopup.contains(e.target)) { return; } + + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + var li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + var html = document.querySelector("html"); + var sidebar = document.getElementById("sidebar"); + var sidebarLinks = document.querySelectorAll('#sidebar a'); + var sidebarToggleButton = document.getElementById("sidebar-toggle"); + var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); + var firstContact = null; + + function showSidebar() { + html.classList.remove('sidebar-hidden') + html.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } + } + + + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + + function hideSidebar() { + html.classList.remove('sidebar-visible') + html.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function (link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } + } + + // Toggle sidebar + sidebarToggleButton.addEventListener('click', function sidebarToggle() { + if (html.classList.contains("sidebar-hidden")) { + var current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-width', '150px'); + } + showSidebar(); + } else if (html.classList.contains("sidebar-visible")) { + hideSidebar(); + } else { + if (getComputedStyle(sidebar)['transform'] === 'none') { + hideSidebar(); + } else { + showSidebar(); + } + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize(e) { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + html.classList.add('sidebar-resizing'); + } + function resize(e) { + var pos = (e.clientX - sidebar.offsetLeft); + if (pos < 20) { + hideSidebar(); + } else { + if (html.classList.contains("sidebar-hidden")) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize(e) { + html.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function (e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now() + }; + }, { passive: true }); + + document.addEventListener('touchmove', function (e) { + if (!firstContact) + return; + + var curX = e.touches[0].clientX; + var xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) + showSidebar(); + else if (xDiff < 0 && curX < 300) + hideSidebar(); + + firstContact = null; + } + }, { passive: true }); + + // Scroll sidebar to current active section + var activeSection = document.getElementById("sidebar").querySelector(".active"); + if (activeSection) { + // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView + activeSection.scrollIntoView({ block: 'center' }); + } +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function (e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } + if (window.search && window.search.hasFocus()) { return; } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + var nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + break; + case 'ArrowLeft': + e.preventDefault(); + var previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + break; + } + }); +})(); + +(function clipboard() { + var clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ""; + elem.className = 'fa fa-copy clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'fa fa-copy tooltipped'; + } + + var clipboardSnippets = new ClipboardJS('.clip-button', { + text: function (trigger) { + hideTooltip(trigger); + let playground = trigger.closest("pre"); + return playground_text(playground, false); + } + }); + + Array.from(clipButtons).forEach(function (clipButton) { + clipButton.addEventListener('mouseout', function (e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function (e) { + e.clearSelection(); + showTooltip(e.trigger, "Copied!"); + }); + + clipboardSnippets.on('error', function (e) { + showTooltip(e.trigger, "Clipboard error!"); + }); +})(); + +(function scrollToTop () { + var menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function () { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + var menu = document.getElementById('menu-bar'); + + (function controllPosition() { + var scrollTop = document.scrollingElement.scrollTop; + var prevScrollTop = scrollTop; + var minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + var topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function () { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + var nextSticky = null; + var nextTop = null; + var scrollDown = scrollTop > prevScrollTop; + var menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + menu.classList.remove('bordered'); + document.addEventListener('scroll', function () { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + }, { passive: true }); + })(); +})(); diff --git a/resources/sitehome_model/docserver/clipboard.min.js b/resources/sitehome_model/docserver/clipboard.min.js new file mode 100644 index 0000000..02c549e --- /dev/null +++ b/resources/sitehome_model/docserver/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n + + + + + Configurable service - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Configurable service

+

Doc Server can be adjusted to differents modes with Settings in Config file.

+
+

Config file

+

Config file path with Settings is passed as argument to Doc Server executable as:

+
docserver --config <CONFIG_PATH> 
+
+

It should be a TOML file-path with Configuration settings to run WebServer, it is REQUIRED to run Doc Server

+

It is composed by the following parts:

+ +

Main

+

On top of Configuration file:

+
    +
  • +

    root_path = “sitehome”, the most important as root path, other settings attibutes ending with _path can have relative path to this one or their own absolute or relative paths.

    +
  • +
  • +

    name = “docserver” is a name for service

    +
  • +
  • +

    org = “ORG” an organization name

    +
  • +
  • +

    verbose = 2 some debug info in requests handling is shown with values over 0

    +
  • +
  • +

    templates_path = “templates”, templates path

    +
  • +
  • +

    assets_url = “/assets” assets path for templates

    +
  • +
  • +

    allow_origin = [“http://localhost:8080”] allow origins for access control allow origin webserver directive

    +
  • +
+

HTTPS

+

TLS certificates path can be provided in:

+
cert_file = "cert/fullchain.pem"
+key_file = "cert/privkey.pem"
+
+

To use HTTPS traffic set protocol to https rather than http

+
protocol = "https"
+
+

Signup

+

It is about how new users will be created, there are two option:

+
    +
  • +

    Open by using a signup form with all details.

    +
  • +
  • +

    invitation by adminitrators, new user would receive an invitation link (it would include some details like email, roles,etc) connected to a session token with expiration time in seconds, this link can be sent by email if is set in config. By using an invitation link new user can fill a signup form with all details.

    +
  • +
+
## How to signup by 'invitation' or 'open'
+signup_mode = "invitation"
+invite_expire = 900 # in seconds
+
+

TOTP

+

TOPT as 2FA by default is set to no but it can also be:

+
    +
  • +

    optional to users settings, so they can activate or deactivate in signup and user settings edition.

    +
  • +
  • +

    mandatory means users have to configure in signup process.

    +
  • +
+

TOPT can only be reset by user settings or administrators via user edition form

+
# topt Mode: mandatory, optional, no (default)  
+totp_mode = "optional"
+# totp Digits: 6 (default) or 8 
+totp_digits = 6
+# topt Algorithm: sha1 (default), sha256, sha512
+totp_algorithm = "sha256"
+
+

Password score

+

Doc Server use Rust crate zxcvbn for password strength estimator, it can be enforced to a value:

+
password_score = 3
+
+

Admin user fields

+

admin_fields is a list of user fields or attributes to change only by administrators, user can only see their values.

+
admin_fields = "roles,otp_base32,status"
+
+

Mail service

+

It can be set as true or false, smtp_auth is token encrypted that can be generated by script tools/get_mail_token.sh that runs Doc Server program using credentials from paseto section (public_path and secret_path), it can be included not encrypted but is highly not recomended.

+
+

tools/get_mail_token.sh [mail_user] [mail_password] +Provides a token based in srcv pasetoken settings

+
+

As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run tools/get_mail_token.sh

+
use_mail = true
+smtp = "mail.example.com"
+smtp_auth = "v4.public..."
+mail_from ="admini@example.com"
+
+

Stores

+

Users and Sessions are stored in async sqlx to Sqlite or File storages, for larger use sqlx as Database Agnostic provides other SQL options

+
+

Prefix sqlite:: is for SQLite storage, usually a file ends with .db suffix.

+
+
users_store_uri = "sqlite:PATH_TO_users.db"
+session_store_uri = "sqlite:PATH_TO_sessions.db"
+session_expire = 300
+
+
+

Prefix file:/// if for FILE storage, value should be a directory. session_store_file value will be final file prefix follow by timestamp autogenerated value.

+
+
users_store_uri = "file:///PATH_TO_users_DIRECTORY"
+session_store_uri = "file:///PATH_TO_sessions_DIRECTORY"
+session_store_file = "session"
+session_expire = 300
+
+
+

session_expire is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.

+
+

Policies

+

Access policies to be enfoced for content access with Casbin require two file path:

+
authz_model_path = "PATH_TO_model.conf"
+authz_policy_path = "PATH_TO_policy.csv"
+
+

Templates

+

Tera template engine is used to to render response requests. Most of templates are HTML and in many cases use to include others from partials directory. Pre-render process is in charge of values setting.

+

Templates suffixes indicate if is html or txt and ends with j2 as standard extension for jinja2 templating engine.

+

Default templates_path = “templates” directory layout:

+
├── home.html.j2
+├── invite_create.html.j2
+├── invite_mail.html.j2
+├── invite_mail.txt.j2
+├── invite_output.html.j2
+├── login.html.j2
+├── logout.html.j2
+├── pages
+│   └── terms-conditions.html.j2
+├── partials
+│   ├── footer.html.j2
+│   ├── form-password.html.j2
+│   ├── form-totp.html.j2
+│   ├── form-user.html.j2
+│   ├── header.html.j2
+│   ├── loading.html.j2
+│   ├── mini_navbar.html.j2
+│   ├── modal_edit_user.html.j2
+│   ├── _navbar.html.j2
+│   ├── navbar.html.j2
+│   └── symbols.html.j2
+├── signup.html.j2
+├── user_settings.html.j2
+└── users.html.j2
+
+

Current templates use UnoCSS as CSS engine (compatible with Tailwindcss) and FLowbyte as CSS and JS component library, so they are added from UI configuration values

+
[ui]
+css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css"
+js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime"
+other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css"
+other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js"
+
+

Other JS values are used for basic tasks in page interaction:

+
[ui]
+main_js_link = "/assets/js/main.js"
+utils_js_link = "/assets/js/utils.js"
+
+

A main.css is used for customized CSS, is loaded in partials/header.html.j2 template as (pay attention to asserts_url):

+
/css/main.css
+
+

Values under [tpls] section are mapped values for template filename used in Doc Server request handlers to render a response, so basically filenames in templates_path value directory.

+

UI

+

Contains values for templates render for assets files: js, css.

+

Each web_menu_items entry set values (text, url, roles) for each navigation menu template used in pages.

+

Serv Paths

+

An entry for each static_content like in example bellow

+

Example:

+
[[serve_paths]]
+# Server relative Directory Path (sitehome/appdoc)
+srv_path = "Server DIRECTORY_PATH"
+# Absolute URL path for resquests
+url_path = "/appdoc"
+# Not found URL to be redirect 
+not_found = ""
+# URL to be redirect if is not authorization found
+not_auth = "/login"
+# true or false to access control or not to this PATH
+is_restricted = true
+
+
+

Access policies for serve_path.url_path should be in authz_policy_path file

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/cookie.html b/resources/sitehome_model/docserver/cookie.html new file mode 100644 index 0000000..3899e42 --- /dev/null +++ b/resources/sitehome_model/docserver/cookie.html @@ -0,0 +1,212 @@ + + + + + + Cookie set - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Cookie set

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/css/chrome.css b/resources/sitehome_model/docserver/css/chrome.css new file mode 100644 index 0000000..29992f7 --- /dev/null +++ b/resources/sitehome_model/docserver/css/chrome.css @@ -0,0 +1,545 @@ +/* CSS for UI elements (a.k.a. chrome) */ + +@import 'variables.css'; + +html { + scrollbar-color: var(--scrollbar) var(--bg); +} +#searchresults a, +.content a:link, +a:visited, +a > .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-bottom-color: var(--bg); + border-bottom-width: 1px; + border-bottom-style: solid; +} +#menu-bar.sticky, +.js #menu-bar-hover-placeholder:hover + #menu-bar, +.js #menu-bar:hover, +.js.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-bottom-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +.no-js .left-buttons { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.js .menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-top: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +.previous { + float: left; +} + +.next { + float: right; + right: var(--page-padding); +} + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +@media only screen and (max-width: 1380px) { + .sidebar-visible .nav-wide-wrapper { display: none; } + .sidebar-visible .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-left: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 3px 5px; + font-size: 14px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } +} +pre > code { + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-top: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding: 0 3px 1px 3px; + margin: 0 -3px -1px -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin: 5px auto 0px auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding: 18px 0 0 5px; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); + border-bottom: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-left: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin: 5px 0 0 20px; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +.js:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: 0; + top: 0; + bottom: 0; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: 5px; +} +.sidebar-hidden .sidebar { + transform: translateX(calc(0px - var(--sidebar-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +.sidebar-visible .page-wrapper { + transform: translateX(var(--sidebar-width)); +} +@media only screen and (min-width: 620px) { + .sidebar-visible .page-wrapper { + transform: none; + margin-left: var(--sidebar-width); + } +} + +.chapter { + list-style: none outside none; + padding-left: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-left: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-top: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-left: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: left; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-left: -14px; + width: 14px; +} diff --git a/resources/sitehome_model/docserver/css/general.css b/resources/sitehome_model/docserver/css/general.css new file mode 100644 index 0000000..06edcf6 --- /dev/null +++ b/resources/sitehome_model/docserver/css/general.css @@ -0,0 +1,204 @@ +/* Base styles and content styles */ + +@import 'variables.css'; + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-top: 2.5em; } +h4, h5 { margin-top: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-top: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-left: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; +} +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-left: auto; + margin-right: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-top: .1em solid var(--quote-border); + border-bottom: .1em solid var(--quote-border); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +:not(.footnote-definition) + .footnote-definition, +.footnote-definition + :not(.footnote-definition) { + margin-top: 2em; +} +.footnote-definition { + font-size: 0.9em; + margin: 0.5em 0; +} +.footnote-definition p { + display: inline; +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} + diff --git a/resources/sitehome_model/docserver/css/print.css b/resources/sitehome_model/docserver/css/print.css new file mode 100644 index 0000000..5e690f7 --- /dev/null +++ b/resources/sitehome_model/docserver/css/print.css @@ -0,0 +1,54 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none; + margin-left: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + background-color: #666666; + border-radius: 5px; + + /* Force background to be printed in Chrome */ + -webkit-print-color-adjust: exact; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/resources/sitehome_model/docserver/css/variables.css b/resources/sitehome_model/docserver/css/variables.css new file mode 100644 index 0000000..21bf8e5 --- /dev/null +++ b/resources/sitehome_model/docserver/css/variables.css @@ -0,0 +1,255 @@ + +/* Globals */ + +:root { + --sidebar-width: 300px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; +} + +.light { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; +} + +@media (prefers-color-scheme: dark) { + .light.no-js { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + } +} diff --git a/resources/sitehome_model/docserver/editor.js b/resources/sitehome_model/docserver/editor.js new file mode 100644 index 0000000..464790c --- /dev/null +++ b/resources/sitehome_model/docserver/editor.js @@ -0,0 +1,29 @@ +"use strict"; +window.editors = []; +(function(editors) { + if (typeof(ace) === 'undefined' || !ace) { + return; + } + + Array.from(document.querySelectorAll('.editable')).forEach(function(editable) { + let display_line_numbers = window.playground_line_numbers || false; + + let editor = ace.edit(editable); + editor.setOptions({ + highlightActiveLine: false, + showPrintMargin: false, + showLineNumbers: display_line_numbers, + showGutter: display_line_numbers, + maxLines: Infinity, + fontSize: "0.875em" // please adjust the font size of the code in general.css + }); + + editor.$blockScrolling = Infinity; + + editor.getSession().setMode("ace/mode/rust"); + + editor.originalCode = editor.getValue(); + + editors.push(editor); + }); +})(window.editors); diff --git a/resources/sitehome_model/docserver/elasticlunr.min.js b/resources/sitehome_model/docserver/elasticlunr.min.js new file mode 100644 index 0000000..94b20dd --- /dev/null +++ b/resources/sitehome_model/docserver/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + diff --git a/resources/sitehome_model/docserver/features.html b/resources/sitehome_model/docserver/features.html new file mode 100644 index 0000000..a597f11 --- /dev/null +++ b/resources/sitehome_model/docserver/features.html @@ -0,0 +1,238 @@ + + + + + + Features - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Features

+
    +
  1. +

    Server severals static contents paths from one web server instance

    +
  2. +
  3. +

    Protect access content with users authentication and authorizations

    +
  4. +
  5. +

    Create keys and sessions to content access with asymmetric encrypted

    +
  6. +
  7. +

    Handle and stored secure sessions and exchange it via cookies

    +
  8. +
  9. +

    Provides users management creation, identification and admin with password and 2FA with optional mail service for notifications

    +
  10. +
  11. +

    Some requests responses are created by a template engine, so can be customized to some use cases.

    +
  12. +
  13. +

    Can trace access to logs storages

    +
  14. +
  15. +

    Configurable service with settings via TOML file

    +
  16. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/fonts/OPEN-SANS-LICENSE.txt b/resources/sitehome_model/docserver/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/resources/sitehome_model/docserver/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/resources/sitehome_model/docserver/fonts/SOURCE-CODE-PRO-LICENSE.txt b/resources/sitehome_model/docserver/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 0000000..366206f --- /dev/null +++ b/resources/sitehome_model/docserver/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/resources/sitehome_model/docserver/fonts/fonts.css b/resources/sitehome_model/docserver/fonts/fonts.css new file mode 100644 index 0000000..858efa5 --- /dev/null +++ b/resources/sitehome_model/docserver/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000..9f51be3 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300italic.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000..2f54544 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 0000000..f503d55 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600italic.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000..c99aabe Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000..421a1ab Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700italic.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000..12ce3d2 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 0000000..c94a223 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800italic.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 0000000..eed7d3c Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-italic.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000..398b68a Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-regular.woff2 b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000..8383e94 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/resources/sitehome_model/docserver/fonts/source-code-pro-v11-all-charsets-500.woff2 b/resources/sitehome_model/docserver/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 0000000..7222456 Binary files /dev/null and b/resources/sitehome_model/docserver/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/resources/sitehome_model/docserver/highlight.css b/resources/sitehome_model/docserver/highlight.css new file mode 100644 index 0000000..ba57b82 --- /dev/null +++ b/resources/sitehome_model/docserver/highlight.css @@ -0,0 +1,82 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/resources/sitehome_model/docserver/highlight.js b/resources/sitehome_model/docserver/highlight.js new file mode 100644 index 0000000..180385b --- /dev/null +++ b/resources/sitehome_model/docserver/highlight.js @@ -0,0 +1,6 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:">>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/resources/sitehome_model/docserver/howto.html b/resources/sitehome_model/docserver/howto.html new file mode 100644 index 0000000..a736a5d --- /dev/null +++ b/resources/sitehome_model/docserver/howto.html @@ -0,0 +1,212 @@ + + + + + + How to - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

How to

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/images/Cryptograhy_LifeCycle.png b/resources/sitehome_model/docserver/images/Cryptograhy_LifeCycle.png new file mode 100644 index 0000000..d2e2069 Binary files /dev/null and b/resources/sitehome_model/docserver/images/Cryptograhy_LifeCycle.png differ diff --git a/resources/sitehome_model/docserver/images/doc.svg b/resources/sitehome_model/docserver/images/doc.svg new file mode 100644 index 0000000..34b7ff3 --- /dev/null +++ b/resources/sitehome_model/docserver/images/doc.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sitehome_model/docserver/images/docserver.svg b/resources/sitehome_model/docserver/images/docserver.svg new file mode 100644 index 0000000..018ed87 --- /dev/null +++ b/resources/sitehome_model/docserver/images/docserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/docserver/images/fig_ucf.png b/resources/sitehome_model/docserver/images/fig_ucf.png new file mode 100644 index 0000000..22569d8 Binary files /dev/null and b/resources/sitehome_model/docserver/images/fig_ucf.png differ diff --git a/resources/sitehome_model/docserver/images/server-doc.svg b/resources/sitehome_model/docserver/images/server-doc.svg new file mode 100644 index 0000000..34b7ff3 --- /dev/null +++ b/resources/sitehome_model/docserver/images/server-doc.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sitehome_model/docserver/images/ucf.png b/resources/sitehome_model/docserver/images/ucf.png new file mode 100644 index 0000000..c5d88f9 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_api.png b/resources/sitehome_model/docserver/images/ucf_api.png new file mode 100644 index 0000000..fd3dbf3 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_api.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_api_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_api_prog_langs.png new file mode 100644 index 0000000..12827ef Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_api_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_core.png b/resources/sitehome_model/docserver/images/ucf_core.png new file mode 100644 index 0000000..f30baa3 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_core.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_core_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_core_prog_langs.png new file mode 100644 index 0000000..ee7ab6a Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_core_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist.png b/resources/sitehome_model/docserver/images/ucf_dist.png new file mode 100644 index 0000000..265c0cd Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist_box.png b/resources/sitehome_model/docserver/images/ucf_dist_box.png new file mode 100644 index 0000000..f8f0d97 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist_box.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist_box_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_dist_box_prog_langs.png new file mode 100644 index 0000000..731115b Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist_box_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist_lib.png b/resources/sitehome_model/docserver/images/ucf_dist_lib.png new file mode 100644 index 0000000..d402246 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist_lib.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist_lib_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_dist_lib_prog_langs.png new file mode 100644 index 0000000..436095b Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist_lib_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_dist_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_dist_prog_langs.png new file mode 100644 index 0000000..23d1214 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_dist_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_higherorder.png b/resources/sitehome_model/docserver/images/ucf_higherorder.png new file mode 100644 index 0000000..66e1944 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_higherorder.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_higherorder_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_higherorder_prog_langs.png new file mode 100644 index 0000000..2a464ca Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_higherorder_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_plust_dist.png b/resources/sitehome_model/docserver/images/ucf_plust_dist.png new file mode 100644 index 0000000..09d114b Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_plust_dist.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_plust_dist_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_plust_dist_prog_langs.png new file mode 100644 index 0000000..3250ed1 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_plust_dist_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/images/ucf_prog_langs.png b/resources/sitehome_model/docserver/images/ucf_prog_langs.png new file mode 100644 index 0000000..01169c1 Binary files /dev/null and b/resources/sitehome_model/docserver/images/ucf_prog_langs.png differ diff --git a/resources/sitehome_model/docserver/index.html b/resources/sitehome_model/docserver/index.html new file mode 100644 index 0000000..c3c70a3 --- /dev/null +++ b/resources/sitehome_model/docserver/index.html @@ -0,0 +1,229 @@ + + + + + + What is this ? - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Doc Server is a Web Server in Rust for static content +with Control access via authorizations, fully customizable with settings.

+

+
+

One Server

+

Most of documentation or static content is generated to be served from a WebServer using absoulte, relative URL or a document base URL, this is a big issue to handle several at once from one unique server under url paths if are not set properly. In many cases there is no need for a dedicated web server for each documentation or static content that needs to be published or served. Some documentation generators are more or less configurables to use some URL relative path, this should include pages and assets (images, css, js, etc.).

+

Protect access content

+

In many case some protect access content mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal use or new versions not delivered yet.

+

Basic authentication or via one token could be too simple and flat to tailor specific contexts, so a full real sessions handling should implement users (identity entities), roles (groups), policies (permissions) and secure tokens (as data container).

+

Secure sessions

+

Sessions management to content access with secure storage (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow webserver to allow or deny an URL access request in a middleware stage.

+

Users

+

At least a simple users management creation, identification and admin to link sessions to an identified entity. Signin access should use secure passwords and 2FA with optional mail service for notifications. Signup modes should be also provided for close or open contexts.

+

Some requests responses are created by a template engine, so can be customized to some use cases.

+

Logging

+

Some kind of mechanism for logs storages and trace access to know what is happening and how is it used.

+

Configuration settings

+

Service configuration with settings via TOML file will help to customize server and services to context and needs.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/introduction.html b/resources/sitehome_model/docserver/introduction.html new file mode 100644 index 0000000..0ac36e8 --- /dev/null +++ b/resources/sitehome_model/docserver/introduction.html @@ -0,0 +1,253 @@ + + + + + + Introduction - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Doc Server is a Web Server in Rust for static content +with Control access via authorizations, fully customizable with settings.

+

+
+

DocServer is created to:

+ +
+
+

Main purpose

+

+
+
+

Control access to static contents paths from one web server instance

+

Tested with mdbooks with fixed absolute links via site-url or code docs

+
+
+
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/logs.html b/resources/sitehome_model/docserver/logs.html new file mode 100644 index 0000000..894ac47 --- /dev/null +++ b/resources/sitehome_model/docserver/logs.html @@ -0,0 +1,212 @@ + + + + + + Sessions logs - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Sessions logs

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/mark.min.js b/resources/sitehome_model/docserver/mark.min.js new file mode 100644 index 0000000..1636231 --- /dev/null +++ b/resources/sitehome_model/docserver/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c=n[1]?(e.length>n[1]&&(r="invalid"),n.shift(),n.shift(),this.next=n.shift()):this.next="",r},regex:/"#*/,next:"start"},{defaultToken:"string.quoted.raw.source.rust"}]},{token:"string.quoted.double.source.rust",regex:'"',push:[{token:"string.quoted.double.source.rust",regex:'"',next:"pop"},{token:"constant.character.escape.source.rust",regex:s},{defaultToken:"string.quoted.double.source.rust"}]},{token:["keyword.source.rust","text","entity.name.function.source.rust"],regex:"\\b(fn)(\\s+)((?:r#)?[a-zA-Z_][a-zA-Z0-9_]*)"},{token:"support.constant",regex:"\\b[a-zA-Z_][\\w\\d]*::"},{token:"keyword.source.rust",regex:"\\b(?:abstract|alignof|as|become|box|break|catch|continue|const|crate|default|do|dyn|else|enum|extern|for|final|if|impl|in|let|loop|macro|match|mod|move|mut|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\\b"},{token:"storage.type.source.rust",regex:"\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|u128|f16|f32|f64|i8|i16|i32|i64|i128|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\b"},{token:"variable.language.source.rust",regex:"\\bself\\b"},{token:"comment.line.doc.source.rust",regex:"//!.*$"},{token:"comment.line.double-dash.source.rust",regex:"//.*$"},{token:"comment.start.block.source.rust",regex:"/\\*",stateName:"comment",push:[{token:"comment.start.block.source.rust",regex:"/\\*",push:"comment"},{token:"comment.end.block.source.rust",regex:"\\*/",next:"pop"},{defaultToken:"comment.block.source.rust"}]},{token:"keyword.operator",regex:/\$|[-=]>|[-+%^=!&|<>]=?|[*/](?![*/])=?/},{token:"punctuation.operator",regex:/[?:,;.]/},{token:"paren.lparen",regex:/[\[({]/},{token:"paren.rparen",regex:/[\])}]/},{token:"constant.language.source.rust",regex:"\\b(?:true|false|Some|None|Ok|Err)\\b"},{token:"support.constant.source.rust",regex:"\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\b"},{token:"meta.preprocessor.source.rust",regex:"\\b\\w\\(\\w\\)*!|#\\[[\\w=\\(\\)_]+\\]\\b"},{token:"constant.numeric.source.rust",regex:/\b(?:0x[a-fA-F0-9_]+|0o[0-7_]+|0b[01_]+|[0-9][0-9_]*(?!\.))(?:[iu](?:size|8|16|32|64|128))?\b/},{token:"constant.numeric.source.rust",regex:/\b(?:[0-9][0-9_]*)(?:\.[0-9][0-9_]*)?(?:[Ee][+-][0-9][0-9_]*)?(?:f32|f64)?\b/}]},this.normalizeRules()};o.metaData={fileTypes:["rs","rc"],foldingStartMarker:"^.*\\bfn\\s*(\\w+\\s*)?\\([^\\)]*\\)(\\s*\\{[^\\}]*)?\\s*$",foldingStopMarker:"^\\s*\\}",name:"Rust",scopeName:"source.rust"},r.inherits(o,i),t.RustHighlightRules=o}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/rust",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/rust_highlight_rules","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./rust_highlight_rules").RustHighlightRules,o=e("./folding/cstyle").FoldMode,u=function(){this.HighlightRules=s,this.foldingRules=new o,this.$behaviour=this.$defaultBehaviour};r.inherits(u,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/",nestable:!0},this.$quotes={'"':'"'},this.$id="ace/mode/rust"}.call(u.prototype),t.Mode=u}); (function() { + ace.require(["ace/mode/rust"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/resources/sitehome_model/docserver/not-found.html b/resources/sitehome_model/docserver/not-found.html new file mode 100644 index 0000000..4af357a --- /dev/null +++ b/resources/sitehome_model/docserver/not-found.html @@ -0,0 +1,200 @@ + + + + + + Page not found - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

NOT Found

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/one_server.html b/resources/sitehome_model/docserver/one_server.html new file mode 100644 index 0000000..17a2fb5 --- /dev/null +++ b/resources/sitehome_model/docserver/one_server.html @@ -0,0 +1,212 @@ + + + + + + One web server instance - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

One web server instance

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/pasetoken.html b/resources/sitehome_model/docserver/pasetoken.html new file mode 100644 index 0000000..41e8436 --- /dev/null +++ b/resources/sitehome_model/docserver/pasetoken.html @@ -0,0 +1,255 @@ + + + + + + Pasetoken - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Pasetoken

+

Doc Server use PASETO: Platform-Agnostic Security Tokens as a way to generate Session data before to store it for persistance as a simple key value. It requires extra computation efforts but it is more secure and efficient, user data are only load in login or singup tasks, all the necessary informations for access control should be in session-data.

+

Paseto is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards.

+

Doc Server Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes.

+

To handle tokens a self library pasetoken-lib was developed for basic tasks like generate, parse, get claims, etc.

+

Generate keys

+

Doc Server executable can generate public and secret keys:

+
[ ! -d "paseto" ] && mkdir -p paseto 
+docserver -p paseto 
+
+

This command will generate: paseto/publick.ky and paseto/secret.ky, if not test for directory to exist keys will be overwritten.

+

Genereated key files can be used in configuration paseto settings

+
[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+
+
+ +

Paseto keys Changes

+

+
+
+

Change paseto keys will affect existing valid session tokens and others settings like smtp_auth value for Mail configuration

+

There is no problem if current valid sessions are dismissed or not need and smtp_auth value in configuration is set by using new keys.

+
+
+
+
+

Paseto Settings

+

+
+
+

As Doc Server Session data are not sent to clients, only keys are handled via cookie set, there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling.

+
+
+
[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+  is_bin = false
+  assert_val = ""
+  expire = true
+[paseto.map_footer]
+[paseto.data]
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/policies.html b/resources/sitehome_model/docserver/policies.html new file mode 100644 index 0000000..cf4f7e6 --- /dev/null +++ b/resources/sitehome_model/docserver/policies.html @@ -0,0 +1,212 @@ + + + + + + Access policies - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Access policies

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/print.html b/resources/sitehome_model/docserver/print.html new file mode 100644 index 0000000..c1672f3 --- /dev/null +++ b/resources/sitehome_model/docserver/print.html @@ -0,0 +1,863 @@ + + + + + + Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Doc Server is a Web Server in Rust for static content +with Control access via authorizations, fully customizable with settings.

+

+
+

DocServer is created to:

+ +
+
+

Main purpose

+

+
+
+

Control access to static contents paths from one web server instance

+

Tested with mdbooks with fixed absolute links via site-url or code docs

+
+

Doc Server is a Web Server in Rust for static content +with Control access via authorizations, fully customizable with settings.

+

+
+

One Server

+

Most of documentation or static content is generated to be served from a WebServer using absoulte, relative URL or a document base URL, this is a big issue to handle several at once from one unique server under url paths if are not set properly. In many cases there is no need for a dedicated web server for each documentation or static content that needs to be published or served. Some documentation generators are more or less configurables to use some URL relative path, this should include pages and assets (images, css, js, etc.).

+

Protect access content

+

In many case some protect access content mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal use or new versions not delivered yet.

+

Basic authentication or via one token could be too simple and flat to tailor specific contexts, so a full real sessions handling should implement users (identity entities), roles (groups), policies (permissions) and secure tokens (as data container).

+

Secure sessions

+

Sessions management to content access with secure storage (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow webserver to allow or deny an URL access request in a middleware stage.

+

Users

+

At least a simple users management creation, identification and admin to link sessions to an identified entity. Signin access should use secure passwords and 2FA with optional mail service for notifications. Signup modes should be also provided for close or open contexts.

+

Some requests responses are created by a template engine, so can be customized to some use cases.

+

Logging

+

Some kind of mechanism for logs storages and trace access to know what is happening and how is it used.

+

Configuration settings

+

Service configuration with settings via TOML file will help to customize server and services to context and needs.

+

Features

+
    +
  1. +

    Server severals static contents paths from one web server instance

    +
  2. +
  3. +

    Protect access content with users authentication and authorizations

    +
  4. +
  5. +

    Create keys and sessions to content access with asymmetric encrypted

    +
  6. +
  7. +

    Handle and stored secure sessions and exchange it via cookies

    +
  8. +
  9. +

    Provides users management creation, identification and admin with password and 2FA with optional mail service for notifications

    +
  10. +
  11. +

    Some requests responses are created by a template engine, so can be customized to some use cases.

    +
  12. +
  13. +

    Can trace access to logs storages

    +
  14. +
  15. +

    Configurable service with settings via TOML file

    +
  16. +
+

How to

+

Quick Start

+
    +
  1. +

    Set Main values: root_path, templates_path, assets_url.

    +
  2. +
  3. +

    To enable Signup:

    +
      +
    • In open mode: set signup_mode = “open”
    • +
    • In invitation mode: signup_mode = “invitation” (if is necessary fix invite_expire seconds)
    • +
    +
  4. +
  5. +

    To use HTTPS:

    +
      +
    • Set paths for cert_file and key_file
    • +
    • Set protocol = “https”
    • +
    +
  6. +
  7. +

    To use TOPT:

    +
      +
    • Set totp_mode = “optional” or totp_mode = “mandatory”
    • +
    +
  8. +
  9. +

    To use Mail service:

    +
      +
    • Set use_mail=true
    • +
    • Set [paseto] section (public_path and secret_path)
    • +
    • Run tools/get_mail_token.sh script to generate smtp_auth value with MAIL_USER and MAIL_PASSWORD
    • +
    • Complete values: smtp_auth and mail_from
    • +
    +
  10. +
  11. +

    Define Stores for service:

    +

    For Sessions +For [Users](users .md)

    +
      +
    • +

      For SQLite:

      +
        +
      • Create users_store_uri = “sqlite:PATH_TO_users.db”
      • +
      • set users_store_uri = “sqlite:PATH_TO_users.db”
      • +
      • Create sessions_store_uri = “sqlite:PATH_TO_sessions.db”
      • +
      • set sessions_store_uri = “sqlite:PATH_TO_sessions.db”
      • +
      +
    • +
    • +

      For FILE mode:

      +
        +
      • set users_store_uri = “file:///PATH_TO_users_DIRECTORY”
      • +
      • set sessions_store_uri = “file:///PATH_TO_sessions_DIRECTORY”
      • +
      +
    • +
    +
  12. +
  13. +

    Access policies to enfoce for content access with Casbin:

    +
      +
    • Set Policies paths: authz_model_path and authz_policy_path
    • +
    • Set an entry for each static_content like in example bellow
    • +
    • Be sure Access policies for each serve_path url_path are properly set in authz_policy_path file
    • +
    +
  14. +
+
+Example (url_path /appdoc): +
[[serve_paths]]
+# Server relative Directory Path (sitehome/appdoc)
+srv_path = "Server DIRECTORY_PATH"
+# Absolute URL path for resquests
+url_path = "/appdoc"
+# Not found URL to be redirect 
+not_found = ""
+# URL to be redirect if is not authorization found
+not_auth = "/login"
+# true or false to access control or not to this PATH
+is_restricted = true
+
+
+
+Policy content for url_path = "/appdoc" method GET: +

For Role dev:

+
p, dev, /appdoc, GET
+
+

For specific user only:

+
p, user@test.com, /appdoc, GET
+
+
+
    +
  1. Generate Pasetoken keys to generate Session data
  2. +
+

One web server instance

+

Server modes

+

Static contents

+

url_path prefix

+

Protect access

+

Users

+

SQL storage

+

Doc Server users use Rust crate SQLx

+

As Dataabse Agnostic can it easily support the following databases:

+ +

sqlx::any is used so:

+
+

Doc Server for users use a Generic database driver with the specific driver selected at runtime.

+
+

SQLx is also used for sessions SQL storage.

+

File storage

+

Roles

+

Users authentication and authorizations

+

Access policies

+

Users Admin

+

Session data

+

Pasetoken

+

Doc Server use PASETO: Platform-Agnostic Security Tokens as a way to generate Session data before to store it for persistance as a simple key value. It requires extra computation efforts but it is more secure and efficient, user data are only load in login or singup tasks, all the necessary informations for access control should be in session-data.

+

Paseto is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards.

+

Doc Server Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes.

+

To handle tokens a self library pasetoken-lib was developed for basic tasks like generate, parse, get claims, etc.

+

Generate keys

+

Doc Server executable can generate public and secret keys:

+
[ ! -d "paseto" ] && mkdir -p paseto 
+docserver -p paseto 
+
+

This command will generate: paseto/publick.ky and paseto/secret.ky, if not test for directory to exist keys will be overwritten.

+

Genereated key files can be used in configuration paseto settings

+
[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+
+
+ +

Paseto keys Changes

+

+
+
+

Change paseto keys will affect existing valid session tokens and others settings like smtp_auth value for Mail configuration

+

There is no problem if current valid sessions are dismissed or not need and smtp_auth value in configuration is set by using new keys.

+
+
+
+
+

Paseto Settings

+

+
+
+

As Doc Server Session data are not sent to clients, only keys are handled via cookie set, there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling.

+
+
+
[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+  is_bin = false
+  assert_val = ""
+  expire = true
+[paseto.map_footer]
+[paseto.data]
+
+

SQL storage

+

Doc Server Sesssions use Rust crate async_session for storage or data persistence, so bassically there are several stores to use.

+

To keep it small and simple async-sqlx-session is implemented by default with SQLite but as it is based on SQLx is is Database Agnostic and it easily support any other choice: PostgreSQL, MySQL, SQLite, and MSSQL.

+

SQLx is also used for users SQL storage.

+
+
+

Sessions store criteria

+

+
+
+

Control access to static contents paths requires Session data stored in database, cookies contains basically a Session ID with no extra content, all other (user or session) data require database access.

+

If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients.

+
+
+
+
+

Separate databases for Session and Users

+

+
+
+

Sessions and Users can use same database store by simply using same uri config values:

+
+
+

Setup

+

Axum

+

File storage

+

Cookie set

+

Traced

+

Sessions logs

+

Configurable service

+

Doc Server can be adjusted to differents modes with Settings in Config file.

+
+

Config file

+

Config file path with Settings is passed as argument to Doc Server executable as:

+
docserver --config <CONFIG_PATH> 
+
+

It should be a TOML file-path with Configuration settings to run WebServer, it is REQUIRED to run Doc Server

+

It is composed by the following parts:

+ +

Main

+

On top of Configuration file:

+
    +
  • +

    root_path = “sitehome”, the most important as root path, other settings attibutes ending with _path can have relative path to this one or their own absolute or relative paths.

    +
  • +
  • +

    name = “docserver” is a name for service

    +
  • +
  • +

    org = “ORG” an organization name

    +
  • +
  • +

    verbose = 2 some debug info in requests handling is shown with values over 0

    +
  • +
  • +

    templates_path = “templates”, templates path

    +
  • +
  • +

    assets_url = “/assets” assets path for templates

    +
  • +
  • +

    allow_origin = [“http://localhost:8080”] allow origins for access control allow origin webserver directive

    +
  • +
+

HTTPS

+

TLS certificates path can be provided in:

+
cert_file = "cert/fullchain.pem"
+key_file = "cert/privkey.pem"
+
+

To use HTTPS traffic set protocol to https rather than http

+
protocol = "https"
+
+

Signup

+

It is about how new users will be created, there are two option:

+
    +
  • +

    Open by using a signup form with all details.

    +
  • +
  • +

    invitation by adminitrators, new user would receive an invitation link (it would include some details like email, roles,etc) connected to a session token with expiration time in seconds, this link can be sent by email if is set in config. By using an invitation link new user can fill a signup form with all details.

    +
  • +
+
## How to signup by 'invitation' or 'open'
+signup_mode = "invitation"
+invite_expire = 900 # in seconds
+
+

TOTP

+

TOPT as 2FA by default is set to no but it can also be:

+
    +
  • +

    optional to users settings, so they can activate or deactivate in signup and user settings edition.

    +
  • +
  • +

    mandatory means users have to configure in signup process.

    +
  • +
+

TOPT can only be reset by user settings or administrators via user edition form

+
# topt Mode: mandatory, optional, no (default)  
+totp_mode = "optional"
+# totp Digits: 6 (default) or 8 
+totp_digits = 6
+# topt Algorithm: sha1 (default), sha256, sha512
+totp_algorithm = "sha256"
+
+

Password score

+

Doc Server use Rust crate zxcvbn for password strength estimator, it can be enforced to a value:

+
password_score = 3
+
+

Admin user fields

+

admin_fields is a list of user fields or attributes to change only by administrators, user can only see their values.

+
admin_fields = "roles,otp_base32,status"
+
+

Mail service

+

It can be set as true or false, smtp_auth is token encrypted that can be generated by script tools/get_mail_token.sh that runs Doc Server program using credentials from paseto section (public_path and secret_path), it can be included not encrypted but is highly not recomended.

+
+

tools/get_mail_token.sh [mail_user] [mail_password] +Provides a token based in srcv pasetoken settings

+
+

As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run tools/get_mail_token.sh

+
use_mail = true
+smtp = "mail.example.com"
+smtp_auth = "v4.public..."
+mail_from ="admini@example.com"
+
+

Stores

+

Users and Sessions are stored in async sqlx to Sqlite or File storages, for larger use sqlx as Database Agnostic provides other SQL options

+
+

Prefix sqlite:: is for SQLite storage, usually a file ends with .db suffix.

+
+
users_store_uri = "sqlite:PATH_TO_users.db"
+session_store_uri = "sqlite:PATH_TO_sessions.db"
+session_expire = 300
+
+
+

Prefix file:/// if for FILE storage, value should be a directory. session_store_file value will be final file prefix follow by timestamp autogenerated value.

+
+
users_store_uri = "file:///PATH_TO_users_DIRECTORY"
+session_store_uri = "file:///PATH_TO_sessions_DIRECTORY"
+session_store_file = "session"
+session_expire = 300
+
+
+

session_expire is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.

+
+

Policies

+

Access policies to be enfoced for content access with Casbin require two file path:

+
authz_model_path = "PATH_TO_model.conf"
+authz_policy_path = "PATH_TO_policy.csv"
+
+

Templates

+

Tera template engine is used to to render response requests. Most of templates are HTML and in many cases use to include others from partials directory. Pre-render process is in charge of values setting.

+

Templates suffixes indicate if is html or txt and ends with j2 as standard extension for jinja2 templating engine.

+

Default templates_path = “templates” directory layout:

+
├── home.html.j2
+├── invite_create.html.j2
+├── invite_mail.html.j2
+├── invite_mail.txt.j2
+├── invite_output.html.j2
+├── login.html.j2
+├── logout.html.j2
+├── pages
+│   └── terms-conditions.html.j2
+├── partials
+│   ├── footer.html.j2
+│   ├── form-password.html.j2
+│   ├── form-totp.html.j2
+│   ├── form-user.html.j2
+│   ├── header.html.j2
+│   ├── loading.html.j2
+│   ├── mini_navbar.html.j2
+│   ├── modal_edit_user.html.j2
+│   ├── _navbar.html.j2
+│   ├── navbar.html.j2
+│   └── symbols.html.j2
+├── signup.html.j2
+├── user_settings.html.j2
+└── users.html.j2
+
+

Current templates use UnoCSS as CSS engine (compatible with Tailwindcss) and FLowbyte as CSS and JS component library, so they are added from UI configuration values

+
[ui]
+css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css"
+js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime"
+other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css"
+other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js"
+
+

Other JS values are used for basic tasks in page interaction:

+
[ui]
+main_js_link = "/assets/js/main.js"
+utils_js_link = "/assets/js/utils.js"
+
+

A main.css is used for customized CSS, is loaded in partials/header.html.j2 template as (pay attention to asserts_url):

+
/css/main.css
+
+

Values under [tpls] section are mapped values for template filename used in Doc Server request handlers to render a response, so basically filenames in templates_path value directory.

+

UI

+

Contains values for templates render for assets files: js, css.

+

Each web_menu_items entry set values (text, url, roles) for each navigation menu template used in pages.

+

Serv Paths

+

An entry for each static_content like in example bellow

+

Example:

+
[[serve_paths]]
+# Server relative Directory Path (sitehome/appdoc)
+srv_path = "Server DIRECTORY_PATH"
+# Absolute URL path for resquests
+url_path = "/appdoc"
+# Not found URL to be redirect 
+not_found = ""
+# URL to be redirect if is not authorization found
+not_auth = "/login"
+# true or false to access control or not to this PATH
+is_restricted = true
+
+
+

Access policies for serve_path.url_path should be in authz_policy_path file

+
+

Config settings

+

This is an example of configuration file

+

Most of settings have default values to “/” for paths or “” for text or false for boolean, if are not set properly Doc Server config loadd will dispplay ain error an will not abort running.

+

Attributes order does not matter, in case of file path attributes relative path (the ones ending with path“) is tried and finally root_path valued as root path for values. Pay attention to cert and key paths

+

Base layout for example below as config.toml:

+
── Cargo.lock
+├── Cargo.toml
+├── certs 
+│   ├── fullchain.pem
+│   └── privkey.pem
+├── config.toml
+├── data
+│   ├── users.db
+│   └── sessions.db
+├── mdbook
+├── migrations
+│   ├── users.sql
+│   └── view.sql
+├── sitehome
+│   ├── assets
+│   ├── appdoc
+│   ├── html
+│   └── templates
+├── src
+├── paseto
+│   ├── public.ky
+│   └── secret.ky
+└── tools
+    └── get_mail_token.sh
+
+
root_path = "sitehome"
+name = "docserver"
+org = "ORG"
+verbose = 2
+home_path = ""
+prefix = ""
+resources_path = "resources"
+
+# Certs for SSL 
+cert_file = "certs/fullchain.pem"
+key_file = "certs/privkey.pem"
+
+templates_path = "templates"
+defaults_path = "resources/defaults"
+
+html_url = "/html"
+assets_url = "/assets"
+
+allow_origin = ["http://localhost:8080"]
+
+# HOST ip or name for Web service
+hostport = "docs.example.com:8800"
+bnd = "0.0.0.0"
+
+# PORT for Web service
+port = 8800
+protocol = "http"
+
+# Availables Langs
+langs = ["en","es"]
+dflt_lang = "en"
+
+## How to signup by 'invitation' or 'open'
+signup_mode = "open"
+invite_expire = 900 # in seconds
+
+# topt Mode: mandatory, optional, no (default)  
+totp_mode = "no"
+# totp Digits: 6 (default) or 8 
+totp_digits = 6
+# topt Algorithm: sha1 (default), sha256, sha512
+totp_algorithm = "sha256"
+
+password_score = 3
+admin_fields = "roles,otp_base32,status"
+
+use_mail = false
+smtp = "mail.example.com"
+smtp_auth = "v4.public..."
+mail_from ="admini@example.com"
+
+#users_store_uri = "file:///data/users"
+users_store_uri = "sqlite:data/users.db"
+user_store_access = "access"
+authz_model_path = "srvc/model.conf"
+authz_policy_path = "srvc/policy.csv"
+#session_store_uri = "file:///data/sessions"
+session_store_uri = "sqlite:data/sessions.db"
+session_store_file = "session"
+session_expire = 300
+
+[tpls]
+  url = "http://docs.example.com/"
+  main = "home.html.j2"
+  info = "info.html.j2"
+  help = "help.html.j2"
+  notfound = "notfound.html.j2"
+  notauth = "notauth.html.j2"
+  login = "login.html.j2"
+  logout = "logout.html.j2"
+  signup = "signup.html.j2"
+  user_settings = "user_settings.html.j2"
+  invite_create = "invite_create.html.j2"
+  invite_output = "invite_output.html.j2"
+  invite_mail_html = "invite_mail.html.j2"
+  invite_maili_txt = "invite_mail.txt.j2"
+  users = "users.html.j2"
+  trylater = "trylater.j2"
+  session  = "session.j2"
+  js = "js"
+  css = ""
+
+[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+  is_bin = false
+  assert_val = ""
+  expire = true
+[paseto.map_footer]
+[paseto.data]
+
+[ui]
+css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css"
+js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime"
+main_js_link = "/assets/js/main.js"
+utils_js_link = "/assets/js/utils.js"
+other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css"
+other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js"
+
+[[ui.web_menu_items]]
+# ~home text part will be removed, it is to indicate it is a home link
+text = "~home"
+url = "/"
+roles = []
+
+[[ui.web_menu_items]]
+text = "AppDoc"
+url = "/appdoc"
+roles = ["dev"]
+
+[[ui.web_menu_items]]
+text = "Users"
+url = "/users"
+roles = ["admin"]
+
+[[serv_paths]]
+src_path = "appdoc"
+url_path = "/appdoc"
+not_found = ""
+roles = "dev"
+redirect_to = "/login"
+not_auth = "/login"
+is_restricted = true
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/protect_access.html b/resources/sitehome_model/docserver/protect_access.html new file mode 100644 index 0000000..e68f367 --- /dev/null +++ b/resources/sitehome_model/docserver/protect_access.html @@ -0,0 +1,212 @@ + + + + + + Protect access - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Protect access

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/quick-start.html b/resources/sitehome_model/docserver/quick-start.html new file mode 100644 index 0000000..4a7cee5 --- /dev/null +++ b/resources/sitehome_model/docserver/quick-start.html @@ -0,0 +1,304 @@ + + + + + + Quick Start - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Quick Start

+
    +
  1. +

    Set Main values: root_path, templates_path, assets_url.

    +
  2. +
  3. +

    To enable Signup:

    +
      +
    • In open mode: set signup_mode = “open”
    • +
    • In invitation mode: signup_mode = “invitation” (if is necessary fix invite_expire seconds)
    • +
    +
  4. +
  5. +

    To use HTTPS:

    +
      +
    • Set paths for cert_file and key_file
    • +
    • Set protocol = “https”
    • +
    +
  6. +
  7. +

    To use TOPT:

    +
      +
    • Set totp_mode = “optional” or totp_mode = “mandatory”
    • +
    +
  8. +
  9. +

    To use Mail service:

    +
      +
    • Set use_mail=true
    • +
    • Set [paseto] section (public_path and secret_path)
    • +
    • Run tools/get_mail_token.sh script to generate smtp_auth value with MAIL_USER and MAIL_PASSWORD
    • +
    • Complete values: smtp_auth and mail_from
    • +
    +
  10. +
  11. +

    Define Stores for service:

    +

    For Sessions +For [Users](users .md)

    +
      +
    • +

      For SQLite:

      +
        +
      • Create users_store_uri = “sqlite:PATH_TO_users.db”
      • +
      • set users_store_uri = “sqlite:PATH_TO_users.db”
      • +
      • Create sessions_store_uri = “sqlite:PATH_TO_sessions.db”
      • +
      • set sessions_store_uri = “sqlite:PATH_TO_sessions.db”
      • +
      +
    • +
    • +

      For FILE mode:

      +
        +
      • set users_store_uri = “file:///PATH_TO_users_DIRECTORY”
      • +
      • set sessions_store_uri = “file:///PATH_TO_sessions_DIRECTORY”
      • +
      +
    • +
    +
  12. +
  13. +

    Access policies to enfoce for content access with Casbin:

    +
      +
    • Set Policies paths: authz_model_path and authz_policy_path
    • +
    • Set an entry for each static_content like in example bellow
    • +
    • Be sure Access policies for each serve_path url_path are properly set in authz_policy_path file
    • +
    +
  14. +
+
+Example (url_path /appdoc): +
[[serve_paths]]
+# Server relative Directory Path (sitehome/appdoc)
+srv_path = "Server DIRECTORY_PATH"
+# Absolute URL path for resquests
+url_path = "/appdoc"
+# Not found URL to be redirect 
+not_found = ""
+# URL to be redirect if is not authorization found
+not_auth = "/login"
+# true or false to access control or not to this PATH
+is_restricted = true
+
+
+
+Policy content for url_path = "/appdoc" method GET: +

For Role dev:

+
p, dev, /appdoc, GET
+
+

For specific user only:

+
p, user@test.com, /appdoc, GET
+
+
+
    +
  1. Generate Pasetoken keys to generate Session data
  2. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/roles.html b/resources/sitehome_model/docserver/roles.html new file mode 100644 index 0000000..62bb5b4 --- /dev/null +++ b/resources/sitehome_model/docserver/roles.html @@ -0,0 +1,212 @@ + + + + + + Roles - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Roles

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/searcher.js b/resources/sitehome_model/docserver/searcher.js new file mode 100644 index 0000000..d2b0aee --- /dev/null +++ b/resources/sitehome_model/docserver/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text') { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/resources/sitehome_model/docserver/searchindex.js b/resources/sitehome_model/docserver/searchindex.js new file mode 100644 index 0000000..75d9349 --- /dev/null +++ b/resources/sitehome_model/docserver/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["introduction.html","index.html#one-server","index.html#protect-access-content","index.html#secure-sessions","index.html#users","index.html#logging","index.html#configuration-settings","features.html#features","howto.html#how-to","quick-start.html#quick-start","one_server.html#one-web-server-instance","server_modes.html#server-modes","static_content.html#static-contents","url_path.html#url_path-prefix","protect_access.html#protect-access","users.html#users","users_sql.html#sql-storage","users_file_storage.html#file-storage","roles.html#roles","auths.html#users-authentication-and-authorizations","policies.html#access-policies","adminusers.html#users-admin","sessions.html#session-data","pasetoken.html#pasetoken","pasetoken.html#generate-keys","sessions_sql.html#sql-storage","sessions_sql.html#setup","sessions_file_storage.html#file-storage","cookie.html#cookie-set","trace.html#traced","logs.html#sessions-logs","configuration.html#configurable-service","configuration.html#config-file","configuration.html#main","configuration.html#https","configuration.html#signup","configuration.html#totp","configuration.html#password-score","configuration.html#admin-user-fields","configuration.html#mail-service","configuration.html#stores","configuration.html#policies","configuration.html#templates","configuration.html#ui","configuration.html#serv-paths","settings.html#config-settings"],"index":{"documentStore":{"docInfo":{"0":{"body":173,"breadcrumbs":1,"title":1},"1":{"body":69,"breadcrumbs":2,"title":2},"10":{"body":0,"breadcrumbs":8,"title":4},"11":{"body":0,"breadcrumbs":4,"title":2},"12":{"body":0,"breadcrumbs":4,"title":2},"13":{"body":0,"breadcrumbs":4,"title":2},"14":{"body":0,"breadcrumbs":4,"title":2},"15":{"body":0,"breadcrumbs":2,"title":1},"16":{"body":35,"breadcrumbs":4,"title":2},"17":{"body":0,"breadcrumbs":4,"title":2},"18":{"body":0,"breadcrumbs":2,"title":1},"19":{"body":0,"breadcrumbs":5,"title":3},"2":{"body":45,"breadcrumbs":3,"title":3},"20":{"body":0,"breadcrumbs":4,"title":2},"21":{"body":0,"breadcrumbs":4,"title":2},"22":{"body":0,"breadcrumbs":4,"title":2},"23":{"body":77,"breadcrumbs":2,"title":1},"24":{"body":104,"breadcrumbs":3,"title":2},"25":{"body":96,"breadcrumbs":4,"title":2},"26":{"body":1,"breadcrumbs":3,"title":1},"27":{"body":0,"breadcrumbs":4,"title":2},"28":{"body":0,"breadcrumbs":4,"title":2},"29":{"body":0,"breadcrumbs":2,"title":1},"3":{"body":24,"breadcrumbs":2,"title":2},"30":{"body":0,"breadcrumbs":4,"title":2},"31":{"body":8,"breadcrumbs":4,"title":2},"32":{"body":86,"breadcrumbs":4,"title":2},"33":{"body":55,"breadcrumbs":3,"title":1},"34":{"body":17,"breadcrumbs":3,"title":1},"35":{"body":49,"breadcrumbs":3,"title":1},"36":{"body":50,"breadcrumbs":3,"title":1},"37":{"body":13,"breadcrumbs":4,"title":2},"38":{"body":12,"breadcrumbs":5,"title":3},"39":{"body":49,"breadcrumbs":4,"title":2},"4":{"body":34,"breadcrumbs":1,"title":1},"40":{"body":68,"breadcrumbs":3,"title":1},"41":{"body":14,"breadcrumbs":3,"title":1},"42":{"body":134,"breadcrumbs":3,"title":1},"43":{"body":22,"breadcrumbs":3,"title":1},"44":{"body":43,"breadcrumbs":4,"title":2},"45":{"body":284,"breadcrumbs":4,"title":2},"5":{"body":9,"breadcrumbs":1,"title":1},"6":{"body":12,"breadcrumbs":2,"title":2},"7":{"body":59,"breadcrumbs":2,"title":1},"8":{"body":0,"breadcrumbs":0,"title":0},"9":{"body":169,"breadcrumbs":4,"title":2}},"docs":{"0":{"body":"Doc Server is a Web Server in Rust for static content with Control access via authorizations , fully customizable with settings . DocServer is created to: Serve several static contents paths from one web server instance at once. Server is based in Rust Axum crate under Tokio , with a lot of config settings to customize in a config TOML file: SSL, Paths, Menus, Keys, Contents, Roles, etc. Use static contents from mdbooks with fixed absolute links via site-url or code docs from Cargo doc . Protect access to static contents with users authentication and authorizations by url_path prefix , roles or users login names or emails. Define access policies to enfoce for content access with Casbin Handle user defininition: Create/Invite, SignIn/SignOut, Settings, Roles, Administration. Several users modes can be set via config settings . For user authentication use Argon2 for password and TOPT as 2FA with optional mail service for notifications Sessions are stored in async sqlx to Sqlite or File storages and keys handled via cookie set , for larger use sqlx as Database Agnostic provides other SQL options Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes. Some requests responses are created by a template engine , so can be customized to some use cases. Optionally request can be traced in sessions logs Main purpose Control access to static contents paths from one web server instance Tested with mdbooks with fixed absolute links via site-url or code docs","breadcrumbs":"Introduction","id":"0","title":"Introduction"},"1":{"body":"Doc Server is a Web Server in Rust for static content with Control access via authorizations , fully customizable with settings . Most of documentation or static content is generated to be served from a WebServer using absoulte , relative URL or a document base URL , this is a big issue to handle several at once from one unique server under url paths if are not set properly. In many cases there is no need for a dedicated web server for each documentation or static content that needs to be published or served. Some documentation generators are more or less configurables to use some URL relative path , this should include pages and assets (images, css, js, etc.).","breadcrumbs":"What is this ? » One Server","id":"1","title":"One Server"},"10":{"body":"","breadcrumbs":"One web server instance » One web server instance","id":"10","title":"One web server instance"},"11":{"body":"","breadcrumbs":"Server modes » Server modes","id":"11","title":"Server modes"},"12":{"body":"","breadcrumbs":"Static contents » Static contents","id":"12","title":"Static contents"},"13":{"body":"","breadcrumbs":"url_path prefix » url_path prefix","id":"13","title":"url_path prefix"},"14":{"body":"","breadcrumbs":"Protect access » Protect access","id":"14","title":"Protect access"},"15":{"body":"","breadcrumbs":"Users » Users","id":"15","title":"Users"},"16":{"body":"Doc Server users use Rust crate SQLx As Dataabse Agnostic can it easily support the following databases: PostgreSQL MySQL SQLite MSSQL sqlx::any is used so: Doc Server for users use a Generic database driver with the specific driver selected at runtime. SQLx is also used for sessions SQL storage .","breadcrumbs":"SQL storage » SQL storage","id":"16","title":"SQL storage"},"17":{"body":"","breadcrumbs":"File storage » File storage","id":"17","title":"File storage"},"18":{"body":"","breadcrumbs":"Roles » Roles","id":"18","title":"Roles"},"19":{"body":"","breadcrumbs":"Users auths » Users authentication and authorizations","id":"19","title":"Users authentication and authorizations"},"2":{"body":"In many case some protect access content mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal use or new versions not delivered yet. Basic authentication or via one token could be too simple and flat to tailor specific contexts, so a full real sessions handling should implement users (identity entities), roles (groups), policies (permissions) and secure tokens (as data container).","breadcrumbs":"What is this ? » Protect access content","id":"2","title":"Protect access content"},"20":{"body":"","breadcrumbs":"Access policies » Access policies","id":"20","title":"Access policies"},"21":{"body":"","breadcrumbs":"Users Admin » Users Admin","id":"21","title":"Users Admin"},"22":{"body":"","breadcrumbs":"Session data » Session data","id":"22","title":"Session data"},"23":{"body":"Doc Server use PASETO: Platform-Agnostic Security Tokens as a way to generate Session data before to store it for persistance as a simple key value . It requires extra computation efforts but it is more secure and efficient, user data are only load in login or singup tasks, all the necessary informations for access control should be in session-data . Paseto is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards. Doc Server Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes. To handle tokens a self library pasetoken-lib was developed for basic tasks like generate, parse, get claims, etc.","breadcrumbs":"Pasetoken » Pasetoken","id":"23","title":"Pasetoken"},"24":{"body":"Doc Server executable can generate public and secret keys: [ ! -d \"paseto\" ] && mkdir -p paseto docserver -p paseto This command will generate: paseto/publick.ky and paseto/secret.ky , if not test for directory to exist keys will be overwritten. Genereated key files can be used in configuration paseto settings [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" Paseto keys Changes Change paseto keys will affect existing valid session tokens and others settings like smtp_auth value for Mail configuration There is no problem if current valid sessions are dismissed or not need and smtp_auth value in configuration is set by using new keys. Paseto Settings As Doc Server Session data are not sent to clients, only keys are handled via cookie set , there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling. [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" is_bin = false assert_val = \"\" expire = true\n[paseto.map_footer]\n[paseto.data]","breadcrumbs":"Pasetoken » Generate keys","id":"24","title":"Generate keys"},"25":{"body":"Doc Server Sesssions use Rust crate async_session for storage or data persistence, so bassically there are several stores to use. To keep it small and simple async-sqlx-session is implemented by default with SQLite but as it is based on SQLx is is Database Agnostic and it easily support any other choice: PostgreSQL , MySQL , SQLite , and MSSQL . SQLx is also used for users SQL storage . Sessions store criteria Control access to static contents paths requires Session data stored in database, cookies contains basically a Session ID with no extra content, all other ( user or session ) data require database access. If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients. Separate databases for Session and Users Sessions and Users can use same database store by simply using same uri config values :","breadcrumbs":"SQL storage » SQL storage","id":"25","title":"SQL storage"},"26":{"body":"Axum","breadcrumbs":"SQL storage » Setup","id":"26","title":"Setup"},"27":{"body":"","breadcrumbs":"File storage » File storage","id":"27","title":"File storage"},"28":{"body":"","breadcrumbs":"Cookie set » Cookie set","id":"28","title":"Cookie set"},"29":{"body":"","breadcrumbs":"Traced » Traced","id":"29","title":"Traced"},"3":{"body":"Sessions management to content access with secure storage (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow webserver to allow or deny an URL access request in a middleware stage.","breadcrumbs":"What is this ? » Secure sessions","id":"3","title":"Secure sessions"},"30":{"body":"","breadcrumbs":"Sessions logs » Sessions logs","id":"30","title":"Sessions logs"},"31":{"body":"Doc Server can be adjusted to differents modes with Settings in Config file .","breadcrumbs":"Configurable service » Configurable service","id":"31","title":"Configurable service"},"32":{"body":"Config file path with Settings is passed as argument to Doc Server executable as: docserver --config It should be a TOML file-path with Configuration settings to run WebServer , it is REQUIRED to run Doc Server It is composed by the following parts: Paths, URLs, Web Server main settings (port, host, protocol, SSL certificates, etc) Signup and Signin settings: password , TOTP , admin fields , etc. Mail settings if enabled Stores locations for Users, Auths and Sessions Templates : tpls to render requests responses Pasetoken : paseto for token configurations UI where major user interface are defined: Assets links for JS and CSS web_menu_items as items to show in top menu navigator serv_paths where static content path are defined as is_restricted and with allowed roles","breadcrumbs":"Configurable service » Config file","id":"32","title":"Config file"},"33":{"body":"On top of Configuration file : root_path = \"sitehome\", the most important as root path, other settings attibutes ending with _path can have relative path to this one or their own absolute or relative paths. name = \"docserver\" is a name for service org = \"ORG\" an organization name verbose = 2 some debug info in requests handling is shown with values over 0 templates_path = \"templates\", templates path assets_url = \"/assets\" assets path for templates allow_origin = [\"http://localhost:8080\"] allow origins for access control allow origin webserver directive","breadcrumbs":"Configurable service » Main","id":"33","title":"Main"},"34":{"body":"TLS certificates path can be provided in: cert_file = \"cert/fullchain.pem\"\nkey_file = \"cert/privkey.pem\" To use HTTPS traffic set protocol to https rather than http protocol = \"https\"","breadcrumbs":"Configurable service » HTTPS","id":"34","title":"HTTPS"},"35":{"body":"It is about how new users will be created, there are two option: Open by using a signup form with all details. invitation by adminitrators , new user would receive an invitation link (it would include some details like email, roles,etc) connected to a session token with expiration time in seconds, this link can be sent by email if is set in config. By using an invitation link new user can fill a signup form with all details. ## How to signup by 'invitation' or 'open'\nsignup_mode = \"invitation\"\ninvite_expire = 900 # in seconds","breadcrumbs":"Configurable service » Signup","id":"35","title":"Signup"},"36":{"body":"TOPT as 2FA by default is set to no but it can also be: optional to users settings, so they can activate or deactivate in signup and user settings edition. mandatory means users have to configure in signup process. TOPT can only be reset by user settings or administrators via user edition form # topt Mode: mandatory, optional, no (default) totp_mode = \"optional\"\n# totp Digits: 6 (default) or 8 totp_digits = 6\n# topt Algorithm: sha1 (default), sha256, sha512\ntotp_algorithm = \"sha256\"","breadcrumbs":"Configurable service » TOTP","id":"36","title":"TOTP"},"37":{"body":"Doc Server use Rust crate zxcvbn for password strength estimator, it can be enforced to a value: password_score = 3","breadcrumbs":"Configurable service » Password score","id":"37","title":"Password score"},"38":{"body":"admin_fields is a list of user fields or attributes to change only by administrators , user can only see their values. admin_fields = \"roles,otp_base32,status\"","breadcrumbs":"Configurable service » Admin user fields","id":"38","title":"Admin user fields"},"39":{"body":"It can be set as true or false , smtp_auth is token encrypted that can be generated by script tools/get_mail_token.sh that runs Doc Server program using credentials from paseto section ( public_path and secret_path ), it can be included not encrypted but is highly not recomended. tools/get_mail_token.sh [mail_user] [mail_password] Provides a token based in srcv pasetoken settings As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run tools/get_mail_token.sh use_mail = true\nsmtp = \"mail.example.com\"\nsmtp_auth = \"v4.public...\"\nmail_from =\"admini@example.com\"","breadcrumbs":"Configurable service » Mail service","id":"39","title":"Mail service"},"4":{"body":"At least a simple users management creation, identification and admin to link sessions to an identified entity. Signin access should use secure passwords and 2FA with optional mail service for notifications. Signup modes should be also provided for close or open contexts. Some requests responses are created by a template engine , so can be customized to some use cases.","breadcrumbs":"What is this ? » Users","id":"4","title":"Users"},"40":{"body":"Users and Sessions are stored in async sqlx to Sqlite or File storages, for larger use sqlx as Database Agnostic provides other SQL options Prefix sqlite:: is for SQLite storage, usually a file ends with .db suffix. users_store_uri = \"sqlite:PATH_TO_users.db\"\nsession_store_uri = \"sqlite:PATH_TO_sessions.db\"\nsession_expire = 300 Prefix file:/// if for FILE storage, value should be a directory. session_store_file value will be final file prefix follow by timestamp autogenerated value. users_store_uri = \"file:///PATH_TO_users_DIRECTORY\"\nsession_store_uri = \"file:///PATH_TO_sessions_DIRECTORY\"\nsession_store_file = \"session\"\nsession_expire = 300 session_expire is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.","breadcrumbs":"Configurable service » Stores","id":"40","title":"Stores"},"41":{"body":"Access policies to be enfoced for content access with Casbin require two file path: authz_model_path = \"PATH_TO_model.conf\"\nauthz_policy_path = \"PATH_TO_policy.csv\"","breadcrumbs":"Configurable service » Policies","id":"41","title":"Policies"},"42":{"body":"Tera template engine is used to to render response requests. Most of templates are HTML and in many cases use to include others from partials directory. Pre-render process is in charge of values setting. Templates suffixes indicate if is html or txt and ends with j2 as standard extension for jinja2 templating engine. Default templates_path = \"templates\" directory layout: ├── home.html.j2\n├── invite_create.html.j2\n├── invite_mail.html.j2\n├── invite_mail.txt.j2\n├── invite_output.html.j2\n├── login.html.j2\n├── logout.html.j2\n├── pages\n│ └── terms-conditions.html.j2\n├── partials\n│ ├── footer.html.j2\n│ ├── form-password.html.j2\n│ ├── form-totp.html.j2\n│ ├── form-user.html.j2\n│ ├── header.html.j2\n│ ├── loading.html.j2\n│ ├── mini_navbar.html.j2\n│ ├── modal_edit_user.html.j2\n│ ├── _navbar.html.j2\n│ ├── navbar.html.j2\n│ └── symbols.html.j2\n├── signup.html.j2\n├── user_settings.html.j2\n└── users.html.j2 Current templates use UnoCSS as CSS engine (compatible with Tailwindcss ) and FLowbyte as CSS and JS component library, so they are added from UI configuration values [ui]\ncss_link = \"https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css\"\njs_link = \"https://cdn.jsdelivr.net/npm/@unocss/runtime\"\nother_css_link = \"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css\"\nother_js_link=\"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js\" Other JS values are used for basic tasks in page interaction: [ui]\nmain_js_link = \"/assets/js/main.js\"\nutils_js_link = \"/assets/js/utils.js\" A main.css is used for customized CSS , is loaded in partials/header.html.j2 template as (pay attention to asserts_url ): /css/main.css Values under [tpls] section are mapped values for template filename used in Doc Server request handlers to render a response, so basically filenames in templates_path value directory.","breadcrumbs":"Configurable service » Templates","id":"42","title":"Templates"},"43":{"body":"Contains values for templates render for assets files: js , css . Each web_menu_items entry set values ( text , url , roles ) for each navigation menu template used in pages.","breadcrumbs":"Configurable service » UI","id":"43","title":"UI"},"44":{"body":"An entry for each static_content like in example bellow Example: [[serve_paths]]\n# Server relative Directory Path (sitehome/appdoc)\nsrv_path = \"Server DIRECTORY_PATH\"\n# Absolute URL path for resquests\nurl_path = \"/appdoc\"\n# Not found URL to be redirect not_found = \"\"\n# URL to be redirect if is not authorization found\nnot_auth = \"/login\"\n# true or false to access control or not to this PATH\nis_restricted = true Access policies for serve_path.url_path should be in authz_policy_path file","breadcrumbs":"Configurable service » Serv Paths","id":"44","title":"Serv Paths"},"45":{"body":"This is an example of configuration file Most of settings have default values to \"/\" for paths or \"\" for text or false for boolean, if are not set properly Doc Server config loadd will dispplay ain error an will not abort running. Attributes order does not matter, in case of file path attributes relative path (the ones ending with path\") is tried and finally root_path valued as root path for values. Pay attention to cert and key paths Base layout for example below as config.toml : ── Cargo.lock\n├── Cargo.toml\n├── certs │ ├── fullchain.pem\n│ └── privkey.pem\n├── config.toml\n├── data\n│ ├── users.db\n│ └── sessions.db\n├── mdbook\n├── migrations\n│ ├── users.sql\n│ └── view.sql\n├── sitehome\n│ ├── assets\n│ ├── appdoc\n│ ├── html\n│ └── templates\n├── src\n├── paseto\n│ ├── public.ky\n│ └── secret.ky\n└── tools └── get_mail_token.sh root_path = \"sitehome\"\nname = \"docserver\"\norg = \"ORG\"\nverbose = 2\nhome_path = \"\"\nprefix = \"\"\nresources_path = \"resources\" # Certs for SSL cert_file = \"certs/fullchain.pem\"\nkey_file = \"certs/privkey.pem\" templates_path = \"templates\"\ndefaults_path = \"resources/defaults\" html_url = \"/html\"\nassets_url = \"/assets\" allow_origin = [\"http://localhost:8080\"] # HOST ip or name for Web service\nhostport = \"docs.example.com:8800\"\nbnd = \"0.0.0.0\" # PORT for Web service\nport = 8800\nprotocol = \"http\" # Availables Langs\nlangs = [\"en\",\"es\"]\ndflt_lang = \"en\" ## How to signup by 'invitation' or 'open'\nsignup_mode = \"open\"\ninvite_expire = 900 # in seconds # topt Mode: mandatory, optional, no (default) totp_mode = \"no\"\n# totp Digits: 6 (default) or 8 totp_digits = 6\n# topt Algorithm: sha1 (default), sha256, sha512\ntotp_algorithm = \"sha256\" password_score = 3\nadmin_fields = \"roles,otp_base32,status\" use_mail = false\nsmtp = \"mail.example.com\"\nsmtp_auth = \"v4.public...\"\nmail_from =\"admini@example.com\" #users_store_uri = \"file:///data/users\"\nusers_store_uri = \"sqlite:data/users.db\"\nuser_store_access = \"access\"\nauthz_model_path = \"srvc/model.conf\"\nauthz_policy_path = \"srvc/policy.csv\"\n#session_store_uri = \"file:///data/sessions\"\nsession_store_uri = \"sqlite:data/sessions.db\"\nsession_store_file = \"session\"\nsession_expire = 300 [tpls] url = \"http://docs.example.com/\" main = \"home.html.j2\" info = \"info.html.j2\" help = \"help.html.j2\" notfound = \"notfound.html.j2\" notauth = \"notauth.html.j2\" login = \"login.html.j2\" logout = \"logout.html.j2\" signup = \"signup.html.j2\" user_settings = \"user_settings.html.j2\" invite_create = \"invite_create.html.j2\" invite_output = \"invite_output.html.j2\" invite_mail_html = \"invite_mail.html.j2\" invite_maili_txt = \"invite_mail.txt.j2\" users = \"users.html.j2\" trylater = \"trylater.j2\" session = \"session.j2\" js = \"js\" css = \"\" [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" is_bin = false assert_val = \"\" expire = true\n[paseto.map_footer]\n[paseto.data] [ui]\ncss_link = \"https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css\"\njs_link = \"https://cdn.jsdelivr.net/npm/@unocss/runtime\"\nmain_js_link = \"/assets/js/main.js\"\nutils_js_link = \"/assets/js/utils.js\"\nother_css_link = \"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css\"\nother_js_link=\"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js\" [[ui.web_menu_items]]\n# ~home text part will be removed, it is to indicate it is a home link\ntext = \"~home\"\nurl = \"/\"\nroles = [] [[ui.web_menu_items]]\ntext = \"AppDoc\"\nurl = \"/appdoc\"\nroles = [\"dev\"] [[ui.web_menu_items]]\ntext = \"Users\"\nurl = \"/users\"\nroles = [\"admin\"] [[serv_paths]]\nsrc_path = \"appdoc\"\nurl_path = \"/appdoc\"\nnot_found = \"\"\nroles = \"dev\"\nredirect_to = \"/login\"\nnot_auth = \"/login\"\nis_restricted = true","breadcrumbs":"Config settings » Config settings","id":"45","title":"Config settings"},"5":{"body":"Some kind of mechanism for logs storages and trace access to know what is happening and how is it used.","breadcrumbs":"What is this ? » Logging","id":"5","title":"Logging"},"6":{"body":"Service configuration with settings via TOML file will help to customize server and services to context and needs.","breadcrumbs":"What is this ? » Configuration settings","id":"6","title":"Configuration settings"},"7":{"body":"Server severals static contents paths from one web server instance Protect access content with users authentication and authorizations Create keys and sessions to content access with asymmetric encrypted Handle and stored secure sessions and exchange it via cookies Provides users management creation, identification and admin with password and 2FA with optional mail service for notifications Some requests responses are created by a template engine , so can be customized to some use cases. Can trace access to logs storages Configurable service with settings via TOML file","breadcrumbs":"Features » Features","id":"7","title":"Features"},"8":{"body":"","breadcrumbs":"How to » How to","id":"8","title":"How to"},"9":{"body":"Set Main values: root_path , templates_path , assets_url . To enable Signup : In open mode: set signup_mode = \"open\" In invitation mode: signup_mode = \"invitation\" (if is necessary fix invite_expire seconds) To use HTTPS : Set paths for cert_file and key_file Set protocol = \"https\" To use TOPT : Set totp_mode = \"optional\" or totp_mode = \"mandatory\" To use Mail service : Set use_mail=true Set [paseto] section ( public_path and secret_path ) Run tools/get_mail_token.sh script to generate smtp_auth value with MAIL_USER and MAIL_PASSWORD Complete values: smtp_auth and mail_from Define Stores for service: For Sessions For [Users](users .md) For SQLite : Create users_store_uri = \"sqlite:PATH_TO_users.db\" set users_store_uri = \"sqlite:PATH_TO_users.db\" Create sessions_store_uri = \"sqlite:PATH_TO_sessions.db\" set sessions_store_uri = \"sqlite:PATH_TO_sessions.db\" For FILE mode: set users_store_uri = \"file:///PATH_TO_users_DIRECTORY\" set sessions_store_uri = \"file:///PATH_TO_sessions_DIRECTORY\" Access policies to enfoce for content access with Casbin : Set Policies paths : authz_model_path and authz_policy_path Set an entry for each static_content like in example bellow Be sure Access policies for each serve_path url_path are properly set in authz_policy_path file Example (url_path /appdoc): [[serve_paths]]\n# Server relative Directory Path (sitehome/appdoc)\nsrv_path = \"Server DIRECTORY_PATH\"\n# Absolute URL path for resquests\nurl_path = \"/appdoc\"\n# Not found URL to be redirect not_found = \"\"\n# URL to be redirect if is not authorization found\nnot_auth = \"/login\"\n# true or false to access control or not to this PATH\nis_restricted = true Policy content for url_path = \"/appdoc\" method GET: For Role dev: p, dev, /appdoc, GET For specific user only: p, user@test.com, /appdoc, GET Generate Pasetoken keys to generate Session data","breadcrumbs":"Quick Start » Quick Start","id":"9","title":"Quick Start"}},"length":46,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}},"2":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}},"f":{"a":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}},"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"9":{"0":{"0":{"df":2,"docs":{"35":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"d":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":1,"docs":{"42":{"tf":1.0}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"21":{"tf":1.0},"32":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":3,"docs":{"3":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"19":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"z":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"41":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"26":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"25":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.0},"39":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"32":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"38":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.7320508075688772},"23":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"x":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"s":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"35":{"tf":1.0},"45":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"r":{"df":10,"docs":{"1":{"tf":1.0},"24":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"2":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"32":{"tf":1.0},"41":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"35":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"a":{"b":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"25":{"tf":2.0},"3":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"25":{"tf":1.0},"36":{"tf":2.0},"42":{"tf":1.0},"45":{"tf":2.0}},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.4142135623730951},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"2":{"tf":1.0},"23":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"24":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":13,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":2.0},"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"24":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"\"":{",":{"\"":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"d":{"df":5,"docs":{"24":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"4":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"43":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"t":{"c":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"23":{"tf":1.0},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"24":{"tf":1.0},"35":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"32":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{":":{"/":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.4142135623730951},"17":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"35":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"16":{"tf":1.0},"32":{"tf":1.0},"40":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":2.0},"39":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"33":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"45":{"tf":1.0},"6":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":2,"docs":{"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"8":{"0":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"34":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{":":{"/":{"/":{"c":{"d":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"/":{"@":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"a":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"/":{"1":{".":{"6":{".":{"5":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"25":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":4,"docs":{"1":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":1,"docs":{"45":{"tf":1.0}}},"r":{"df":1,"docs":{"40":{"tf":1.0}}},"s":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"32":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"w":{"df":1,"docs":{"23":{"tf":1.0}},"e":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"25":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":2.8284271247461903},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"40":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"i":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"o":{"a":{"d":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":4,"docs":{"0":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"0":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":7,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"32":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"24":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.0}}}},"p":{"df":1,"docs":{"42":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":8,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"33":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}}}},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"2":{"tf":1.0},"24":{"tf":1.0},"35":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":10,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":3.0},"32":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.7320508075688772},"32":{"tf":1.0},"39":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"df":1,"docs":{"32":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":11,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"25":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":2.449489742783178},"7":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"y":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":2,"docs":{"24":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":6,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"36":{"tf":1.0},"42":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":7,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"32":{"tf":1.0},"41":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"18":{"tf":1.0},"2":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"3":{"2":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"32":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"39":{"tf":1.0},"42":{"tf":1.0},"9":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"35":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"44":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":18,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.23606797749979},"10":{"tf":1.0},"11":{"tf":1.0},"16":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"i":{"c":{"df":9,"docs":{"0":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"16":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"t":{"df":17,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.4142135623730951},"24":{"tf":2.449489742783178},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"39":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":3.7416573867739413}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"h":{"a":{"1":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"2":{"5":{"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{"2":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"32":{"tf":1.0}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"32":{"tf":1.0},"4":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":6,"docs":{"32":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0}},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"40":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"x":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951}}}}},"r":{"c":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.0}},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"25":{"tf":1.0},"32":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":9,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"4":{"tf":1.0},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"33":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"24":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"45":{"tf":2.23606797749979}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"34":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"2":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"36":{"tf":2.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"36":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"29":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"35":{"tf":1.0},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"3":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"s":{"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"16":{"tf":2.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"43":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"@":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":17,"docs":{"0":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"9":{"tf":1.0}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"]":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"v":{"4":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"df":11,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.23606797749979},"42":{"tf":2.449489742783178},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"a":{"df":7,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.4142135623730951}}}}}}}}},"z":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"v":{"b":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"breadcrumbs":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}},"2":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}},"f":{"a":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}},"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"9":{"0":{"0":{"df":2,"docs":{"35":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"14":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"20":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"d":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":1,"docs":{"42":{"tf":1.0}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"21":{"tf":1.7320508075688772},"32":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":3,"docs":{"3":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"19":{"tf":1.0},"32":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"19":{"tf":1.4142135623730951},"44":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"z":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"41":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"26":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"25":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.0},"39":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"32":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"38":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.7320508075688772},"23":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"x":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"s":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":2.0},"35":{"tf":1.0},"45":{"tf":2.0}},"u":{"df":0,"docs":{},"r":{"df":19,"docs":{"1":{"tf":1.0},"24":{"tf":1.7320508075688772},"31":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"32":{"tf":1.0},"41":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"35":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"a":{"b":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"25":{"tf":2.0},"3":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"25":{"tf":1.0},"36":{"tf":2.0},"42":{"tf":1.0},"45":{"tf":2.0}},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.4142135623730951},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"2":{"tf":1.0},"23":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"24":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":13,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":2.0},"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"24":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"\"":{",":{"\"":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"d":{"df":5,"docs":{"24":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"4":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"43":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"t":{"c":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"23":{"tf":1.0},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"24":{"tf":1.0},"35":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"32":{"tf":1.0},"38":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{":":{"/":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"24":{"tf":1.0},"27":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"35":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"16":{"tf":1.0},"32":{"tf":1.0},"40":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"39":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"33":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"45":{"tf":1.0},"6":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":2,"docs":{"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"8":{"0":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"34":{"tf":2.449489742783178},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{":":{"/":{"/":{"c":{"d":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"/":{"@":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"a":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"/":{"1":{".":{"6":{".":{"5":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"25":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":4,"docs":{"1":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":1,"docs":{"45":{"tf":1.0}}},"r":{"df":1,"docs":{"40":{"tf":1.0}}},"s":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"32":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"w":{"df":1,"docs":{"23":{"tf":1.0}},"e":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"25":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":3.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"40":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"i":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"o":{"a":{"d":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":4,"docs":{"0":{"tf":1.0},"30":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"0":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":7,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"32":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"24":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.0}}}},"p":{"df":1,"docs":{"42":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":8,"docs":{"0":{"tf":1.0},"11":{"tf":1.7320508075688772},"2":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"33":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}}}},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"2":{"tf":1.0},"24":{"tf":1.0},"35":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":10,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":3.0},"32":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"0":{"tf":1.0},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"df":1,"docs":{"32":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.7320508075688772},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":11,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"25":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":2.449489742783178},"7":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"y":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":2,"docs":{"24":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":6,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.7320508075688772},"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"36":{"tf":1.0},"42":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":7,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"32":{"tf":1.0},"41":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"18":{"tf":1.7320508075688772},"2":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"3":{"2":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"32":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"39":{"tf":1.0},"42":{"tf":1.0},"9":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"35":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":18,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"i":{"c":{"df":20,"docs":{"0":{"tf":1.0},"31":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.7320508075688772},"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"16":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.8284271247461903},"3":{"tf":1.7320508075688772},"30":{"tf":1.7320508075688772},"32":{"tf":1.0},"35":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"t":{"df":17,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.4142135623730951},"24":{"tf":2.449489742783178},"28":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"39":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.23606797749979},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"9":{"tf":3.7416573867739413}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"h":{"a":{"1":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"2":{"5":{"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{"2":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"32":{"tf":1.0}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"32":{"tf":1.0},"4":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":6,"docs":{"32":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0}},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"l":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":2.0},"25":{"tf":2.0},"26":{"tf":1.0},"40":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"x":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951}}}}},"r":{"c":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.0}},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"25":{"tf":1.0},"32":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":10,"docs":{"0":{"tf":1.0},"16":{"tf":2.0},"17":{"tf":1.7320508075688772},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":1.7320508075688772},"3":{"tf":1.0},"40":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"4":{"tf":1.0},"42":{"tf":3.1622776601683795},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"33":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"24":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"45":{"tf":2.23606797749979}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"34":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"2":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"36":{"tf":2.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"36":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"36":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"29":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"35":{"tf":1.0},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"0":{"tf":1.0},"13":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"3":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"s":{"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"16":{"tf":2.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"43":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"@":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":17,"docs":{"0":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"21":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":2.23606797749979},"38":{"tf":2.0},"4":{"tf":1.7320508075688772},"40":{"tf":1.0},"45":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"9":{"tf":1.0}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"]":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"v":{"4":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"df":11,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.23606797749979},"42":{"tf":2.449489742783178},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"a":{"df":7,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"32":{"tf":1.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.4142135623730951}}}}}}}}},"z":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"v":{"b":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"title":{"root":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"38":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"6":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"2":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"17":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"24":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"30":{"tf":1.0},"5":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"44":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"31":{"tf":1.0},"39":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0}}}}}}},"t":{"df":3,"docs":{"28":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"43":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"AND","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/resources/sitehome_model/docserver/searchindex.json b/resources/sitehome_model/docserver/searchindex.json new file mode 100644 index 0000000..f7d3fda --- /dev/null +++ b/resources/sitehome_model/docserver/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["introduction.html","index.html#one-server","index.html#protect-access-content","index.html#secure-sessions","index.html#users","index.html#logging","index.html#configuration-settings","features.html#features","howto.html#how-to","quick-start.html#quick-start","one_server.html#one-web-server-instance","server_modes.html#server-modes","static_content.html#static-contents","url_path.html#url_path-prefix","protect_access.html#protect-access","users.html#users","users_sql.html#sql-storage","users_file_storage.html#file-storage","roles.html#roles","auths.html#users-authentication-and-authorizations","policies.html#access-policies","adminusers.html#users-admin","sessions.html#session-data","pasetoken.html#pasetoken","pasetoken.html#generate-keys","sessions_sql.html#sql-storage","sessions_sql.html#setup","sessions_file_storage.html#file-storage","cookie.html#cookie-set","trace.html#traced","logs.html#sessions-logs","configuration.html#configurable-service","configuration.html#config-file","configuration.html#main","configuration.html#https","configuration.html#signup","configuration.html#totp","configuration.html#password-score","configuration.html#admin-user-fields","configuration.html#mail-service","configuration.html#stores","configuration.html#policies","configuration.html#templates","configuration.html#ui","configuration.html#serv-paths","settings.html#config-settings"],"index":{"documentStore":{"docInfo":{"0":{"body":173,"breadcrumbs":1,"title":1},"1":{"body":69,"breadcrumbs":2,"title":2},"10":{"body":0,"breadcrumbs":8,"title":4},"11":{"body":0,"breadcrumbs":4,"title":2},"12":{"body":0,"breadcrumbs":4,"title":2},"13":{"body":0,"breadcrumbs":4,"title":2},"14":{"body":0,"breadcrumbs":4,"title":2},"15":{"body":0,"breadcrumbs":2,"title":1},"16":{"body":35,"breadcrumbs":4,"title":2},"17":{"body":0,"breadcrumbs":4,"title":2},"18":{"body":0,"breadcrumbs":2,"title":1},"19":{"body":0,"breadcrumbs":5,"title":3},"2":{"body":45,"breadcrumbs":3,"title":3},"20":{"body":0,"breadcrumbs":4,"title":2},"21":{"body":0,"breadcrumbs":4,"title":2},"22":{"body":0,"breadcrumbs":4,"title":2},"23":{"body":77,"breadcrumbs":2,"title":1},"24":{"body":104,"breadcrumbs":3,"title":2},"25":{"body":96,"breadcrumbs":4,"title":2},"26":{"body":1,"breadcrumbs":3,"title":1},"27":{"body":0,"breadcrumbs":4,"title":2},"28":{"body":0,"breadcrumbs":4,"title":2},"29":{"body":0,"breadcrumbs":2,"title":1},"3":{"body":24,"breadcrumbs":2,"title":2},"30":{"body":0,"breadcrumbs":4,"title":2},"31":{"body":8,"breadcrumbs":4,"title":2},"32":{"body":86,"breadcrumbs":4,"title":2},"33":{"body":55,"breadcrumbs":3,"title":1},"34":{"body":17,"breadcrumbs":3,"title":1},"35":{"body":49,"breadcrumbs":3,"title":1},"36":{"body":50,"breadcrumbs":3,"title":1},"37":{"body":13,"breadcrumbs":4,"title":2},"38":{"body":12,"breadcrumbs":5,"title":3},"39":{"body":49,"breadcrumbs":4,"title":2},"4":{"body":34,"breadcrumbs":1,"title":1},"40":{"body":68,"breadcrumbs":3,"title":1},"41":{"body":14,"breadcrumbs":3,"title":1},"42":{"body":134,"breadcrumbs":3,"title":1},"43":{"body":22,"breadcrumbs":3,"title":1},"44":{"body":43,"breadcrumbs":4,"title":2},"45":{"body":284,"breadcrumbs":4,"title":2},"5":{"body":9,"breadcrumbs":1,"title":1},"6":{"body":12,"breadcrumbs":2,"title":2},"7":{"body":59,"breadcrumbs":2,"title":1},"8":{"body":0,"breadcrumbs":0,"title":0},"9":{"body":169,"breadcrumbs":4,"title":2}},"docs":{"0":{"body":"Doc Server is a Web Server in Rust for static content with Control access via authorizations , fully customizable with settings . DocServer is created to: Serve several static contents paths from one web server instance at once. Server is based in Rust Axum crate under Tokio , with a lot of config settings to customize in a config TOML file: SSL, Paths, Menus, Keys, Contents, Roles, etc. Use static contents from mdbooks with fixed absolute links via site-url or code docs from Cargo doc . Protect access to static contents with users authentication and authorizations by url_path prefix , roles or users login names or emails. Define access policies to enfoce for content access with Casbin Handle user defininition: Create/Invite, SignIn/SignOut, Settings, Roles, Administration. Several users modes can be set via config settings . For user authentication use Argon2 for password and TOPT as 2FA with optional mail service for notifications Sessions are stored in async sqlx to Sqlite or File storages and keys handled via cookie set , for larger use sqlx as Database Agnostic provides other SQL options Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes. Some requests responses are created by a template engine , so can be customized to some use cases. Optionally request can be traced in sessions logs Main purpose Control access to static contents paths from one web server instance Tested with mdbooks with fixed absolute links via site-url or code docs","breadcrumbs":"Introduction","id":"0","title":"Introduction"},"1":{"body":"Doc Server is a Web Server in Rust for static content with Control access via authorizations , fully customizable with settings . Most of documentation or static content is generated to be served from a WebServer using absoulte , relative URL or a document base URL , this is a big issue to handle several at once from one unique server under url paths if are not set properly. In many cases there is no need for a dedicated web server for each documentation or static content that needs to be published or served. Some documentation generators are more or less configurables to use some URL relative path , this should include pages and assets (images, css, js, etc.).","breadcrumbs":"What is this ? » One Server","id":"1","title":"One Server"},"10":{"body":"","breadcrumbs":"One web server instance » One web server instance","id":"10","title":"One web server instance"},"11":{"body":"","breadcrumbs":"Server modes » Server modes","id":"11","title":"Server modes"},"12":{"body":"","breadcrumbs":"Static contents » Static contents","id":"12","title":"Static contents"},"13":{"body":"","breadcrumbs":"url_path prefix » url_path prefix","id":"13","title":"url_path prefix"},"14":{"body":"","breadcrumbs":"Protect access » Protect access","id":"14","title":"Protect access"},"15":{"body":"","breadcrumbs":"Users » Users","id":"15","title":"Users"},"16":{"body":"Doc Server users use Rust crate SQLx As Dataabse Agnostic can it easily support the following databases: PostgreSQL MySQL SQLite MSSQL sqlx::any is used so: Doc Server for users use a Generic database driver with the specific driver selected at runtime. SQLx is also used for sessions SQL storage .","breadcrumbs":"SQL storage » SQL storage","id":"16","title":"SQL storage"},"17":{"body":"","breadcrumbs":"File storage » File storage","id":"17","title":"File storage"},"18":{"body":"","breadcrumbs":"Roles » Roles","id":"18","title":"Roles"},"19":{"body":"","breadcrumbs":"Users auths » Users authentication and authorizations","id":"19","title":"Users authentication and authorizations"},"2":{"body":"In many case some protect access content mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal use or new versions not delivered yet. Basic authentication or via one token could be too simple and flat to tailor specific contexts, so a full real sessions handling should implement users (identity entities), roles (groups), policies (permissions) and secure tokens (as data container).","breadcrumbs":"What is this ? » Protect access content","id":"2","title":"Protect access content"},"20":{"body":"","breadcrumbs":"Access policies » Access policies","id":"20","title":"Access policies"},"21":{"body":"","breadcrumbs":"Users Admin » Users Admin","id":"21","title":"Users Admin"},"22":{"body":"","breadcrumbs":"Session data » Session data","id":"22","title":"Session data"},"23":{"body":"Doc Server use PASETO: Platform-Agnostic Security Tokens as a way to generate Session data before to store it for persistance as a simple key value . It requires extra computation efforts but it is more secure and efficient, user data are only load in login or singup tasks, all the necessary informations for access control should be in session-data . Paseto is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards. Doc Server Session data is saved as a Pasetoken with asymmetric encripted data without passwords or TOPT codes. To handle tokens a self library pasetoken-lib was developed for basic tasks like generate, parse, get claims, etc.","breadcrumbs":"Pasetoken » Pasetoken","id":"23","title":"Pasetoken"},"24":{"body":"Doc Server executable can generate public and secret keys: [ ! -d \"paseto\" ] && mkdir -p paseto docserver -p paseto This command will generate: paseto/publick.ky and paseto/secret.ky , if not test for directory to exist keys will be overwritten. Genereated key files can be used in configuration paseto settings [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" Paseto keys Changes Change paseto keys will affect existing valid session tokens and others settings like smtp_auth value for Mail configuration There is no problem if current valid sessions are dismissed or not need and smtp_auth value in configuration is set by using new keys. Paseto Settings As Doc Server Session data are not sent to clients, only keys are handled via cookie set , there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling. [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" is_bin = false assert_val = \"\" expire = true\n[paseto.map_footer]\n[paseto.data]","breadcrumbs":"Pasetoken » Generate keys","id":"24","title":"Generate keys"},"25":{"body":"Doc Server Sesssions use Rust crate async_session for storage or data persistence, so bassically there are several stores to use. To keep it small and simple async-sqlx-session is implemented by default with SQLite but as it is based on SQLx is is Database Agnostic and it easily support any other choice: PostgreSQL , MySQL , SQLite , and MSSQL . SQLx is also used for users SQL storage . Sessions store criteria Control access to static contents paths requires Session data stored in database, cookies contains basically a Session ID with no extra content, all other ( user or session ) data require database access. If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients. Separate databases for Session and Users Sessions and Users can use same database store by simply using same uri config values :","breadcrumbs":"SQL storage » SQL storage","id":"25","title":"SQL storage"},"26":{"body":"Axum","breadcrumbs":"SQL storage » Setup","id":"26","title":"Setup"},"27":{"body":"","breadcrumbs":"File storage » File storage","id":"27","title":"File storage"},"28":{"body":"","breadcrumbs":"Cookie set » Cookie set","id":"28","title":"Cookie set"},"29":{"body":"","breadcrumbs":"Traced » Traced","id":"29","title":"Traced"},"3":{"body":"Sessions management to content access with secure storage (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow webserver to allow or deny an URL access request in a middleware stage.","breadcrumbs":"What is this ? » Secure sessions","id":"3","title":"Secure sessions"},"30":{"body":"","breadcrumbs":"Sessions logs » Sessions logs","id":"30","title":"Sessions logs"},"31":{"body":"Doc Server can be adjusted to differents modes with Settings in Config file .","breadcrumbs":"Configurable service » Configurable service","id":"31","title":"Configurable service"},"32":{"body":"Config file path with Settings is passed as argument to Doc Server executable as: docserver --config It should be a TOML file-path with Configuration settings to run WebServer , it is REQUIRED to run Doc Server It is composed by the following parts: Paths, URLs, Web Server main settings (port, host, protocol, SSL certificates, etc) Signup and Signin settings: password , TOTP , admin fields , etc. Mail settings if enabled Stores locations for Users, Auths and Sessions Templates : tpls to render requests responses Pasetoken : paseto for token configurations UI where major user interface are defined: Assets links for JS and CSS web_menu_items as items to show in top menu navigator serv_paths where static content path are defined as is_restricted and with allowed roles","breadcrumbs":"Configurable service » Config file","id":"32","title":"Config file"},"33":{"body":"On top of Configuration file : root_path = \"sitehome\", the most important as root path, other settings attibutes ending with _path can have relative path to this one or their own absolute or relative paths. name = \"docserver\" is a name for service org = \"ORG\" an organization name verbose = 2 some debug info in requests handling is shown with values over 0 templates_path = \"templates\", templates path assets_url = \"/assets\" assets path for templates allow_origin = [\"http://localhost:8080\"] allow origins for access control allow origin webserver directive","breadcrumbs":"Configurable service » Main","id":"33","title":"Main"},"34":{"body":"TLS certificates path can be provided in: cert_file = \"cert/fullchain.pem\"\nkey_file = \"cert/privkey.pem\" To use HTTPS traffic set protocol to https rather than http protocol = \"https\"","breadcrumbs":"Configurable service » HTTPS","id":"34","title":"HTTPS"},"35":{"body":"It is about how new users will be created, there are two option: Open by using a signup form with all details. invitation by adminitrators , new user would receive an invitation link (it would include some details like email, roles,etc) connected to a session token with expiration time in seconds, this link can be sent by email if is set in config. By using an invitation link new user can fill a signup form with all details. ## How to signup by 'invitation' or 'open'\nsignup_mode = \"invitation\"\ninvite_expire = 900 # in seconds","breadcrumbs":"Configurable service » Signup","id":"35","title":"Signup"},"36":{"body":"TOPT as 2FA by default is set to no but it can also be: optional to users settings, so they can activate or deactivate in signup and user settings edition. mandatory means users have to configure in signup process. TOPT can only be reset by user settings or administrators via user edition form # topt Mode: mandatory, optional, no (default) totp_mode = \"optional\"\n# totp Digits: 6 (default) or 8 totp_digits = 6\n# topt Algorithm: sha1 (default), sha256, sha512\ntotp_algorithm = \"sha256\"","breadcrumbs":"Configurable service » TOTP","id":"36","title":"TOTP"},"37":{"body":"Doc Server use Rust crate zxcvbn for password strength estimator, it can be enforced to a value: password_score = 3","breadcrumbs":"Configurable service » Password score","id":"37","title":"Password score"},"38":{"body":"admin_fields is a list of user fields or attributes to change only by administrators , user can only see their values. admin_fields = \"roles,otp_base32,status\"","breadcrumbs":"Configurable service » Admin user fields","id":"38","title":"Admin user fields"},"39":{"body":"It can be set as true or false , smtp_auth is token encrypted that can be generated by script tools/get_mail_token.sh that runs Doc Server program using credentials from paseto section ( public_path and secret_path ), it can be included not encrypted but is highly not recomended. tools/get_mail_token.sh [mail_user] [mail_password] Provides a token based in srcv pasetoken settings As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run tools/get_mail_token.sh use_mail = true\nsmtp = \"mail.example.com\"\nsmtp_auth = \"v4.public...\"\nmail_from =\"admini@example.com\"","breadcrumbs":"Configurable service » Mail service","id":"39","title":"Mail service"},"4":{"body":"At least a simple users management creation, identification and admin to link sessions to an identified entity. Signin access should use secure passwords and 2FA with optional mail service for notifications. Signup modes should be also provided for close or open contexts. Some requests responses are created by a template engine , so can be customized to some use cases.","breadcrumbs":"What is this ? » Users","id":"4","title":"Users"},"40":{"body":"Users and Sessions are stored in async sqlx to Sqlite or File storages, for larger use sqlx as Database Agnostic provides other SQL options Prefix sqlite:: is for SQLite storage, usually a file ends with .db suffix. users_store_uri = \"sqlite:PATH_TO_users.db\"\nsession_store_uri = \"sqlite:PATH_TO_sessions.db\"\nsession_expire = 300 Prefix file:/// if for FILE storage, value should be a directory. session_store_file value will be final file prefix follow by timestamp autogenerated value. users_store_uri = \"file:///PATH_TO_users_DIRECTORY\"\nsession_store_uri = \"file:///PATH_TO_sessions_DIRECTORY\"\nsession_store_file = \"session\"\nsession_expire = 300 session_expire is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.","breadcrumbs":"Configurable service » Stores","id":"40","title":"Stores"},"41":{"body":"Access policies to be enfoced for content access with Casbin require two file path: authz_model_path = \"PATH_TO_model.conf\"\nauthz_policy_path = \"PATH_TO_policy.csv\"","breadcrumbs":"Configurable service » Policies","id":"41","title":"Policies"},"42":{"body":"Tera template engine is used to to render response requests. Most of templates are HTML and in many cases use to include others from partials directory. Pre-render process is in charge of values setting. Templates suffixes indicate if is html or txt and ends with j2 as standard extension for jinja2 templating engine. Default templates_path = \"templates\" directory layout: ├── home.html.j2\n├── invite_create.html.j2\n├── invite_mail.html.j2\n├── invite_mail.txt.j2\n├── invite_output.html.j2\n├── login.html.j2\n├── logout.html.j2\n├── pages\n│ └── terms-conditions.html.j2\n├── partials\n│ ├── footer.html.j2\n│ ├── form-password.html.j2\n│ ├── form-totp.html.j2\n│ ├── form-user.html.j2\n│ ├── header.html.j2\n│ ├── loading.html.j2\n│ ├── mini_navbar.html.j2\n│ ├── modal_edit_user.html.j2\n│ ├── _navbar.html.j2\n│ ├── navbar.html.j2\n│ └── symbols.html.j2\n├── signup.html.j2\n├── user_settings.html.j2\n└── users.html.j2 Current templates use UnoCSS as CSS engine (compatible with Tailwindcss ) and FLowbyte as CSS and JS component library, so they are added from UI configuration values [ui]\ncss_link = \"https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css\"\njs_link = \"https://cdn.jsdelivr.net/npm/@unocss/runtime\"\nother_css_link = \"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css\"\nother_js_link=\"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js\" Other JS values are used for basic tasks in page interaction: [ui]\nmain_js_link = \"/assets/js/main.js\"\nutils_js_link = \"/assets/js/utils.js\" A main.css is used for customized CSS , is loaded in partials/header.html.j2 template as (pay attention to asserts_url ): /css/main.css Values under [tpls] section are mapped values for template filename used in Doc Server request handlers to render a response, so basically filenames in templates_path value directory.","breadcrumbs":"Configurable service » Templates","id":"42","title":"Templates"},"43":{"body":"Contains values for templates render for assets files: js , css . Each web_menu_items entry set values ( text , url , roles ) for each navigation menu template used in pages.","breadcrumbs":"Configurable service » UI","id":"43","title":"UI"},"44":{"body":"An entry for each static_content like in example bellow Example: [[serve_paths]]\n# Server relative Directory Path (sitehome/appdoc)\nsrv_path = \"Server DIRECTORY_PATH\"\n# Absolute URL path for resquests\nurl_path = \"/appdoc\"\n# Not found URL to be redirect not_found = \"\"\n# URL to be redirect if is not authorization found\nnot_auth = \"/login\"\n# true or false to access control or not to this PATH\nis_restricted = true Access policies for serve_path.url_path should be in authz_policy_path file","breadcrumbs":"Configurable service » Serv Paths","id":"44","title":"Serv Paths"},"45":{"body":"This is an example of configuration file Most of settings have default values to \"/\" for paths or \"\" for text or false for boolean, if are not set properly Doc Server config loadd will dispplay ain error an will not abort running. Attributes order does not matter, in case of file path attributes relative path (the ones ending with path\") is tried and finally root_path valued as root path for values. Pay attention to cert and key paths Base layout for example below as config.toml : ── Cargo.lock\n├── Cargo.toml\n├── certs │ ├── fullchain.pem\n│ └── privkey.pem\n├── config.toml\n├── data\n│ ├── users.db\n│ └── sessions.db\n├── mdbook\n├── migrations\n│ ├── users.sql\n│ └── view.sql\n├── sitehome\n│ ├── assets\n│ ├── appdoc\n│ ├── html\n│ └── templates\n├── src\n├── paseto\n│ ├── public.ky\n│ └── secret.ky\n└── tools └── get_mail_token.sh root_path = \"sitehome\"\nname = \"docserver\"\norg = \"ORG\"\nverbose = 2\nhome_path = \"\"\nprefix = \"\"\nresources_path = \"resources\" # Certs for SSL cert_file = \"certs/fullchain.pem\"\nkey_file = \"certs/privkey.pem\" templates_path = \"templates\"\ndefaults_path = \"resources/defaults\" html_url = \"/html\"\nassets_url = \"/assets\" allow_origin = [\"http://localhost:8080\"] # HOST ip or name for Web service\nhostport = \"docs.example.com:8800\"\nbnd = \"0.0.0.0\" # PORT for Web service\nport = 8800\nprotocol = \"http\" # Availables Langs\nlangs = [\"en\",\"es\"]\ndflt_lang = \"en\" ## How to signup by 'invitation' or 'open'\nsignup_mode = \"open\"\ninvite_expire = 900 # in seconds # topt Mode: mandatory, optional, no (default) totp_mode = \"no\"\n# totp Digits: 6 (default) or 8 totp_digits = 6\n# topt Algorithm: sha1 (default), sha256, sha512\ntotp_algorithm = \"sha256\" password_score = 3\nadmin_fields = \"roles,otp_base32,status\" use_mail = false\nsmtp = \"mail.example.com\"\nsmtp_auth = \"v4.public...\"\nmail_from =\"admini@example.com\" #users_store_uri = \"file:///data/users\"\nusers_store_uri = \"sqlite:data/users.db\"\nuser_store_access = \"access\"\nauthz_model_path = \"srvc/model.conf\"\nauthz_policy_path = \"srvc/policy.csv\"\n#session_store_uri = \"file:///data/sessions\"\nsession_store_uri = \"sqlite:data/sessions.db\"\nsession_store_file = \"session\"\nsession_expire = 300 [tpls] url = \"http://docs.example.com/\" main = \"home.html.j2\" info = \"info.html.j2\" help = \"help.html.j2\" notfound = \"notfound.html.j2\" notauth = \"notauth.html.j2\" login = \"login.html.j2\" logout = \"logout.html.j2\" signup = \"signup.html.j2\" user_settings = \"user_settings.html.j2\" invite_create = \"invite_create.html.j2\" invite_output = \"invite_output.html.j2\" invite_mail_html = \"invite_mail.html.j2\" invite_maili_txt = \"invite_mail.txt.j2\" users = \"users.html.j2\" trylater = \"trylater.j2\" session = \"session.j2\" js = \"js\" css = \"\" [paseto] public_path = \"paseto/public.ky\" secret_path = \"paseto/secret.ky\" is_bin = false assert_val = \"\" expire = true\n[paseto.map_footer]\n[paseto.data] [ui]\ncss_link = \"https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css\"\njs_link = \"https://cdn.jsdelivr.net/npm/@unocss/runtime\"\nmain_js_link = \"/assets/js/main.js\"\nutils_js_link = \"/assets/js/utils.js\"\nother_css_link = \"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css\"\nother_js_link=\"https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js\" [[ui.web_menu_items]]\n# ~home text part will be removed, it is to indicate it is a home link\ntext = \"~home\"\nurl = \"/\"\nroles = [] [[ui.web_menu_items]]\ntext = \"AppDoc\"\nurl = \"/appdoc\"\nroles = [\"dev\"] [[ui.web_menu_items]]\ntext = \"Users\"\nurl = \"/users\"\nroles = [\"admin\"] [[serv_paths]]\nsrc_path = \"appdoc\"\nurl_path = \"/appdoc\"\nnot_found = \"\"\nroles = \"dev\"\nredirect_to = \"/login\"\nnot_auth = \"/login\"\nis_restricted = true","breadcrumbs":"Config settings » Config settings","id":"45","title":"Config settings"},"5":{"body":"Some kind of mechanism for logs storages and trace access to know what is happening and how is it used.","breadcrumbs":"What is this ? » Logging","id":"5","title":"Logging"},"6":{"body":"Service configuration with settings via TOML file will help to customize server and services to context and needs.","breadcrumbs":"What is this ? » Configuration settings","id":"6","title":"Configuration settings"},"7":{"body":"Server severals static contents paths from one web server instance Protect access content with users authentication and authorizations Create keys and sessions to content access with asymmetric encrypted Handle and stored secure sessions and exchange it via cookies Provides users management creation, identification and admin with password and 2FA with optional mail service for notifications Some requests responses are created by a template engine , so can be customized to some use cases. Can trace access to logs storages Configurable service with settings via TOML file","breadcrumbs":"Features » Features","id":"7","title":"Features"},"8":{"body":"","breadcrumbs":"How to » How to","id":"8","title":"How to"},"9":{"body":"Set Main values: root_path , templates_path , assets_url . To enable Signup : In open mode: set signup_mode = \"open\" In invitation mode: signup_mode = \"invitation\" (if is necessary fix invite_expire seconds) To use HTTPS : Set paths for cert_file and key_file Set protocol = \"https\" To use TOPT : Set totp_mode = \"optional\" or totp_mode = \"mandatory\" To use Mail service : Set use_mail=true Set [paseto] section ( public_path and secret_path ) Run tools/get_mail_token.sh script to generate smtp_auth value with MAIL_USER and MAIL_PASSWORD Complete values: smtp_auth and mail_from Define Stores for service: For Sessions For [Users](users .md) For SQLite : Create users_store_uri = \"sqlite:PATH_TO_users.db\" set users_store_uri = \"sqlite:PATH_TO_users.db\" Create sessions_store_uri = \"sqlite:PATH_TO_sessions.db\" set sessions_store_uri = \"sqlite:PATH_TO_sessions.db\" For FILE mode: set users_store_uri = \"file:///PATH_TO_users_DIRECTORY\" set sessions_store_uri = \"file:///PATH_TO_sessions_DIRECTORY\" Access policies to enfoce for content access with Casbin : Set Policies paths : authz_model_path and authz_policy_path Set an entry for each static_content like in example bellow Be sure Access policies for each serve_path url_path are properly set in authz_policy_path file Example (url_path /appdoc): [[serve_paths]]\n# Server relative Directory Path (sitehome/appdoc)\nsrv_path = \"Server DIRECTORY_PATH\"\n# Absolute URL path for resquests\nurl_path = \"/appdoc\"\n# Not found URL to be redirect not_found = \"\"\n# URL to be redirect if is not authorization found\nnot_auth = \"/login\"\n# true or false to access control or not to this PATH\nis_restricted = true Policy content for url_path = \"/appdoc\" method GET: For Role dev: p, dev, /appdoc, GET For specific user only: p, user@test.com, /appdoc, GET Generate Pasetoken keys to generate Session data","breadcrumbs":"Quick Start » Quick Start","id":"9","title":"Quick Start"}},"length":46,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}},"2":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}},"f":{"a":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}},"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"9":{"0":{"0":{"df":2,"docs":{"35":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"d":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":1,"docs":{"42":{"tf":1.0}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"21":{"tf":1.0},"32":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":3,"docs":{"3":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"19":{"tf":1.0},"44":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"z":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"41":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"26":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"25":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.0},"39":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"32":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"38":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.7320508075688772},"23":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"x":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"s":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"35":{"tf":1.0},"45":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"r":{"df":10,"docs":{"1":{"tf":1.0},"24":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"33":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"2":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"32":{"tf":1.0},"41":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"35":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"a":{"b":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"25":{"tf":2.0},"3":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"25":{"tf":1.0},"36":{"tf":2.0},"42":{"tf":1.0},"45":{"tf":2.0}},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.4142135623730951},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"2":{"tf":1.0},"23":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"24":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":13,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":2.0},"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"24":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"\"":{",":{"\"":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"d":{"df":5,"docs":{"24":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"4":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"43":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"t":{"c":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"23":{"tf":1.0},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"24":{"tf":1.0},"35":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"32":{"tf":1.0},"38":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{":":{"/":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.4142135623730951},"17":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"35":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"16":{"tf":1.0},"32":{"tf":1.0},"40":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":2.0},"39":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"33":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"45":{"tf":1.0},"6":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":2,"docs":{"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"8":{"0":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"34":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{":":{"/":{"/":{"c":{"d":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"/":{"@":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"a":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"/":{"1":{".":{"6":{".":{"5":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"25":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":4,"docs":{"1":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":1,"docs":{"45":{"tf":1.0}}},"r":{"df":1,"docs":{"40":{"tf":1.0}}},"s":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"32":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"w":{"df":1,"docs":{"23":{"tf":1.0}},"e":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"25":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":2.8284271247461903},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"40":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"i":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"o":{"a":{"d":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":4,"docs":{"0":{"tf":1.0},"30":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"0":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":7,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"32":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"24":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.0}}}},"p":{"df":1,"docs":{"42":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":8,"docs":{"0":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"33":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}}}},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"2":{"tf":1.0},"24":{"tf":1.0},"35":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":10,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":3.0},"32":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.7320508075688772},"32":{"tf":1.0},"39":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"df":1,"docs":{"32":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":11,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"25":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":2.449489742783178},"7":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"y":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":2,"docs":{"24":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":6,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"36":{"tf":1.0},"42":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":7,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"32":{"tf":1.0},"41":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"18":{"tf":1.0},"2":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"3":{"2":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"32":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"39":{"tf":1.0},"42":{"tf":1.0},"9":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"3":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"35":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"44":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":18,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.23606797749979},"10":{"tf":1.0},"11":{"tf":1.0},"16":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"i":{"c":{"df":9,"docs":{"0":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"16":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.8284271247461903},"3":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"35":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"t":{"df":17,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.4142135623730951},"24":{"tf":2.449489742783178},"28":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"39":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":3.7416573867739413}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"h":{"a":{"1":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"2":{"5":{"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{"2":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"32":{"tf":1.0}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"32":{"tf":1.0},"4":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":6,"docs":{"32":{"tf":1.0},"35":{"tf":2.0},"36":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0}},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"40":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"x":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951}}}}},"r":{"c":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.0}},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"25":{"tf":1.0},"32":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":9,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"25":{"tf":1.7320508075688772},"27":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"4":{"tf":1.0},"42":{"tf":3.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"33":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"24":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"45":{"tf":2.23606797749979}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"34":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"2":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"36":{"tf":2.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"36":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"29":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"35":{"tf":1.0},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"3":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"s":{"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"16":{"tf":2.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"43":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"@":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":17,"docs":{"0":{"tf":2.23606797749979},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"2":{"tf":1.0},"21":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":2.23606797749979},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"9":{"tf":1.0}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"]":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"v":{"4":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"df":11,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.23606797749979},"42":{"tf":2.449489742783178},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"a":{"df":7,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"10":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.4142135623730951}}}}}}}}},"z":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"v":{"b":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"breadcrumbs":{"root":{"0":{".":{"0":{".":{"0":{".":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"33":{"tf":1.0}}},"2":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}},"f":{"a":{"df":4,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"3":{"0":{"0":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}},"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"9":{"0":{"0":{"df":2,"docs":{"35":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":16,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"14":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"20":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":2.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"d":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":1,"docs":{"42":{"tf":1.0}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"38":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"21":{"tf":1.7320508075688772},"32":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"35":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":3,"docs":{"3":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951}}}}}},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":2.23606797749979},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"2":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"t":{"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"j":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":3,"docs":{"0":{"tf":1.0},"25":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"19":{"tf":1.0},"32":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"2":{"tf":1.0},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":6,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"19":{"tf":1.4142135623730951},"44":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"z":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"41":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"26":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"25":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"23":{"tf":1.0},"39":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":1,"docs":{"0":{"tf":1.0}}}}},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"32":{"tf":1.0},"34":{"tf":1.0}}}},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"38":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"24":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.7320508075688772},"23":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}},"x":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"42":{"tf":1.0}}},"s":{"df":1,"docs":{"32":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"32":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":2.0},"35":{"tf":1.0},"45":{"tf":2.0}},"u":{"df":0,"docs":{},"r":{"df":19,"docs":{"1":{"tf":1.0},"24":{"tf":1.7320508075688772},"31":{"tf":1.7320508075688772},"32":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"3":{"tf":1.0},"32":{"tf":1.0},"41":{"tf":1.0},"7":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"35":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0},"45":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"4":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"a":{"b":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"b":{"a":{"df":0,"docs":{},"s":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":9,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"25":{"tf":2.0},"3":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"36":{"tf":1.0}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"33":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":4,"docs":{"25":{"tf":1.0},"36":{"tf":2.0},"42":{"tf":1.0},"45":{"tf":2.0}},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.4142135623730951},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"2":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"35":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"2":{"tf":1.0},"23":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"24":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":13,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{":":{"8":{"8":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":5,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":2.0},"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":5,"docs":{"1":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"23":{"tf":1.0},"24":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"35":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"n":{"\"":{",":{"\"":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"32":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}}},"d":{"df":5,"docs":{"24":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"0":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"4":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"43":{"tf":1.0},"44":{"tf":1.0},"9":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"t":{"c":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"23":{"tf":1.0},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"32":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"24":{"tf":1.0},"35":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"32":{"tf":1.0},"38":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{":":{"/":{"/":{"/":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":15,"docs":{"0":{"tf":1.4142135623730951},"17":{"tf":1.7320508075688772},"24":{"tf":1.0},"27":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.4142135623730951}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"35":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"x":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"16":{"tf":1.0},"32":{"tf":1.0},"40":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"35":{"tf":1.4142135623730951},"36":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"1":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"39":{"tf":1.0},"9":{"tf":1.7320508075688772}}}}},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"33":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"45":{"tf":1.0},"6":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"39":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":2,"docs":{"42":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"0":{"8":{"0":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"34":{"tf":2.449489742783178},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{":":{"/":{"/":{"c":{"d":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"/":{"@":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"a":{"df":0,"docs":{},"j":{"a":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"/":{"1":{".":{"6":{".":{"5":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"25":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":4,"docs":{"1":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"a":{"c":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"35":{"tf":2.23606797749979},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"p":{"df":1,"docs":{"45":{"tf":1.0}}},"r":{"df":1,"docs":{"40":{"tf":1.0}}},"s":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"32":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"32":{"tf":1.0}}}}}},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"j":{"a":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":5,"docs":{"1":{"tf":1.0},"32":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"w":{"df":1,"docs":{"23":{"tf":1.0}},"e":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"25":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":3.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"0":{"tf":1.0},"40":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"1":{"tf":1.0}}}}},"i":{"b":{"df":1,"docs":{"23":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.7320508075688772},"4":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}},"o":{"a":{"d":{"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":4,"docs":{"0":{"tf":1.0},"30":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":5,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"0":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"39":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":7,"docs":{"0":{"tf":1.0},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.4142135623730951},"4":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}},"n":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"32":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"24":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"3":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"36":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":5,"docs":{"1":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"42":{"tf":1.0}}}},"p":{"df":1,"docs":{"42":{"tf":1.0}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"d":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"k":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"a":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":8,"docs":{"0":{"tf":1.0},"11":{"tf":1.7320508075688772},"2":{"tf":1.0},"31":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"1":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"33":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951}}}},"v":{"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"23":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"2":{"tf":1.0},"24":{"tf":1.0},"35":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"0":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":7,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"2":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":10,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":2,"docs":{"33":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.4142135623730951}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"24":{"tf":1.0},"42":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.0}}},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"42":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{".":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"24":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":6,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":3.0},"32":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"0":{"tf":1.0},"23":{"tf":2.23606797749979},"24":{"tf":1.0},"32":{"tf":1.0},"39":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"s":{"df":1,"docs":{"32":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"37":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"32":{"tf":1.0},"37":{"tf":1.7320508075688772},"4":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":11,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"25":{"tf":1.0},"32":{"tf":2.0},"33":{"tf":2.23606797749979},"34":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":2.449489742783178},"7":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"y":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}},"df":2,"docs":{"24":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":6,"docs":{"0":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"9":{"tf":2.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":4,"docs":{"0":{"tf":1.0},"13":{"tf":1.7320508075688772},"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"36":{"tf":1.0},"42":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"14":{"tf":1.7320508075688772},"2":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"32":{"tf":1.0},"34":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":7,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"35":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"39":{"tf":1.0}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":2,"docs":{"44":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":5,"docs":{"1":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.4142135623730951},"3":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":4,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"32":{"tf":1.0},"41":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":5,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"18":{"tf":1.7320508075688772},"2":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}},"s":{",":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"c":{"df":1,"docs":{"35":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"3":{"2":{",":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":2,"docs":{"38":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"32":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0}}}}}},"s":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"39":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"35":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}}}},"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"24":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"39":{"tf":1.0},"42":{"tf":1.0},"9":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"2":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"3":{"tf":1.7320508075688772},"4":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"n":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"35":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":18,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"i":{"c":{"df":20,"docs":{"0":{"tf":1.0},"31":{"tf":1.7320508075688772},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.7320508075688772},"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"16":{"tf":1.0},"2":{"tf":1.0},"22":{"tf":1.7320508075688772},"23":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"25":{"tf":2.8284271247461903},"3":{"tf":1.7320508075688772},"30":{"tf":1.7320508075688772},"32":{"tf":1.0},"35":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"t":{"df":17,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.4142135623730951},"24":{"tf":2.449489742783178},"28":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":2.23606797749979},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"39":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.23606797749979},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"9":{"tf":3.7416573867739413}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.0},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"h":{"a":{"1":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"2":{"5":{"6":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{"2":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"32":{"tf":1.0}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}}}}}},"df":2,"docs":{"32":{"tf":1.0},"4":{"tf":1.0}}}},"u":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"35":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":6,"docs":{"32":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"2":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.0},"4":{"tf":1.0}},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"0":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.4142135623730951}},"e":{"/":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"o":{"c":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"24":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"l":{"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":2.0},"25":{"tf":2.0},"26":{"tf":1.0},"40":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{":":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{".":{"d":{"b":{"df":2,"docs":{"40":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"25":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"x":{":":{":":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951}}}}},"r":{"c":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"45":{"tf":1.0}},"v":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{},"v":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"v":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"df":3,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"45":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":1,"docs":{"3":{"tf":1.0}}}},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"23":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.7320508075688772}}}},"t":{"df":0,"docs":{},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"44":{"tf":1.0},"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":6,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"25":{"tf":1.0},"32":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":10,"docs":{"0":{"tf":1.0},"16":{"tf":2.0},"17":{"tf":1.7320508075688772},"25":{"tf":2.23606797749979},"26":{"tf":1.0},"27":{"tf":1.7320508075688772},"3":{"tf":1.0},"40":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.4142135623730951}}}}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"9":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"4":{"tf":1.0},"42":{"tf":3.1622776601683795},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"33":{"tf":1.0},"42":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":1,"docs":{"42":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"24":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"45":{"tf":2.23606797749979}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"35":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"l":{"df":1,"docs":{"34":{"tf":1.0}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":6,"docs":{"2":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"0":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"32":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}},"s":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"39":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":2,"docs":{"32":{"tf":1.0},"33":{"tf":1.0}},"t":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"23":{"tf":1.0},"36":{"tf":2.0},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"36":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"36":{"tf":1.7320508075688772},"45":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"32":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"0":{"tf":1.0},"29":{"tf":1.7320508075688772},"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"45":{"tf":1.0}}},"u":{"df":0,"docs":{},"e":{"df":5,"docs":{"24":{"tf":1.0},"39":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"o":{"df":2,"docs":{"35":{"tf":1.0},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"32":{"tf":1.0},"42":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.0}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"42":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"1":{"tf":1.0}}}}},"o":{"c":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":5,"docs":{"0":{"tf":1.0},"13":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":2.0}}}}},"df":0,"docs":{}}},"df":8,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"3":{"tf":1.0},"32":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"s":{"df":18,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"16":{"tf":2.0},"2":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":2.449489742783178},"34":{"tf":1.0},"35":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"43":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.7320508075688772}},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"@":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":17,"docs":{"0":{"tf":2.23606797749979},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"21":{"tf":1.7320508075688772},"23":{"tf":1.0},"25":{"tf":2.0},"32":{"tf":1.4142135623730951},"35":{"tf":1.7320508075688772},"36":{"tf":2.23606797749979},"38":{"tf":2.0},"4":{"tf":1.7320508075688772},"40":{"tf":1.0},"45":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"9":{"tf":1.0}},"s":{".":{"d":{"b":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"j":{"2":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"]":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"42":{"tf":1.0},"45":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"v":{"4":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"39":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"u":{"df":11,"docs":{"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"25":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.23606797749979},"42":{"tf":2.449489742783178},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"33":{"tf":1.0},"45":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"a":{"df":7,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":1.0},"2":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"q":{"df":0,"docs":{},"l":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":2,"docs":{"32":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":6,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"10":{"tf":1.7320508075688772},"32":{"tf":1.0},"45":{"tf":1.4142135623730951},"7":{"tf":1.0}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"23":{"tf":1.4142135623730951}}}}}}}}},"z":{"df":0,"docs":{},"x":{"c":{"df":0,"docs":{},"v":{"b":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"title":{"root":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"38":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"32":{"tf":1.0},"45":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"31":{"tf":1.0},"6":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"2":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"28":{"tf":1.0}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"17":{"tf":1.0},"27":{"tf":1.0},"32":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"24":{"tf":1.0}}}}}}},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":1,"docs":{"24":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"30":{"tf":1.0},"5":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"39":{"tf":1.0}}},"n":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"1":{"tf":1.0},"10":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"44":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"44":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"31":{"tf":1.0},"39":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0}}}}}}},"t":{"df":3,"docs":{"28":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"q":{"df":0,"docs":{},"l":{"df":2,"docs":{"16":{"tf":1.0},"25":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"12":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"25":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"36":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"43":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"e":{"b":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"AND","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/resources/sitehome_model/docserver/server_modes.html b/resources/sitehome_model/docserver/server_modes.html new file mode 100644 index 0000000..cb45def --- /dev/null +++ b/resources/sitehome_model/docserver/server_modes.html @@ -0,0 +1,212 @@ + + + + + + Server modes - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Server modes

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/sessions.html b/resources/sitehome_model/docserver/sessions.html new file mode 100644 index 0000000..67c6ccf --- /dev/null +++ b/resources/sitehome_model/docserver/sessions.html @@ -0,0 +1,212 @@ + + + + + + Session data - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Session data

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/sessions_file_storage.html b/resources/sitehome_model/docserver/sessions_file_storage.html new file mode 100644 index 0000000..9a45843 --- /dev/null +++ b/resources/sitehome_model/docserver/sessions_file_storage.html @@ -0,0 +1,212 @@ + + + + + + File storage - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

File storage

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/sessions_sql.html b/resources/sitehome_model/docserver/sessions_sql.html new file mode 100644 index 0000000..06d7a14 --- /dev/null +++ b/resources/sitehome_model/docserver/sessions_sql.html @@ -0,0 +1,236 @@ + + + + + + SQL storage - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

SQL storage

+

Doc Server Sesssions use Rust crate async_session for storage or data persistence, so bassically there are several stores to use.

+

To keep it small and simple async-sqlx-session is implemented by default with SQLite but as it is based on SQLx is is Database Agnostic and it easily support any other choice: PostgreSQL, MySQL, SQLite, and MSSQL.

+

SQLx is also used for users SQL storage.

+
+
+

Sessions store criteria

+

+
+
+

Control access to static contents paths requires Session data stored in database, cookies contains basically a Session ID with no extra content, all other (user or session) data require database access.

+

If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients.

+
+
+
+
+

Separate databases for Session and Users

+

+
+
+

Sessions and Users can use same database store by simply using same uri config values:

+
+
+

Setup

+

Axum

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/settings.html b/resources/sitehome_model/docserver/settings.html new file mode 100644 index 0000000..2e20f90 --- /dev/null +++ b/resources/sitehome_model/docserver/settings.html @@ -0,0 +1,359 @@ + + + + + + Config settings - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Config settings

+

This is an example of configuration file

+

Most of settings have default values to “/” for paths or “” for text or false for boolean, if are not set properly Doc Server config loadd will dispplay ain error an will not abort running.

+

Attributes order does not matter, in case of file path attributes relative path (the ones ending with path“) is tried and finally root_path valued as root path for values. Pay attention to cert and key paths

+

Base layout for example below as config.toml:

+
── Cargo.lock
+├── Cargo.toml
+├── certs 
+│   ├── fullchain.pem
+│   └── privkey.pem
+├── config.toml
+├── data
+│   ├── users.db
+│   └── sessions.db
+├── mdbook
+├── migrations
+│   ├── users.sql
+│   └── view.sql
+├── sitehome
+│   ├── assets
+│   ├── appdoc
+│   ├── html
+│   └── templates
+├── src
+├── paseto
+│   ├── public.ky
+│   └── secret.ky
+└── tools
+    └── get_mail_token.sh
+
+
root_path = "sitehome"
+name = "docserver"
+org = "ORG"
+verbose = 2
+home_path = ""
+prefix = ""
+resources_path = "resources"
+
+# Certs for SSL 
+cert_file = "certs/fullchain.pem"
+key_file = "certs/privkey.pem"
+
+templates_path = "templates"
+defaults_path = "resources/defaults"
+
+html_url = "/html"
+assets_url = "/assets"
+
+allow_origin = ["http://localhost:8080"]
+
+# HOST ip or name for Web service
+hostport = "docs.example.com:8800"
+bnd = "0.0.0.0"
+
+# PORT for Web service
+port = 8800
+protocol = "http"
+
+# Availables Langs
+langs = ["en","es"]
+dflt_lang = "en"
+
+## How to signup by 'invitation' or 'open'
+signup_mode = "open"
+invite_expire = 900 # in seconds
+
+# topt Mode: mandatory, optional, no (default)  
+totp_mode = "no"
+# totp Digits: 6 (default) or 8 
+totp_digits = 6
+# topt Algorithm: sha1 (default), sha256, sha512
+totp_algorithm = "sha256"
+
+password_score = 3
+admin_fields = "roles,otp_base32,status"
+
+use_mail = false
+smtp = "mail.example.com"
+smtp_auth = "v4.public..."
+mail_from ="admini@example.com"
+
+#users_store_uri = "file:///data/users"
+users_store_uri = "sqlite:data/users.db"
+user_store_access = "access"
+authz_model_path = "srvc/model.conf"
+authz_policy_path = "srvc/policy.csv"
+#session_store_uri = "file:///data/sessions"
+session_store_uri = "sqlite:data/sessions.db"
+session_store_file = "session"
+session_expire = 300
+
+[tpls]
+  url = "http://docs.example.com/"
+  main = "home.html.j2"
+  info = "info.html.j2"
+  help = "help.html.j2"
+  notfound = "notfound.html.j2"
+  notauth = "notauth.html.j2"
+  login = "login.html.j2"
+  logout = "logout.html.j2"
+  signup = "signup.html.j2"
+  user_settings = "user_settings.html.j2"
+  invite_create = "invite_create.html.j2"
+  invite_output = "invite_output.html.j2"
+  invite_mail_html = "invite_mail.html.j2"
+  invite_maili_txt = "invite_mail.txt.j2"
+  users = "users.html.j2"
+  trylater = "trylater.j2"
+  session  = "session.j2"
+  js = "js"
+  css = ""
+
+[paseto] 
+  public_path = "paseto/public.ky"
+  secret_path = "paseto/secret.ky"
+  is_bin = false
+  assert_val = ""
+  expire = true
+[paseto.map_footer]
+[paseto.data]
+
+[ui]
+css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css"
+js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime"
+main_js_link = "/assets/js/main.js"
+utils_js_link = "/assets/js/utils.js"
+other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css"
+other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js"
+
+[[ui.web_menu_items]]
+# ~home text part will be removed, it is to indicate it is a home link
+text = "~home"
+url = "/"
+roles = []
+
+[[ui.web_menu_items]]
+text = "AppDoc"
+url = "/appdoc"
+roles = ["dev"]
+
+[[ui.web_menu_items]]
+text = "Users"
+url = "/users"
+roles = ["admin"]
+
+[[serv_paths]]
+src_path = "appdoc"
+url_path = "/appdoc"
+not_found = ""
+roles = "dev"
+redirect_to = "/login"
+not_auth = "/login"
+is_restricted = true
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/static_content.html b/resources/sitehome_model/docserver/static_content.html new file mode 100644 index 0000000..91c5542 --- /dev/null +++ b/resources/sitehome_model/docserver/static_content.html @@ -0,0 +1,212 @@ + + + + + + Static contents - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Static contents

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/theme-dawn.js b/resources/sitehome_model/docserver/theme-dawn.js new file mode 100644 index 0000000..af391d0 --- /dev/null +++ b/resources/sitehome_model/docserver/theme-dawn.js @@ -0,0 +1,7 @@ +ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-dawn",t.cssText=".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { + ace.require(["ace/theme/dawn"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/resources/sitehome_model/docserver/theme-tomorrow_night.js b/resources/sitehome_model/docserver/theme-tomorrow_night.js new file mode 100644 index 0000000..7620b2a --- /dev/null +++ b/resources/sitehome_model/docserver/theme-tomorrow_night.js @@ -0,0 +1,7 @@ +ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night",t.cssText=".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() { + ace.require(["ace/theme/tomorrow_night"], function(m) { + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = m; + } + }); + })(); diff --git a/resources/sitehome_model/docserver/tomorrow-night.css b/resources/sitehome_model/docserver/tomorrow-night.css new file mode 100644 index 0000000..81fe276 --- /dev/null +++ b/resources/sitehome_model/docserver/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/resources/sitehome_model/docserver/trace.html b/resources/sitehome_model/docserver/trace.html new file mode 100644 index 0000000..1b7df10 --- /dev/null +++ b/resources/sitehome_model/docserver/trace.html @@ -0,0 +1,212 @@ + + + + + + Traced - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Traced

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/url_path.html b/resources/sitehome_model/docserver/url_path.html new file mode 100644 index 0000000..582c858 --- /dev/null +++ b/resources/sitehome_model/docserver/url_path.html @@ -0,0 +1,212 @@ + + + + + + url_path prefix - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

url_path prefix

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/users.html b/resources/sitehome_model/docserver/users.html new file mode 100644 index 0000000..f1c5e74 --- /dev/null +++ b/resources/sitehome_model/docserver/users.html @@ -0,0 +1,212 @@ + + + + + + Users - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Users

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/users_file_storage.html b/resources/sitehome_model/docserver/users_file_storage.html new file mode 100644 index 0000000..db4e721 --- /dev/null +++ b/resources/sitehome_model/docserver/users_file_storage.html @@ -0,0 +1,212 @@ + + + + + + File storage - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

File storage

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/docserver/users_sql.html b/resources/sitehome_model/docserver/users_sql.html new file mode 100644 index 0000000..31585fb --- /dev/null +++ b/resources/sitehome_model/docserver/users_sql.html @@ -0,0 +1,225 @@ + + + + + + SQL storage - Doc Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

SQL storage

+

Doc Server users use Rust crate SQLx

+

As Dataabse Agnostic can it easily support the following databases:

+ +

sqlx::any is used so:

+
+

Doc Server for users use a Generic database driver with the specific driver selected at runtime.

+
+

SQLx is also used for sessions SQL storage.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/resources/sitehome_model/html/index.html b/resources/sitehome_model/html/index.html new file mode 100644 index 0000000..45caf2d --- /dev/null +++ b/resources/sitehome_model/html/index.html @@ -0,0 +1 @@ +Hi from HTML index.html diff --git a/resources/sitehome_model/html/terms-conditions.html b/resources/sitehome_model/html/terms-conditions.html new file mode 100644 index 0000000..03684de --- /dev/null +++ b/resources/sitehome_model/html/terms-conditions.html @@ -0,0 +1,73 @@ + + + + + + + + + + + + + +
+
+

Terms and Conditions

+

Here at Flowbite we focus on markets where technology, innovation, and capital can unlock long-term value and drive economic growth.

+ +
+
+
+
+
+Copyright © +DocServer +2023. Made with ❤ by +Doc Server +• + +
+ + + + + +
+ + + diff --git a/resources/sitehome_model/srcdocserver/.lock b/resources/sitehome_model/srcdocserver/.lock new file mode 100755 index 0000000..e69de29 diff --git a/resources/sitehome_model/srcdocserver/crates.js b/resources/sitehome_model/srcdocserver/crates.js new file mode 100644 index 0000000..d49dce7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/crates.js @@ -0,0 +1 @@ +window.ALL_CRATES = ["docserver"]; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/all.html b/resources/sitehome_model/srcdocserver/docserver/all.html new file mode 100644 index 0000000..3eec432 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/all.html @@ -0,0 +1,26 @@ +List of all items in this crate
+ + + +

List of all items

Structs

Enums

Traits

Functions

Statics

Constants

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.CFG_FILE_EXTENSION.html b/resources/sitehome_model/srcdocserver/docserver/constant.CFG_FILE_EXTENSION.html new file mode 100644 index 0000000..d7fa9a6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.CFG_FILE_EXTENSION.html @@ -0,0 +1,26 @@ +CFG_FILE_EXTENSION in docserver - Rust
+ + + +
pub const CFG_FILE_EXTENSION: &str = ".toml";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.DEFAULT_ROLES.html b/resources/sitehome_model/srcdocserver/docserver/constant.DEFAULT_ROLES.html new file mode 100644 index 0000000..450f3c4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.DEFAULT_ROLES.html @@ -0,0 +1,26 @@ +DEFAULT_ROLES in docserver - Rust
+ + + +

Constant docserver::DEFAULT_ROLES

source ·
pub const DEFAULT_ROLES: &str = "user";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.FILE_SCHEME.html b/resources/sitehome_model/srcdocserver/docserver/constant.FILE_SCHEME.html new file mode 100644 index 0000000..5bd384a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.FILE_SCHEME.html @@ -0,0 +1,26 @@ +FILE_SCHEME in docserver - Rust
+ + + +

Constant docserver::FILE_SCHEME

source ·
pub const FILE_SCHEME: &str = "file:///";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.GIT_VERSION.html b/resources/sitehome_model/srcdocserver/docserver/constant.GIT_VERSION.html new file mode 100644 index 0000000..49f6b4f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.GIT_VERSION.html @@ -0,0 +1,26 @@ +GIT_VERSION in docserver - Rust
+ + + +

Constant docserver::GIT_VERSION

source ·
pub(crate) const GIT_VERSION: &str = "";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.PKG_NAME.html b/resources/sitehome_model/srcdocserver/docserver/constant.PKG_NAME.html new file mode 100644 index 0000000..f4452af --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.PKG_NAME.html @@ -0,0 +1,26 @@ +PKG_NAME in docserver - Rust
+ + + +

Constant docserver::PKG_NAME

source ·
pub const PKG_NAME: &str = _;
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.PKG_VERSION.html b/resources/sitehome_model/srcdocserver/docserver/constant.PKG_VERSION.html new file mode 100644 index 0000000..9e4a22c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.PKG_VERSION.html @@ -0,0 +1,26 @@ +PKG_VERSION in docserver - Rust
+ + + +

Constant docserver::PKG_VERSION

source ·
pub const PKG_VERSION: &str = _;
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.SESSION_COOKIE_NAME.html b/resources/sitehome_model/srcdocserver/docserver/constant.SESSION_COOKIE_NAME.html new file mode 100644 index 0000000..0e10c7f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.SESSION_COOKIE_NAME.html @@ -0,0 +1,26 @@ +SESSION_COOKIE_NAME in docserver - Rust
+ + + +
pub const SESSION_COOKIE_NAME: &str = "doc_session";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.USERS_FILESTORE.html b/resources/sitehome_model/srcdocserver/docserver/constant.USERS_FILESTORE.html new file mode 100644 index 0000000..4d6edeb --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.USERS_FILESTORE.html @@ -0,0 +1,26 @@ +USERS_FILESTORE in docserver - Rust
+ + + +

Constant docserver::USERS_FILESTORE

source ·
pub const USERS_FILESTORE: &str = "users";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.USERS_TABLENAME.html b/resources/sitehome_model/srcdocserver/docserver/constant.USERS_TABLENAME.html new file mode 100644 index 0000000..5449763 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.USERS_TABLENAME.html @@ -0,0 +1,26 @@ +USERS_TABLENAME in docserver - Rust
+ + + +

Constant docserver::USERS_TABLENAME

source ·
pub const USERS_TABLENAME: &str = "users";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/constant.USER_AGENT.html b/resources/sitehome_model/srcdocserver/docserver/constant.USER_AGENT.html new file mode 100644 index 0000000..35bb147 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/constant.USER_AGENT.html @@ -0,0 +1,26 @@ +USER_AGENT in docserver - Rust
+ + + +

Constant docserver::USER_AGENT

source ·
pub const USER_AGENT: &str = "user-agent";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/index.html new file mode 100644 index 0000000..9760920 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/index.html @@ -0,0 +1,26 @@ +docserver::defs::appdbs - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/sidebar-items.js new file mode 100644 index 0000000..c091d98 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AppDBs"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/struct.AppDBs.html b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/struct.AppDBs.html new file mode 100644 index 0000000..e2fdb42 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/appdbs/struct.AppDBs.html @@ -0,0 +1,62 @@ +AppDBs in docserver::defs::appdbs - Rust
+ + + +

Struct docserver::defs::appdbs::AppDBs

source ·
pub struct AppDBs {
+    pub config: Config,
+    pub enforcer: Arc<RwLock<Enforcer>>,
+    pub sessions_store_db: SessionStoreDB,
+    pub user_store: UserStore,
+    pub tera: Tera,
+    pub context: Context,
+}

Fields§

§config: Config§enforcer: Arc<RwLock<Enforcer>>§sessions_store_db: SessionStoreDB§user_store: UserStore§tera: Tera§context: Context

Implementations§

source§

impl AppDBs

source

pub fn new( + config: &Config, + store: SessionStoreDB, + user_store: UserStore, + enforcer: Arc<RwLock<Enforcer>>, + tera: Tera, + context: Context +) -> Self

source

pub async fn create_enforcer( + model_path: &'static str, + policy_path: &'static str +) -> Arc<RwLock<Enforcer>>

Trait Implementations§

source§

impl Clone for AppDBs

source§

fn clone(&self) -> AppDBs

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl !RefUnwindSafe for AppDBs

§

impl Send for AppDBs

§

impl Sync for AppDBs

§

impl Unpin for AppDBs

§

impl !UnwindSafe for AppDBs

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/cli/fn.parse_args.html b/resources/sitehome_model/srcdocserver/docserver/defs/cli/fn.parse_args.html new file mode 100644 index 0000000..125313c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/cli/fn.parse_args.html @@ -0,0 +1,28 @@ +parse_args in docserver::defs::cli - Rust
+ + + +

Function docserver::defs::cli::parse_args

source ·
pub fn parse_args() -> String
Expand description

Runs some options from command line like: genererate id, PaSeTo keys, Token. +Set TOML config-path to load web-server settings

+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/cli/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/cli/index.html new file mode 100644 index 0000000..6425723 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/cli/index.html @@ -0,0 +1,27 @@ +docserver::defs::cli - Rust
+ + + +

Module docserver::defs::cli

source ·

Structs

Functions

  • Runs some options from command line like: genererate id, PaSeTo keys, Token. +Set TOML config-path to load web-server settings
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/cli/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/cli/sidebar-items.js new file mode 100644 index 0000000..5e9ac1c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/cli/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_args"],"struct":["Cli"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/cli/struct.Cli.html b/resources/sitehome_model/srcdocserver/docserver/defs/cli/struct.Cli.html new file mode 100644 index 0000000..8d23d18 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/cli/struct.Cli.html @@ -0,0 +1,74 @@ +Cli in docserver::defs::cli - Rust
+ + + +

Struct docserver::defs::cli::Cli

source ·
pub struct Cli {
+    pub config_path: Option<String>,
+    pub create_id: bool,
+    pub pasetokeys_path: Option<String>,
+    pub make_token: Option<String>,
+    pub output_path: Option<String>,
+    pub version: bool,
+}

Fields§

§config_path: Option<String>
    +
  • Configuration TOML file-path to run WebServer REQUIRED
  • +
+
§create_id: bool

Generate id key for identification

+
§pasetokeys_path: Option<String>

Path to generate PaSeTo public and secret keys to use for tokens

+
§make_token: Option<String>

Settings-toml-file to Generate PaSeTo Token (-o to filepath)

+
§output_path: Option<String>

Output path to save generated token with make_token (-t)

+
§version: bool

Show version

+

Trait Implementations§

source§

impl Args for Cli

source§

fn group_id() -> Option<Id>

Report the [ArgGroup::id][crate::ArgGroup::id] for this set of arguments
source§

fn augment_args<'b>(__clap_app: Command) -> Command

Append to [Command] so it can instantiate Self. Read more
source§

fn augment_args_for_update<'b>(__clap_app: Command) -> Command

Append to [Command] so it can update self. Read more
source§

impl CommandFactory for Cli

source§

fn command<'b>() -> Command

Build a [Command] that can instantiate Self. Read more
source§

fn command_for_update<'b>() -> Command

Build a [Command] that can update self. Read more
source§

impl Debug for Cli

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromArgMatches for Cli

source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches +) -> Result<(), Error>

Assign values from ArgMatches to self.
source§

impl Parser for Cli

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error<RichFormatter>>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Selfwhere + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error<RichFormatter>>where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error<RichFormatter>>where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

§

impl RefUnwindSafe for Cli

§

impl Send for Cli

§

impl Sync for Cli

§

impl Unpin for Cli

§

impl UnwindSafe for Cli

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_array_resource.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_array_resource.html new file mode 100644 index 0000000..e16ea94 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_array_resource.html @@ -0,0 +1,26 @@ +default_config_array_resource in docserver::defs::config - Rust
+ + + +
fn default_config_array_resource() -> Vec<String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_dflt_lang.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_dflt_lang.html new file mode 100644 index 0000000..9518bee --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_dflt_lang.html @@ -0,0 +1,26 @@ +default_config_dflt_lang in docserver::defs::config - Rust
+ + + +
fn default_config_dflt_lang() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_empty.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_empty.html new file mode 100644 index 0000000..003ece6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_empty.html @@ -0,0 +1,26 @@ +default_config_empty in docserver::defs::config - Rust
+ + + +
fn default_config_empty() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_invite_expire.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_invite_expire.html new file mode 100644 index 0000000..e6ed34c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_invite_expire.html @@ -0,0 +1,26 @@ +default_config_invite_expire in docserver::defs::config - Rust
+ + + +
fn default_config_invite_expire() -> u64
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_locales.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_locales.html new file mode 100644 index 0000000..eb81cc3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_locales.html @@ -0,0 +1,26 @@ +default_config_locales in docserver::defs::config - Rust
+ + + +
fn default_config_locales() -> HashMap<String, Local>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_org.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_org.html new file mode 100644 index 0000000..8795321 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_org.html @@ -0,0 +1,26 @@ +default_config_org in docserver::defs::config - Rust
+ + + +
fn default_config_org() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_password_score.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_password_score.html new file mode 100644 index 0000000..bef9a8f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_password_score.html @@ -0,0 +1,26 @@ +default_config_password_score in docserver::defs::config - Rust
+ + + +
fn default_config_password_score() -> u8
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_resource.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_resource.html new file mode 100644 index 0000000..5b495ba --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_resource.html @@ -0,0 +1,26 @@ +default_config_resource in docserver::defs::config - Rust
+ + + +
fn default_config_resource() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_serv_paths.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_serv_paths.html new file mode 100644 index 0000000..10c978a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_serv_paths.html @@ -0,0 +1,26 @@ +default_config_serv_paths in docserver::defs::config - Rust
+ + + +
fn default_config_serv_paths() -> Vec<ServPath>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_algorithm.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_algorithm.html new file mode 100644 index 0000000..644547d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_algorithm.html @@ -0,0 +1,26 @@ +default_config_totp_algorithm in docserver::defs::config - Rust
+ + + +
fn default_config_totp_algorithm() -> TotpAlgorithm
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_digits.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_digits.html new file mode 100644 index 0000000..74017fe --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_digits.html @@ -0,0 +1,26 @@ +default_config_totp_digits in docserver::defs::config - Rust
+ + + +
fn default_config_totp_digits() -> usize
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_mode.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_mode.html new file mode 100644 index 0000000..c04e2f4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_totp_mode.html @@ -0,0 +1,26 @@ +default_config_totp_mode in docserver::defs::config - Rust
+ + + +
fn default_config_totp_mode() -> TotpMode
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_tpls.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_tpls.html new file mode 100644 index 0000000..2faf3b2 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_tpls.html @@ -0,0 +1,26 @@ +default_config_tpls in docserver::defs::config - Rust
+ + + +
fn default_config_tpls() -> HashMap<String, String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_mail.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_mail.html new file mode 100644 index 0000000..bc48ce4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_mail.html @@ -0,0 +1,26 @@ +default_config_use_mail in docserver::defs::config - Rust
+ + + +
fn default_config_use_mail() -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_random.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_random.html new file mode 100644 index 0000000..f6ba879 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_use_random.html @@ -0,0 +1,26 @@ +default_config_use_random in docserver::defs::config - Rust
+ + + +
fn default_config_use_random() -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_web_menu_items.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_web_menu_items.html new file mode 100644 index 0000000..860199d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_config_web_menu_items.html @@ -0,0 +1,26 @@ +default_config_web_menu_items in docserver::defs::config - Rust
+ + + +
fn default_config_web_menu_items() -> Vec<WebMenuItem>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_is_restricted.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_is_restricted.html new file mode 100644 index 0000000..f952e69 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_is_restricted.html @@ -0,0 +1,26 @@ +default_is_restricted in docserver::defs::config - Rust
+ + + +
fn default_is_restricted() -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_sub_menu_items.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_sub_menu_items.html new file mode 100644 index 0000000..a29af06 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_sub_menu_items.html @@ -0,0 +1,26 @@ +default_sub_menu_items in docserver::defs::config - Rust
+ + + +
fn default_sub_menu_items() -> Vec<SubMenuItem>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_web_menu_item_roles.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_web_menu_item_roles.html new file mode 100644 index 0000000..12792f9 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/fn.default_web_menu_item_roles.html @@ -0,0 +1,26 @@ +default_web_menu_item_roles in docserver::defs::config - Rust
+ + + +
fn default_web_menu_item_roles() -> Vec<String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/index.html new file mode 100644 index 0000000..83f02f3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/index.html @@ -0,0 +1,26 @@ +docserver::defs::config - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/config/sidebar-items.js new file mode 100644 index 0000000..6d13aa0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["default_config_array_resource","default_config_dflt_lang","default_config_empty","default_config_invite_expire","default_config_locales","default_config_org","default_config_password_score","default_config_resource","default_config_serv_paths","default_config_totp_algorithm","default_config_totp_digits","default_config_totp_mode","default_config_tpls","default_config_use_mail","default_config_use_random","default_config_web_menu_items","default_is_restricted","default_sub_menu_items","default_web_menu_item_roles"],"struct":["Config","ServPath","SubMenuItem","UiConfig","WebMenuItem"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.Config.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.Config.html new file mode 100644 index 0000000..e7887ec --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.Config.html @@ -0,0 +1,97 @@ +Config in docserver::defs::config - Rust
+ + + +

Struct docserver::defs::config::Config

source ·
pub struct Config {
Show 46 fields + pub hostport: String, + pub bind: String, + pub port: u16, + pub protocol: String, + pub org: String, + pub name: String, + pub verbose: u8, + pub prefix: String, + pub resources_path: String, + pub cert_file: String, + pub key_file: String, + pub allow_origin: Vec<String>, + pub langs: Vec<String>, + pub dflt_lang: String, + pub path_locales_config: String, + pub locales: HashMap<String, Local>, + pub root_path: String, + pub defaults_path: String, + pub serv_paths: Vec<ServPath>, + pub docs_index: String, + pub templates_path: String, + pub html_url: String, + pub assets_url: String, + pub users_store_uri: String, + pub user_store_access: String, + pub signup_mode: String, + pub invite_expire: u64, + pub use_random: bool, + pub totp_digits: usize, + pub totp_mode: TotpMode, + pub totp_algorithm: TotpAlgorithm, + pub password_score: u8, + pub admin_fields: String, + pub mail_from: String, + pub mail_reply_to: String, + pub use_mail: bool, + pub smtp: String, + pub smtp_auth: String, + pub authz_model_path: String, + pub authz_policy_path: String, + pub session_store_uri: String, + pub session_store_file: String, + pub session_expire: u64, + pub paseto: ConfigPaSeToken, + pub ui: UiConfig, + pub tpls: HashMap<String, String>, +
}
Expand description

Config collects config values.

+

Fields§

§hostport: String§bind: String§port: u16§protocol: String§org: String§name: String§verbose: u8§prefix: String§resources_path: String§cert_file: String§key_file: String§allow_origin: Vec<String>§langs: Vec<String>§dflt_lang: String§path_locales_config: String§locales: HashMap<String, Local>§root_path: String§defaults_path: String§serv_paths: Vec<ServPath>§docs_index: String§templates_path: String§html_url: String§assets_url: String§users_store_uri: String§user_store_access: String§signup_mode: String§invite_expire: u64§use_random: bool§totp_digits: usize§totp_mode: TotpMode§totp_algorithm: TotpAlgorithm§password_score: u8§admin_fields: String§mail_from: String§mail_reply_to: String§use_mail: bool§smtp: String§smtp_auth: String§authz_model_path: String§authz_policy_path: String§session_store_uri: String§session_store_file: String§session_expire: u64§paseto: ConfigPaSeToken§ui: UiConfig§tpls: HashMap<String, String>

Implementations§

source§

impl Config

source

fn fix_root_path<Config>(&mut self, root_path: String)

source

fn fix_item_path(&mut self, item: String) -> String

source

pub fn load_items(&mut self)

source

pub fn to_json(&self) -> String

source

pub fn full_html_url(&self, url: &str) -> String

source

pub fn load_from_file<'a>(file_cfg: &str, name: &str) -> Result<Self>

Trait Implementations§

source§

impl Clone for Config

source§

fn clone(&self) -> Config

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Config

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Config

source§

fn default() -> Config

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Config

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for Config

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.ServPath.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.ServPath.html new file mode 100644 index 0000000..39cc2ea --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.ServPath.html @@ -0,0 +1,57 @@ +ServPath in docserver::defs::config - Rust
+ + + +

Struct docserver::defs::config::ServPath

source ·
pub struct ServPath {
+    pub src_path: String,
+    pub url_path: String,
+    pub not_found: String,
+    pub not_auth: String,
+    pub is_restricted: bool,
+    pub redirect_to: String,
+}
Expand description

ServPath collects dir path to server as static content

+

Fields§

§src_path: String§url_path: String§not_found: String§not_auth: String§is_restricted: bool§redirect_to: String

Trait Implementations§

source§

impl Clone for ServPath

source§

fn clone(&self) -> ServPath

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ServPath

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for ServPath

source§

fn default() -> ServPath

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for ServPath

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for ServPath

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.SubMenuItem.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.SubMenuItem.html new file mode 100644 index 0000000..eaad4ab --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.SubMenuItem.html @@ -0,0 +1,55 @@ +SubMenuItem in docserver::defs::config - Rust
+ + + +
pub struct SubMenuItem {
+    pub typ: String,
+    pub srctyp: String,
+    pub text: String,
+    pub url: String,
+    pub roles: Vec<String>,
+}

Fields§

§typ: String§srctyp: String§text: String§url: String§roles: Vec<String>

Trait Implementations§

source§

impl Clone for SubMenuItem

source§

fn clone(&self) -> SubMenuItem

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SubMenuItem

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SubMenuItem

source§

fn default() -> SubMenuItem

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for SubMenuItem

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for SubMenuItem

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.UiConfig.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.UiConfig.html new file mode 100644 index 0000000..fa7384d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.UiConfig.html @@ -0,0 +1,57 @@ +UiConfig in docserver::defs::config - Rust
+ + + +

Struct docserver::defs::config::UiConfig

source ·
pub struct UiConfig {
+    pub css_link: String,
+    pub js_link: String,
+    pub other_css_link: String,
+    pub other_js_link: String,
+    pub main_js_link: String,
+    pub utils_js_link: String,
+    pub web_menu_items: Vec<WebMenuItem>,
+}

Fields§

§css_link: String§js_link: String§other_css_link: String§other_js_link: String§main_js_link: String§utils_js_link: String§web_menu_items: Vec<WebMenuItem>

Trait Implementations§

source§

impl Clone for UiConfig

source§

fn clone(&self) -> UiConfig

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UiConfig

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UiConfig

source§

fn default() -> UiConfig

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UiConfig

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for UiConfig

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.WebMenuItem.html b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.WebMenuItem.html new file mode 100644 index 0000000..62a6739 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/config/struct.WebMenuItem.html @@ -0,0 +1,56 @@ +WebMenuItem in docserver::defs::config - Rust
+ + + +
pub struct WebMenuItem {
+    pub typ: String,
+    pub srctyp: String,
+    pub text: String,
+    pub url: String,
+    pub roles: Vec<String>,
+    pub items: Vec<SubMenuItem>,
+}

Fields§

§typ: String§srctyp: String§text: String§url: String§roles: Vec<String>§items: Vec<SubMenuItem>

Trait Implementations§

source§

impl Clone for WebMenuItem

source§

fn clone(&self) -> WebMenuItem

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for WebMenuItem

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for WebMenuItem

source§

fn default() -> WebMenuItem

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for WebMenuItem

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for WebMenuItem

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.ACCEPT_LANGUAGE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.ACCEPT_LANGUAGE.html new file mode 100644 index 0000000..4f0bec5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.ACCEPT_LANGUAGE.html @@ -0,0 +1,26 @@ +ACCEPT_LANGUAGE in docserver::defs - Rust
+ + + +
pub const ACCEPT_LANGUAGE: &str = "accept-language";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.AUTHORIZATION.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.AUTHORIZATION.html new file mode 100644 index 0000000..06a7346 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.AUTHORIZATION.html @@ -0,0 +1,26 @@ +AUTHORIZATION in docserver::defs - Rust
+ + + +

Constant docserver::defs::AUTHORIZATION

source ·
pub const AUTHORIZATION: &str = "authorization";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.BEARER.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.BEARER.html new file mode 100644 index 0000000..f4b4320 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.BEARER.html @@ -0,0 +1,26 @@ +BEARER in docserver::defs - Rust
+ + + +

Constant docserver::defs::BEARER

source ·
pub const BEARER: &str = "Bearer";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_APP_KEY.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_APP_KEY.html new file mode 100644 index 0000000..add42f6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_APP_KEY.html @@ -0,0 +1,26 @@ +CLAIM_APP_KEY in docserver::defs - Rust
+ + + +

Constant docserver::defs::CLAIM_APP_KEY

source ·
pub const CLAIM_APP_KEY: &str = "app_key";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_AUTH.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_AUTH.html new file mode 100644 index 0000000..f093d14 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_AUTH.html @@ -0,0 +1,26 @@ +CLAIM_AUTH in docserver::defs - Rust
+ + + +

Constant docserver::defs::CLAIM_AUTH

source ·
pub const CLAIM_AUTH: &str = "auth";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_UID.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_UID.html new file mode 100644 index 0000000..cdae928 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.CLAIM_UID.html @@ -0,0 +1,26 @@ +CLAIM_UID in docserver::defs - Rust
+ + + +

Constant docserver::defs::CLAIM_UID

source ·
pub const CLAIM_UID: &str = "uid";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.FILE_SCHEME.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.FILE_SCHEME.html new file mode 100644 index 0000000..2741e1e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.FILE_SCHEME.html @@ -0,0 +1,26 @@ +FILE_SCHEME in docserver::defs - Rust
+ + + +

Constant docserver::defs::FILE_SCHEME

source ·
pub const FILE_SCHEME: &str = "file:///";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_EXT.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_EXT.html new file mode 100644 index 0000000..deaa14e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_EXT.html @@ -0,0 +1,26 @@ +HELP_EXT in docserver::defs - Rust
+ + + +

Constant docserver::defs::HELP_EXT

source ·
pub const HELP_EXT: &str = "_help";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_URI.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_URI.html new file mode 100644 index 0000000..c4d06bc --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.HELP_URI.html @@ -0,0 +1,26 @@ +HELP_URI in docserver::defs - Rust
+ + + +

Constant docserver::defs::HELP_URI

source ·
pub const HELP_URI: &str = "help";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOGS_SESSION_COOKIE_NAME.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOGS_SESSION_COOKIE_NAME.html new file mode 100644 index 0000000..cec1240 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOGS_SESSION_COOKIE_NAME.html @@ -0,0 +1,26 @@ +LOGS_SESSION_COOKIE_NAME in docserver::defs - Rust
+ + + +
pub const LOGS_SESSION_COOKIE_NAME: &str = "tiicl_session";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOG_REQ.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOG_REQ.html new file mode 100644 index 0000000..6b01148 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.LOG_REQ.html @@ -0,0 +1,26 @@ +LOG_REQ in docserver::defs - Rust
+ + + +

Constant docserver::defs::LOG_REQ

source ·
pub const LOG_REQ: &str = "logreq";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.REFERER.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.REFERER.html new file mode 100644 index 0000000..9c60991 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.REFERER.html @@ -0,0 +1,26 @@ +REFERER in docserver::defs - Rust
+ + + +

Constant docserver::defs::REFERER

source ·
pub const REFERER: &str = "referer";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.SESSION_ID.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SESSION_ID.html new file mode 100644 index 0000000..44c0bfb --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SESSION_ID.html @@ -0,0 +1,26 @@ +SESSION_ID in docserver::defs - Rust
+ + + +

Constant docserver::defs::SESSION_ID

source ·
pub const SESSION_ID: &str = "sid";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_REQUESTS_FILE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_REQUESTS_FILE.html new file mode 100644 index 0000000..00c9131 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_REQUESTS_FILE.html @@ -0,0 +1,26 @@ +SID_REQUESTS_FILE in docserver::defs - Rust
+ + + +
pub const SID_REQUESTS_FILE: &str = "sid_requests.json";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_SETTINGS_FILE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_SETTINGS_FILE.html new file mode 100644 index 0000000..a5e7da9 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_SETTINGS_FILE.html @@ -0,0 +1,26 @@ +SID_SETTINGS_FILE in docserver::defs - Rust
+ + + +
pub const SID_SETTINGS_FILE: &str = "sid_settings.json";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_TRACE_FILE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_TRACE_FILE.html new file mode 100644 index 0000000..1eaa82d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.SID_TRACE_FILE.html @@ -0,0 +1,26 @@ +SID_TRACE_FILE in docserver::defs - Rust
+ + + +

Constant docserver::defs::SID_TRACE_FILE

source ·
pub const SID_TRACE_FILE: &str = "sid_trace.json";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.TEMPLATE_EXT.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TEMPLATE_EXT.html new file mode 100644 index 0000000..ac31d07 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TEMPLATE_EXT.html @@ -0,0 +1,26 @@ +TEMPLATE_EXT in docserver::defs - Rust
+ + + +

Constant docserver::defs::TEMPLATE_EXT

source ·
pub const TEMPLATE_EXT: &str = "txt";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_AUTH_VALUE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_AUTH_VALUE.html new file mode 100644 index 0000000..89be2ef --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_AUTH_VALUE.html @@ -0,0 +1,26 @@ +TOKEN_AUTH_VALUE in docserver::defs - Rust
+ + + +
pub const TOKEN_AUTH_VALUE: &str = "tii-cl-token";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_KEY_VALUE.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_KEY_VALUE.html new file mode 100644 index 0000000..c56887d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.TOKEN_KEY_VALUE.html @@ -0,0 +1,26 @@ +TOKEN_KEY_VALUE in docserver::defs - Rust
+ + + +
pub const TOKEN_KEY_VALUE: &str = "tii-cl";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_AGENT.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_AGENT.html new file mode 100644 index 0000000..55b92f4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_AGENT.html @@ -0,0 +1,26 @@ +USER_AGENT in docserver::defs - Rust
+ + + +

Constant docserver::defs::USER_AGENT

source ·
pub const USER_AGENT: &str = "user-agent";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_DATA.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_DATA.html new file mode 100644 index 0000000..1c06baf --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.USER_DATA.html @@ -0,0 +1,26 @@ +USER_DATA in docserver::defs - Rust
+ + + +

Constant docserver::defs::USER_DATA

source ·
pub const USER_DATA: &str = "user_data";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_FORWARDED_FOR.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_FORWARDED_FOR.html new file mode 100644 index 0000000..047a963 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_FORWARDED_FOR.html @@ -0,0 +1,26 @@ +X_FORWARDED_FOR in docserver::defs - Rust
+ + + +
pub const X_FORWARDED_FOR: &str = "x-forwarded-for";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_INTERNAL.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_INTERNAL.html new file mode 100644 index 0000000..6aa5e48 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_INTERNAL.html @@ -0,0 +1,26 @@ +X_INTERNAL in docserver::defs - Rust
+ + + +

Constant docserver::defs::X_INTERNAL

source ·
pub const X_INTERNAL: &str = "x-internal";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_REAL_IP.html b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_REAL_IP.html new file mode 100644 index 0000000..939b1b2 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/constant.X_REAL_IP.html @@ -0,0 +1,26 @@ +X_REAL_IP in docserver::defs - Rust
+ + + +

Constant docserver::defs::X_REAL_IP

source ·
pub const X_REAL_IP: &str = "x-real-ip";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/entries/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/entries/index.html new file mode 100644 index 0000000..8fd30bf --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/entries/index.html @@ -0,0 +1,27 @@ +docserver::defs::entries - Rust
+ + + +

Module docserver::defs::entries

source ·

Structs

Traits

  • A Trait to represent an entry of data from an +/etc/{passwd,group,shadow} file.
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/entries/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/entries/sidebar-items.js new file mode 100644 index 0000000..36cf763 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/entries/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Entries"],"trait":["Entry"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/entries/struct.Entries.html b/resources/sitehome_model/srcdocserver/docserver/defs/entries/struct.Entries.html new file mode 100644 index 0000000..9844d07 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/entries/struct.Entries.html @@ -0,0 +1,623 @@ +Entries in docserver::defs::entries - Rust
+ + + +

Struct docserver::defs::entries::Entries

source ·
pub struct Entries<T> {
+    path: String,
+    cursor: BufReader<File>,
+    marker: PhantomData<T>,
+}

Fields§

§path: String§cursor: BufReader<File>§marker: PhantomData<T>

Implementations§

source§

impl<T> Entries<T>

source

pub fn new(file_path: &str) -> Entries<T>

source

pub fn append(&self, entry: String) -> Result<()>

source

pub fn write(&self, entries: &Vec<String>) -> Result<()>

Trait Implementations§

source§

impl<T: Entry> Iterator for Entries<T>

§

type Item = T

The type of the elements being iterated over.
source§

fn next(&mut self) -> Option<T>

Advances the iterator and returns the next value. Read more
source§

fn next_chunk<const N: usize>( + &mut self +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · source§

fn count(self) -> usizewhere + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · source§

fn last(self) -> Option<Self::Item>where + Self: Sized,

Consumes the iterator, returning the last element. Read more
source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZeroUsize>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · source§

fn step_by(self, step: usize) -> StepBy<Self>where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · source§

fn map<B, F>(self, f: F) -> Map<Self, F>where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · source§

fn for_each<F>(self, f: F)where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · source§

fn enumerate(self) -> Enumerate<Self>where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · source§

fn peekable(self) -> Peekable<Self>where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · source§

fn skip(self, n: usize) -> Skip<Self>where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · source§

fn take(self, n: usize) -> Take<Self>where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.0.0 · source§

fn fuse(self) -> Fuse<Self>where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · source§

fn by_ref(&mut self) -> &mut Selfwhere + Self: Sized,

Borrows an iterator, rather than consuming it. Read more
1.0.0 · source§

fn collect<B>(self) -> Bwhere + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
source§

fn collect_into<E>(self, collection: &mut E) -> &mut Ewhere + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · source§

fn partition<B, F>(self, f: F) -> (B, B)where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
source§

fn is_partitioned<P>(self, predicate: P) -> boolwhere + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> Rwhere + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · source§

fn try_for_each<F, R>(&mut self, f: F) -> Rwhere + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · source§

fn fold<B, F>(self, init: B, f: F) -> Bwhere + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · source§

fn reduce<F>(self, f: F) -> Option<Self::Item>where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
source§

fn try_reduce<F, R>( + &mut self, + f: F +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryTypewhere + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> R, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · source§

fn all<F>(&mut self, f: F) -> boolwhere + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · source§

fn any<F>(&mut self, f: F) -> boolwhere + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
source§

fn try_find<F, R>( + &mut self, + f: F +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryTypewhere + Self: Sized, + F: FnMut(&Self::Item) -> R, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · source§

fn position<P>(&mut self, predicate: P) -> Option<usize>where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · source§

fn copied<'a, T>(self) -> Copied<Self>where + T: 'a + Copy, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · source§

fn cloned<'a, T>(self) -> Cloned<Self>where + T: 'a + Clone, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · source§

fn sum<S>(self) -> Swhere + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · source§

fn product<P>(self) -> Pwhere + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Orderingwhere + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · source§

fn eq<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
source§

fn eq_by<I, F>(self, other: I, eq: F) -> boolwhere + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · source§

fn ne<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · source§

fn lt<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · source§

fn le<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · source§

fn gt<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · source§

fn ge<I>(self, other: I) -> boolwhere + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
source§

fn is_sorted_by<F>(self, compare: F) -> boolwhere + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given comparator function. Read more
source§

fn is_sorted_by_key<F, K>(self, f: F) -> boolwhere + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd<K>,

🔬This is a nightly-only experimental API. (is_sorted)
Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for Entries<T>where + T: RefUnwindSafe,

§

impl<T> Send for Entries<T>where + T: Send,

§

impl<T> Sync for Entries<T>where + T: Sync,

§

impl<T> Unpin for Entries<T>where + T: Unpin,

§

impl<T> UnwindSafe for Entries<T>where + T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<I> IntoIterator for Iwhere + I: Iterator,

§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
§

type IntoIter = I

Which kind of iterator are we turning this into?
const: unstable · source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
source§

impl<I> IteratorRandom for Iwhere + I: Iterator,

source§

fn choose<R>(self, rng: &mut R) -> Option<Self::Item>where + R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
source§

fn choose_stable<R>(self, rng: &mut R) -> Option<Self::Item>where + R: Rng + ?Sized,

Choose one element at random from the iterator. Read more
source§

fn choose_multiple_fill<R>(self, rng: &mut R, buf: &mut [Self::Item]) -> usizewhere + R: Rng + ?Sized,

Collects values at random from the iterator into a supplied buffer +until that buffer is filled. Read more
source§

fn choose_multiple<R>( + self, + rng: &mut R, + amount: usize +) -> Vec<Self::Item, Global>where + R: Rng + ?Sized,

Collects amount values at random from the iterator into a vector. Read more
source§

impl<T> Itertools for Twhere + T: Iterator + ?Sized,

source§

fn interleave<J>( + self, + other: J +) -> Interleave<Self, <J as IntoIterator>::IntoIter>where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until both have run out. Read more
source§

fn interleave_shortest<J>( + self, + other: J +) -> InterleaveShortest<Self, <J as IntoIterator>::IntoIter>where + J: IntoIterator<Item = Self::Item>, + Self: Sized,

Alternate elements from two iterators until at least one of them has run +out. Read more
source§

fn intersperse( + self, + element: Self::Item +) -> IntersperseWith<Self, IntersperseElementSimple<Self::Item>>where + Self: Sized, + Self::Item: Clone,

An iterator adaptor to insert a particular value +between each element of the adapted iterator. Read more
source§

fn intersperse_with<F>(self, element: F) -> IntersperseWith<Self, F>where + Self: Sized, + F: FnMut() -> Self::Item,

An iterator adaptor to insert a particular value created by a function +between each element of the adapted iterator. Read more
source§

fn zip_longest<J>( + self, + other: J +) -> ZipLongest<Self, <J as IntoIterator>::IntoIter>where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of two optional elements. Read more
source§

fn zip_eq<J>(self, other: J) -> ZipEq<Self, <J as IntoIterator>::IntoIter>where + J: IntoIterator, + Self: Sized,

Create an iterator which iterates over both this and the specified +iterator simultaneously, yielding pairs of elements. Read more
source§

fn batching<B, F>(self, f: F) -> Batching<Self, F>where + F: FnMut(&mut Self) -> Option<B>, + Self: Sized,

A “meta iterator adaptor”. Its closure receives a reference to the +iterator and may pick off as many elements as it likes, to produce the +next iterator element. Read more
source§

fn group_by<K, F>(self, key: F) -> GroupBy<K, Self, F>where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq<K>,

Return an iterable that can group iterator elements. +Consecutive elements that map to the same key (“runs”), are assigned +to the same group. Read more
source§

fn chunks(self, size: usize) -> IntoChunks<Self>where + Self: Sized,

Return an iterable that can chunk the iterator. Read more
source§

fn tuple_windows<T>(self) -> TupleWindows<Self, T>where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple, + <T as TupleCollect>::Item: Clone,

Return an iterator over all contiguous windows producing tuples of +a specific size (up to 12). Read more
source§

fn circular_tuple_windows<T>(self) -> CircularTupleWindows<Self, T>where + Self: Sized + Clone + Iterator<Item = <T as TupleCollect>::Item> + ExactSizeIterator, + T: TupleCollect + Clone, + <T as TupleCollect>::Item: Clone,

Return an iterator over all windows, wrapping back to the first +elements when the window would otherwise exceed the length of the +iterator, producing tuples of a specific size (up to 12). Read more
source§

fn tuples<T>(self) -> Tuples<Self, T>where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Return an iterator that groups the items in tuples of a specific size +(up to 12). Read more
source§

fn tee(self) -> (Tee<Self>, Tee<Self>)where + Self: Sized, + Self::Item: Clone,

Split into an iterator pair that both yield all elements from +the original iterator. Read more
source§

fn step(self, n: usize) -> Step<Self>where + Self: Sized,

👎Deprecated since 0.8.0: Use std .step_by() instead
Return an iterator adaptor that steps n elements in the base iterator +for each iteration. Read more
source§

fn map_into<R>(self) -> MapSpecialCase<Self, MapSpecialCaseFnInto<R>>where + Self: Sized, + Self::Item: Into<R>,

Convert each item of the iterator using the Into trait. Read more
source§

fn map_results<F, T, U, E>( + self, + f: F +) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>where + Self: Iterator<Item = Result<T, E>> + Sized, + F: FnMut(T) -> U,

👎Deprecated since 0.10.0: Use .map_ok() instead
source§

fn map_ok<F, T, U, E>(self, f: F) -> MapSpecialCase<Self, MapSpecialCaseFnOk<F>>where + Self: Iterator<Item = Result<T, E>> + Sized, + F: FnMut(T) -> U,

Return an iterator adaptor that applies the provided closure +to every Result::Ok value. Result::Err values are +unchanged. Read more
source§

fn filter_ok<F, T, E>(self, f: F) -> FilterOk<Self, F>where + Self: Iterator<Item = Result<T, E>> + Sized, + F: FnMut(&T) -> bool,

Return an iterator adaptor that filters every Result::Ok +value with the provided closure. Result::Err values are +unchanged. Read more
source§

fn filter_map_ok<F, T, U, E>(self, f: F) -> FilterMapOk<Self, F>where + Self: Iterator<Item = Result<T, E>> + Sized, + F: FnMut(T) -> Option<U>,

Return an iterator adaptor that filters and transforms every +Result::Ok value with the provided closure. Result::Err +values are unchanged. Read more
source§

fn flatten_ok<T, E>(self) -> FlattenOk<Self, T, E>where + Self: Iterator<Item = Result<T, E>> + Sized, + T: IntoIterator,

Return an iterator adaptor that flattens every Result::Ok value into +a series of Result::Ok values. Result::Err values are unchanged. Read more
source§

fn merge<J>( + self, + other: J +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, MergeLte>where + Self: Sized, + Self::Item: PartialOrd<Self::Item>, + J: IntoIterator<Item = Self::Item>,

Return an iterator adaptor that merges the two base iterators in +ascending order. If both base iterators are sorted (ascending), the +result is sorted. Read more
source§

fn merge_by<J, F>( + self, + other: J, + is_first: F +) -> MergeBy<Self, <J as IntoIterator>::IntoIter, F>where + Self: Sized, + J: IntoIterator<Item = Self::Item>, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Return an iterator adaptor that merges the two base iterators in order. +This is much like .merge() but allows for a custom ordering. Read more
source§

fn merge_join_by<J, F>( + self, + other: J, + cmp_fn: F +) -> MergeJoinBy<Self, <J as IntoIterator>::IntoIter, F>where + J: IntoIterator, + F: FnMut(&Self::Item, &<J as IntoIterator>::Item) -> Ordering, + Self: Sized,

Create an iterator that merges items from both this and the specified +iterator in ascending order. Read more
source§

fn kmerge(self) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, KMergeByLt>where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::Item: PartialOrd<<Self::Item as IntoIterator>::Item>,

Return an iterator adaptor that flattens an iterator of iterators by +merging them in ascending order. Read more
source§

fn kmerge_by<F>( + self, + first: F +) -> KMergeBy<<Self::Item as IntoIterator>::IntoIter, F>where + Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&<Self::Item as IntoIterator>::Item, &<Self::Item as IntoIterator>::Item) -> bool,

Return an iterator adaptor that flattens an iterator of iterators by +merging them according to the given closure. Read more
source§

fn cartesian_product<J>( + self, + other: J +) -> Product<Self, <J as IntoIterator>::IntoIter>where + Self: Sized, + Self::Item: Clone, + J: IntoIterator, + <J as IntoIterator>::IntoIter: Clone,

Return an iterator adaptor that iterates over the cartesian product of +the element sets of two iterators self and J. Read more
source§

fn multi_cartesian_product( + self +) -> MultiProduct<<Self::Item as IntoIterator>::IntoIter>where + Self: Sized, + Self::Item: IntoIterator, + <Self::Item as IntoIterator>::IntoIter: Clone, + <Self::Item as IntoIterator>::Item: Clone,

Return an iterator adaptor that iterates over the cartesian product of +all subiterators returned by meta-iterator self. Read more
source§

fn coalesce<F>(self, f: F) -> CoalesceBy<Self, F, Self::Item>where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Result<Self::Item, (Self::Item, Self::Item)>,

Return an iterator adaptor that uses the passed-in closure to +optionally merge together consecutive elements. Read more
source§

fn dedup(self) -> CoalesceBy<Self, DedupPred2CoalescePred<DedupEq>, Self::Item>where + Self: Sized, + Self::Item: PartialEq<Self::Item>,

Remove duplicates from sections of consecutive identical elements. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by<Cmp>( + self, + cmp: Cmp +) -> CoalesceBy<Self, DedupPred2CoalescePred<Cmp>, Self::Item>where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, +determining equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_with_count( + self +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<DedupEq>, (usize, Self::Item)>where + Self: Sized,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +If the iterator is sorted, all elements will be unique. Read more
source§

fn dedup_by_with_count<Cmp>( + self, + cmp: Cmp +) -> CoalesceBy<Self, DedupPredWithCount2CoalescePred<Cmp>, (usize, Self::Item)>where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool,

Remove duplicates from sections of consecutive identical elements, while keeping a count of +how many repeated elements were present. +This will determine equality using a comparison function. +If the iterator is sorted, all elements will be unique. Read more
source§

fn duplicates(self) -> DuplicatesBy<Self, Self::Item, ById>where + Self: Sized, + Self::Item: Eq + Hash,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn duplicates_by<V, F>(self, f: F) -> DuplicatesBy<Self, V, ByFn<F>>where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that produces elements that appear more than once during the +iteration. Duplicates are detected using hash and equality. Read more
source§

fn unique(self) -> Unique<Self>where + Self: Sized, + Self::Item: Clone + Eq + Hash,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Duplicates +are detected using hash and equality. Read more
source§

fn unique_by<V, F>(self, f: F) -> UniqueBy<Self, V, F>where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V,

Return an iterator adaptor that filters out elements that have +already been produced once during the iteration. Read more
source§

fn peeking_take_while<F>(&mut self, accept: F) -> PeekingTakeWhile<'_, Self, F>where + Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from this iterator and +takes items while the closure accept returns true. Read more
source§

fn take_while_ref<F>(&mut self, accept: F) -> TakeWhileRef<'_, Self, F>where + Self: Clone, + F: FnMut(&Self::Item) -> bool,

Return an iterator adaptor that borrows from a Clone-able iterator +to only pick off elements while the predicate accept returns true. Read more
source§

fn while_some<A>(self) -> WhileSome<Self>where + Self: Sized + Iterator<Item = Option<A>>,

Return an iterator adaptor that filters Option<A> iterator elements +and produces A. Stops on the first None encountered. Read more
source§

fn tuple_combinations<T>(self) -> TupleCombinations<Self, T>where + Self: Sized + Clone, + Self::Item: Clone, + T: HasCombination<Self>,

Return an iterator adaptor that iterates over the combinations of the +elements from an iterator. Read more
source§

fn combinations(self, k: usize) -> Combinations<Self>where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over the k-length combinations of +the elements from an iterator. Read more
source§

fn combinations_with_replacement( + self, + k: usize +) -> CombinationsWithReplacement<Self>where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates over the k-length combinations of +the elements from an iterator, with replacement. Read more
source§

fn permutations(self, k: usize) -> Permutations<Self>where + Self: Sized, + Self::Item: Clone,

Return an iterator adaptor that iterates over all k-permutations of the +elements from an iterator. Read more
source§

fn powerset(self) -> Powerset<Self>where + Self: Sized, + Self::Item: Clone,

Return an iterator that iterates through the powerset of the elements from an +iterator. Read more
source§

fn pad_using<F>(self, min: usize, f: F) -> PadUsing<Self, F>where + Self: Sized, + F: FnMut(usize) -> Self::Item,

Return an iterator adaptor that pads the sequence to a minimum length of +min by filling missing elements using a closure f. Read more
source§

fn with_position(self) -> WithPosition<Self>where + Self: Sized,

Return an iterator adaptor that wraps each element in a Position to +ease special-case handling of the first or last elements. Read more
source§

fn positions<P>(self, predicate: P) -> Positions<Self, P>where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Return an iterator adaptor that yields the indices of all elements +satisfying a predicate, counted from the start of the iterator. Read more
source§

fn update<F>(self, updater: F) -> Update<Self, F>where + Self: Sized, + F: FnMut(&mut Self::Item),

Return an iterator adaptor that applies a mutating function +to each element before yielding it. Read more
source§

fn next_tuple<T>(&mut self) -> Option<T>where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Advances the iterator and returns the next items grouped in a tuple of +a specific size (up to 12). Read more
source§

fn collect_tuple<T>(self) -> Option<T>where + Self: Sized + Iterator<Item = <T as TupleCollect>::Item>, + T: HomogeneousTuple,

Collects all items from the iterator into a tuple of a specific size +(up to 12). Read more
source§

fn find_position<P>(&mut self, pred: P) -> Option<(usize, Self::Item)>where + P: FnMut(&Self::Item) -> bool,

Find the position and value of the first element satisfying a predicate. Read more
source§

fn find_or_last<P>(self, predicate: P) -> Option<Self::Item>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the last element, if any. Read more
source§

fn find_or_first<P>(self, predicate: P) -> Option<Self::Item>where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Find the value of the first element satisfying a predicate or return the first element, if any. Read more
source§

fn contains<Q>(&mut self, query: &Q) -> boolwhere + Self: Sized, + Self::Item: Borrow<Q>, + Q: PartialEq<Q>,

Returns true if the given item is present in this iterator. Read more
source§

fn all_equal(&mut self) -> boolwhere + Self: Sized, + Self::Item: PartialEq<Self::Item>,

Check whether all elements compare equal. Read more
source§

fn all_unique(&mut self) -> boolwhere + Self: Sized, + Self::Item: Eq + Hash,

Check whether all elements are unique (non equal). Read more
source§

fn dropping(self, n: usize) -> Selfwhere + Self: Sized,

Consume the first n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn dropping_back(self, n: usize) -> Selfwhere + Self: Sized + DoubleEndedIterator,

Consume the last n elements from the iterator eagerly, +and return the same iterator again. Read more
source§

fn foreach<F>(self, f: F)where + F: FnMut(Self::Item), + Self: Sized,

👎Deprecated since 0.8.0: Use .for_each() instead
Run the closure f eagerly on each element of the iterator. Read more
source§

fn concat(self) -> Self::Itemwhere + Self: Sized, + Self::Item: Extend<<Self::Item as IntoIterator>::Item> + IntoIterator + Default,

Combine all an iterator’s elements into one element by using Extend. Read more
source§

fn collect_vec(self) -> Vec<Self::Item, Global>where + Self: Sized,

.collect_vec() is simply a type specialization of Iterator::collect, +for convenience.
source§

fn try_collect<T, U, E>(self) -> Result<U, E>where + Self: Sized + Iterator<Item = Result<T, E>>, + Result<U, E>: FromIterator<Result<T, E>>,

.try_collect() is more convenient way of writing +.collect::<Result<_, _>>() Read more
source§

fn set_from<'a, A, J>(&mut self, from: J) -> usizewhere + A: 'a, + Self: Iterator<Item = &'a mut A>, + J: IntoIterator<Item = A>,

Assign to each reference in self from the from iterator, +stopping at the shortest of the two iterators. Read more
source§

fn join(&mut self, sep: &str) -> Stringwhere + Self::Item: Display,

Combine all iterator elements into one String, separated by sep. Read more
source§

fn format(self, sep: &str) -> Format<'_, Self>where + Self: Sized,

Format all iterator elements, separated by sep. Read more
source§

fn format_with<F>(self, sep: &str, format: F) -> FormatWith<'_, Self, F>where + Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn Display) -> Result<(), Error>) -> Result<(), Error>,

Format all iterator elements, separated by sep. Read more
source§

fn fold_results<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

👎Deprecated since 0.10.0: Use .fold_ok() instead
source§

fn fold_ok<A, E, B, F>(&mut self, start: B, f: F) -> Result<B, E>where + Self: Iterator<Item = Result<A, E>>, + F: FnMut(B, A) -> B,

Fold Result values from an iterator. Read more
source§

fn fold_options<A, B, F>(&mut self, start: B, f: F) -> Option<B>where + Self: Iterator<Item = Option<A>>, + F: FnMut(B, A) -> B,

Fold Option values from an iterator. Read more
source§

fn fold1<F>(self, f: F) -> Option<Self::Item>where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

👎Deprecated since 0.10.2: Use Iterator::reduce instead
Accumulator of the elements in the iterator. Read more
source§

fn tree_fold1<F>(self, f: F) -> Option<Self::Item>where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized,

Accumulate the elements in the iterator in a tree-like manner. Read more
source§

fn fold_while<B, F>(&mut self, init: B, f: F) -> FoldWhile<B>where + Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile<B>,

An iterator method that applies a function, producing a single, final value. Read more
source§

fn sum1<S>(self) -> Option<S>where + Self: Sized, + S: Sum<Self::Item>,

Iterate over the entire iterator and add all the elements. Read more
source§

fn product1<P>(self) -> Option<P>where + Self: Sized, + P: Product<Self::Item>,

Iterate over the entire iterator and multiply all the elements. Read more
source§

fn sorted_unstable(self) -> IntoIter<Self::Item, Global>where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by<F>(self, cmp: F) -> IntoIter<Self::Item, Global>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_unstable_by_key<K, F>(self, f: F) -> IntoIter<Self::Item, Global>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted(self) -> IntoIter<Self::Item, Global>where + Self: Sized, + Self::Item: Ord,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by<F>(self, cmp: F) -> IntoIter<Self::Item, Global>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_key<K, F>(self, f: F) -> IntoIter<Self::Item, Global>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. Read more
source§

fn sorted_by_cached_key<K, F>(self, f: F) -> IntoIter<Self::Item, Global>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Sort all iterator elements into a new iterator in ascending order. The key function is +called exactly once per key. Read more
source§

fn k_smallest(self, k: usize) -> IntoIter<Self::Item, Global>where + Self: Sized, + Self::Item: Ord,

Sort the k smallest elements into a new iterator, in ascending order. Read more
source§

fn partition_map<A, B, F, L, R>(self, predicate: F) -> (A, B)where + Self: Sized, + F: FnMut(Self::Item) -> Either<L, R>, + A: Default + Extend<L>, + B: Default + Extend<R>,

Collect all iterator elements into one of two +partitions. Unlike Iterator::partition, each partition may +have a distinct type. Read more
source§

fn partition_result<A, B, T, E>(self) -> (A, B)where + Self: Iterator<Item = Result<T, E>> + Sized, + A: Default + Extend<T>, + B: Default + Extend<E>,

Partition a sequence of Results into one list of all the Ok elements +and another list of all the Err elements. Read more
source§

fn into_group_map<K, V>(self) -> HashMap<K, Vec<V, Global>, RandomState>where + Self: Iterator<Item = (K, V)> + Sized, + K: Hash + Eq,

Return a HashMap of keys mapped to Vecs of values. Keys and values +are taken from (Key, Value) tuple pairs yielded by the input iterator. Read more
source§

fn into_group_map_by<K, V, F>( + self, + f: F +) -> HashMap<K, Vec<V, Global>, RandomState>where + Self: Iterator<Item = V> + Sized, + K: Hash + Eq, + F: Fn(&V) -> K,

Return an Iterator on a HashMap. Keys mapped to Vecs of values. The key is specified +in the closure. Read more
source§

fn into_grouping_map<K, V>(self) -> GroupingMap<Self>where + Self: Iterator<Item = (K, V)> + Sized, + K: Hash + Eq,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn into_grouping_map_by<K, V, F>( + self, + key_mapper: F +) -> GroupingMap<MapForGrouping<Self, F>>where + Self: Iterator<Item = V> + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K,

Constructs a GroupingMap to be used later with one of the efficient +group-and-fold operations it allows to perform. Read more
source§

fn min_set(self) -> Vec<Self::Item, Global>where + Self: Sized, + Self::Item: Ord,

Return all minimum elements of an iterator. Read more
source§

fn min_set_by<F>(self, compare: F) -> Vec<Self::Item, Global>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn min_set_by_key<K, F>(self, key: F) -> Vec<Self::Item, Global>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set(self) -> Vec<Self::Item, Global>where + Self: Sized, + Self::Item: Ord,

Return all maximum elements of an iterator. Read more
source§

fn max_set_by<F>(self, compare: F) -> Vec<Self::Item, Global>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return all maximum elements of an iterator, as determined by +the specified function. Read more
source§

fn max_set_by_key<K, F>(self, key: F) -> Vec<Self::Item, Global>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return all minimum elements of an iterator, as determined by +the specified function. Read more
source§

fn minmax(self) -> MinMaxResult<Self::Item>where + Self: Sized, + Self::Item: PartialOrd<Self::Item>,

Return the minimum and maximum elements in the iterator. Read more
source§

fn minmax_by_key<K, F>(self, key: F) -> MinMaxResult<Self::Item>where + Self: Sized, + K: PartialOrd<K>, + F: FnMut(&Self::Item) -> K,

Return the minimum and maximum element of an iterator, as determined by +the specified function. Read more
source§

fn minmax_by<F>(self, compare: F) -> MinMaxResult<Self::Item>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the minimum and maximum element of an iterator, as determined by +the specified comparison function. Read more
source§

fn position_max(self) -> Option<usize>where + Self: Sized, + Self::Item: Ord,

Return the position of the maximum element in the iterator. Read more
source§

fn position_max_by_key<K, F>(self, key: F) -> Option<usize>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the maximum element in the iterator, as +determined by the specified function. Read more
source§

fn position_max_by<F>(self, compare: F) -> Option<usize>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the maximum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_min(self) -> Option<usize>where + Self: Sized, + Self::Item: Ord,

Return the position of the minimum element in the iterator. Read more
source§

fn position_min_by_key<K, F>(self, key: F) -> Option<usize>where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K,

Return the position of the minimum element in the iterator, as +determined by the specified function. Read more
source§

fn position_min_by<F>(self, compare: F) -> Option<usize>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the position of the minimum element in the iterator, as +determined by the specified comparison function. Read more
source§

fn position_minmax(self) -> MinMaxResult<usize>where + Self: Sized, + Self::Item: PartialOrd<Self::Item>,

Return the positions of the minimum and maximum elements in +the iterator. Read more
source§

fn position_minmax_by_key<K, F>(self, key: F) -> MinMaxResult<usize>where + Self: Sized, + K: PartialOrd<K>, + F: FnMut(&Self::Item) -> K,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified function. Read more
source§

fn position_minmax_by<F>(self, compare: F) -> MinMaxResult<usize>where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Return the postions of the minimum and maximum elements of an +iterator, as determined by the specified comparison function. Read more
source§

fn exactly_one(self) -> Result<Self::Item, ExactlyOneError<Self>>where + Self: Sized,

If the iterator yields exactly one element, that element will be returned, otherwise +an error will be returned containing an iterator that has the same output as the input +iterator. Read more
source§

fn at_most_one(self) -> Result<Option<Self::Item>, ExactlyOneError<Self>>where + Self: Sized,

If the iterator yields no elements, Ok(None) will be returned. If the iterator yields +exactly one element, that element will be returned, otherwise an error will be returned +containing an iterator that has the same output as the input iterator. Read more
source§

fn multipeek(self) -> MultiPeek<Self>where + Self: Sized,

An iterator adaptor that allows the user to peek at multiple .next() +values without advancing the base iterator. Read more
source§

fn counts(self) -> HashMap<Self::Item, usize, RandomState>where + Self: Sized, + Self::Item: Eq + Hash,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears. Read more
source§

fn counts_by<K, F>(self, f: F) -> HashMap<K, usize, RandomState>where + Self: Sized, + K: Eq + Hash, + F: FnMut(Self::Item) -> K,

Collect the items in this iterator and return a HashMap which +contains each item that appears in the iterator and the number +of times it appears, +determining identity using a keying function. Read more
source§

fn multiunzip<FromI>(self) -> FromIwhere + Self: Sized + MultiUnzip<FromI>,

Converts an iterator of tuples into a tuple of containers. Read more
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/entries/trait.Entry.html b/resources/sitehome_model/srcdocserver/docserver/defs/entries/trait.Entry.html new file mode 100644 index 0000000..8ed4e61 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/entries/trait.Entry.html @@ -0,0 +1,31 @@ +Entry in docserver::defs::entries - Rust
+ + + +

Trait docserver::defs::entries::Entry

source ·
pub trait Entry: Sized {
+    // Required method
+    fn from_line(line: &str) -> Result<Self, ParseIntError>;
+}
Expand description

A Trait to represent an entry of data from an +/etc/{passwd,group,shadow} file.

+

Required Methods§

Implementors§

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/filestore/fn.is_hidden.html b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/fn.is_hidden.html new file mode 100644 index 0000000..d1fb221 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/fn.is_hidden.html @@ -0,0 +1,26 @@ +is_hidden in docserver::defs::filestore - Rust
+ + + +
fn is_hidden(entry: &DirEntry) -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/filestore/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/index.html new file mode 100644 index 0000000..12ec849 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/index.html @@ -0,0 +1,26 @@ +docserver::defs::filestore - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/filestore/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/sidebar-items.js new file mode 100644 index 0000000..4eee49c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["is_hidden"],"struct":["FileStore"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/filestore/struct.FileStore.html b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/struct.FileStore.html new file mode 100644 index 0000000..dbf8027 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/filestore/struct.FileStore.html @@ -0,0 +1,71 @@ +FileStore in docserver::defs::filestore - Rust
+ + + +
pub struct FileStore {
+    pub sess_path: String,
+    pub ses_file: String,
+}

Fields§

§sess_path: String§ses_file: String

Implementations§

source§

impl FileStore

source

pub fn check_paths(&self) -> Result

Create a new instance of FilesStore

+
source

pub fn get_path(&self, id: &str) -> Result<String>

source

pub fn get_session_id_path(&self, id_filename: &str) -> Result<String>

source

pub async fn load_session_file(&self, id: &str) -> Result<Option<Session>>

As session Id from async_session comes in base64 it will be not valid for OS filename +bin2hex pass id to hex as bytes and from there to string or viceversa

+
source

pub async fn cleanup(&self) -> Result

source

pub async fn count(&self) -> usize

Trait Implementations§

source§

impl Clone for FileStore

source§

fn clone(&self) -> FileStore

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FileStore

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl SessionStore for FileStore

source§

fn load_session<'life0, 'async_trait>( + &'life0 self, + cookie_value: String +) -> Pin<Box<dyn Future<Output = Result<Option<Session>>> + Send + 'async_trait>>where + Self: 'async_trait, + 'life0: 'async_trait,

Get a session from the storage backend. Read more
source§

fn store_session<'life0, 'async_trait>( + &'life0 self, + session: Session +) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>where + Self: 'async_trait, + 'life0: 'async_trait,

Store a session on the storage backend. Read more
source§

fn destroy_session<'life0, 'async_trait>( + &'life0 self, + session: Session +) -> Pin<Box<dyn Future<Output = Result> + Send + 'async_trait>>where + Self: 'async_trait, + 'life0: 'async_trait,

Remove a session from the session store
source§

fn clear_store<'life0, 'async_trait>( + &'life0 self +) -> Pin<Box<dyn Future<Output = Result> + Send + 'async_trait>>where + Self: 'async_trait, + 'life0: 'async_trait,

Empties the entire store, destroying all sessions

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/index.html new file mode 100644 index 0000000..219fdd0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/index.html @@ -0,0 +1,26 @@ +docserver::defs - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/local/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/local/index.html new file mode 100644 index 0000000..09f1ebf --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/local/index.html @@ -0,0 +1,26 @@ +docserver::defs::local - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/local/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/local/sidebar-items.js new file mode 100644 index 0000000..f00cff5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/local/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Local"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/local/struct.Local.html b/resources/sitehome_model/srcdocserver/docserver/defs/local/struct.Local.html new file mode 100644 index 0000000..1f553c4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/local/struct.Local.html @@ -0,0 +1,56 @@ +Local in docserver::defs::local - Rust
+ + + +

Struct docserver::defs::local::Local

source ·
pub struct Local {
+    pub id: String,
+    pub itms: HashMap<String, String>,
+}

Fields§

§id: String§itms: HashMap<String, String>

Implementations§

source§

impl Local

source

pub fn new(id: String, itms: HashMap<String, String>) -> Self

source

pub fn itm(&self, key: &str, dflt: &str) -> String

source

pub fn get_lang( + locales: &HashMap<String, Local>, + key: &str, + dflt: &str +) -> Local

Trait Implementations§

source§

impl Clone for Local

source§

fn clone(&self) -> Local

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Local

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Local

source§

fn default() -> Local

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for Local

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for Local

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl RefUnwindSafe for Local

§

impl Send for Local

§

impl Sync for Local

§

impl Unpin for Local

§

impl UnwindSafe for Local

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/mailer/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/index.html new file mode 100644 index 0000000..601c7ad --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/index.html @@ -0,0 +1,26 @@ +docserver::defs::mailer - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/mailer/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/sidebar-items.js new file mode 100644 index 0000000..2a8aa44 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["MailMessage"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/mailer/struct.MailMessage.html b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/struct.MailMessage.html new file mode 100644 index 0000000..d676c46 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/mailer/struct.MailMessage.html @@ -0,0 +1,65 @@ +MailMessage in docserver::defs::mailer - Rust
+ + + +
pub struct MailMessage {
+    pub from: Mailbox,
+    pub to: Mailbox,
+    pub reply_to: Mailbox,
+}

Fields§

§from: Mailbox§to: Mailbox§reply_to: Mailbox

Implementations§

source§

impl MailMessage

source

pub fn new(from: &str, to: &str, reply: &str) -> Result<Self>

source

pub fn check(app_dbs: &AppDBs) -> String

source

pub async fn send_message( + &self, + subject: &str, + body: &str, + app_dbs: &AppDBs +) -> Result<()>

source

pub async fn send_html_message( + &self, + subject: &str, + body: &str, + html_body: &str, + app_dbs: &AppDBs +) -> Result<()>

source

pub async fn mail_message( + &self, + message: Message, + app_dbs: &AppDBs +) -> Result<()>

source

pub fn get_credentials(token: &str, paseto_config: &ConfigPaSeToken) -> String

Trait Implementations§

source§

impl Clone for MailMessage

source§

fn clone(&self) -> MailMessage

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for MailMessage

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/index.html new file mode 100644 index 0000000..5f3fb0c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/index.html @@ -0,0 +1,26 @@ +docserver::defs::req_handler - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/sidebar-items.js new file mode 100644 index 0000000..3d29b0d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ReqHandler"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/struct.ReqHandler.html b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/struct.ReqHandler.html new file mode 100644 index 0000000..fad146b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_handler/struct.ReqHandler.html @@ -0,0 +1,73 @@ +ReqHandler in docserver::defs::req_handler - Rust
+ + + +
pub struct ReqHandler<'a> {
+    pub req_header: ReqHeaderMap,
+    pub app_dbs: &'a AppDBs,
+    pub lang: Local,
+    pub uri: &'a Uri,
+    pub notify_data: UserNotifyData,
+    pub auth_state: AuthState,
+    pub req_name: String,
+    pub context: Context,
+}

Fields§

§req_header: ReqHeaderMap§app_dbs: &'a AppDBs§lang: Local§uri: &'a Uri§notify_data: UserNotifyData§auth_state: AuthState§req_name: String§context: Context

Implementations§

source§

impl<'a> ReqHandler<'a>

source

pub fn new( + req_header: ReqHeaderMap, + app_dbs: &'a AppDBs, + uri: &'a Uri, + auth_state: &'a AuthState, + req_name: &str +) -> Self

source

pub fn load_md_template_file( + &mut self, + tpl_path: &str, + tpl_file: &str, + in_html: bool, + dflt_content: &str +)

Find a md template file under templates_path/md/server.name/req_path or under templates_path/md/req_path +render if found path or return dflt_content

+
source

pub fn template_file_dirpath(&self, tpl_file: &str) -> Result<String>

source

pub fn prepare_head_response(&self, res_header: &mut HeaderMap)

source

pub fn prepare_head_json_response(&self, res_header: &mut HeaderMap)

source

pub fn prepare_response(&mut self)

source

pub fn prepare_render(&mut self)

source

pub fn load_template_file( + &mut self, + tpl_file: &str, + dflt_content: &str +) -> String

source

pub fn render_template( + &mut self, + template_file: &str, + dflt_content: &str +) -> String

source

pub fn check_request_help(&mut self) -> Option<String>

source

pub fn check_request_invalid(&mut self, name: &str) -> Option<String>

source

pub fn check_request_auth(&mut self, _url_pathname: &str) -> Option<String>

source

pub fn bad_request(&mut self, msg: &str) -> String

source

pub fn response_tpl_msg(&mut self, tpl: &str, msg: &str) -> String

source

pub fn auth_role(&self) -> UserRole

source

pub fn get_config_lang(&self) -> Local

source

pub fn get_lang(&self, key: &str) -> Local

source

pub fn new_token(&self) -> String

source

pub fn has_auth_or_new(&self) -> String

source

pub fn otp_make(&self, code: &str, defs: &str) -> Result<TOTP>

source

pub fn otp_generate(&self) -> Result<TOTP>

source

pub fn otp_check(&self, code: &str, token: &str, defs: &str) -> Result<bool>

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for ReqHandler<'a>

§

impl<'a> Send for ReqHandler<'a>

§

impl<'a> Sync for ReqHandler<'a>

§

impl<'a> Unpin for ReqHandler<'a>

§

impl<'a> !UnwindSafe for ReqHandler<'a>

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/index.html new file mode 100644 index 0000000..7b40cb7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/index.html @@ -0,0 +1,26 @@ +docserver::defs::req_headermap - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/sidebar-items.js new file mode 100644 index 0000000..0d5ae76 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ReqHeaderMap"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/struct.ReqHeaderMap.html b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/struct.ReqHeaderMap.html new file mode 100644 index 0000000..72193c7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/req_headermap/struct.ReqHeaderMap.html @@ -0,0 +1,49 @@ +ReqHeaderMap in docserver::defs::req_headermap - Rust
+ + + +
pub struct ReqHeaderMap {
+    pub header: HeaderMap,
+    pub req_path: Vec<String>,
+}

Fields§

§header: HeaderMap§req_path: Vec<String>

Implementations§

source§

impl ReqHeaderMap

source

pub fn new(header: HeaderMap, request_path: &str) -> Self

source

pub fn req_end_path(req_path: &str) -> String

source

pub fn req_user(&self, app_dbs: &AppDBs) -> (String, UserNotifyData)

source

pub fn req_path_clean(&self) -> Vec<String>

source

pub fn req_path_contains(&self, value: &str) -> Vec<String>

source

pub fn auth(&self) -> String

source

pub fn referer(&self) -> String

source

pub fn internal(&self) -> String

source

pub fn is_browser(&self) -> bool

source

pub fn is_curl(&self) -> bool

source

pub fn is_wget(&self) -> bool

source

pub fn response_user_agent_html(&self) -> bool

source

pub fn agent(&self) -> String

source

pub fn lang(&self, config: &ServerConfig) -> String

source

fn maybe_x_forwarded_for(&self) -> Option<IpAddr>

Tries to parse the x-real-ip header

+
source

fn maybe_x_real_ip(&self) -> Option<IpAddr>

Tries to parse the x-real-ip header

+
source

fn maybe_forwarded(&self) -> Option<IpAddr>

Tries to parse forwarded headers

+
source

pub fn ip(&self, addr: &SocketAddr) -> String

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/session/enum.SessionStoreDB.html b/resources/sitehome_model/srcdocserver/docserver/defs/session/enum.SessionStoreDB.html new file mode 100644 index 0000000..f1c95ee --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/session/enum.SessionStoreDB.html @@ -0,0 +1,56 @@ +SessionStoreDB in docserver::defs::session - Rust
+ + + +
pub enum SessionStoreDB {
+    Files(FileStore),
+    SqlLite(SqliteSessionStore),
+    Memory(MemoryStore),
+    None,
+}

Variants§

§

Files(FileStore)

§

SqlLite(SqliteSessionStore)

§

Memory(MemoryStore)

§

None

Implementations§

source§

impl SessionStoreDB

In SessionStoreDB creation match the corresponding store to return it as item argument

+
source

pub fn connect_file_store(store: FileStore) -> Self

source

pub fn connect_memory_store() -> Self

source

pub fn connect_sqlite_store(store: SqliteSessionStore) -> Self

source

pub async fn store_session_data( + id: &str, + user_data: &str, + expire: u64, + app_dbs: &AppDBs +) -> String

source

pub async fn update_session_data(session: Session, app_dbs: &AppDBs) -> String

source

pub async fn cleanup_data(app_dbs: &AppDBs)

Trait Implementations§

source§

impl Clone for SessionStoreDB

source§

fn clone(&self) -> SessionStoreDB

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/session/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/session/index.html new file mode 100644 index 0000000..afd96aa --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/session/index.html @@ -0,0 +1,26 @@ +docserver::defs::session - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/session/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/session/sidebar-items.js new file mode 100644 index 0000000..282f771 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/session/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["SessionStoreDB"],"struct":["AuthState"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/session/struct.AuthState.html b/resources/sitehome_model/srcdocserver/docserver/defs/session/struct.AuthState.html new file mode 100644 index 0000000..2aafb28 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/session/struct.AuthState.html @@ -0,0 +1,49 @@ +AuthState in docserver::defs::session - Rust
+ + + +
pub struct AuthState {
+    pub session: Option<Session>,
+    pub user: Option<User>,
+}

Fields§

§session: Option<Session>§user: Option<User>

Implementations§

source§

impl AuthState

source

pub fn id(&self) -> String

source

pub fn ses_expired(&self) -> bool

source

pub fn ses_destroyed(&self) -> bool

source

pub fn destroy(&self) -> bool

source

pub fn ses_validate(&self) -> bool

source

pub fn user_data(&self) -> Vec<String>

source

pub fn user_id(&self) -> String

source

pub fn user_name(&self) -> String

source

pub fn user_email(&self) -> String

source

pub fn user_roles(&self) -> String

source

pub fn user_items(&self) -> String

source

pub fn is_admin(&self) -> bool

source

pub fn user_status(&self) -> UserStatus

source

pub async fn expire_in(&mut self, expire_secs: u64, app_dbs: &AppDBs) -> Self

source

pub async fn from_data(&self, app_dbs: &AppDBs) -> Self

Trait Implementations§

source§

impl Clone for AuthState

source§

fn clone(&self) -> AuthState

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for AuthState

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for AuthState

source§

fn default() -> AuthState

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/sidebar-items.js new file mode 100644 index 0000000..a7f3646 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["ACCEPT_LANGUAGE","AUTHORIZATION","BEARER","CLAIM_APP_KEY","CLAIM_AUTH","CLAIM_UID","FILE_SCHEME","HELP_EXT","HELP_URI","LOGS_SESSION_COOKIE_NAME","LOG_REQ","REFERER","SESSION_ID","SID_REQUESTS_FILE","SID_SETTINGS_FILE","SID_TRACE_FILE","TEMPLATE_EXT","TOKEN_AUTH_VALUE","TOKEN_KEY_VALUE","USER_AGENT","USER_DATA","X_FORWARDED_FOR","X_INTERNAL","X_REAL_IP"],"mod":["appdbs","cli","config","entries","filestore","local","mailer","req_handler","req_headermap","session","totp_algorithm","totp_mode","tracedata","user","user_action","user_id","user_role","userdata","usernotifydata","userstatus","userstore"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/enum.TotpAlgorithm.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/enum.TotpAlgorithm.html new file mode 100644 index 0000000..1f0262e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/enum.TotpAlgorithm.html @@ -0,0 +1,60 @@ +TotpAlgorithm in docserver::defs::totp_algorithm - Rust
+ + + +
pub enum TotpAlgorithm {
+    Sha1,
+    Sha256,
+    Sha512,
+}

Variants§

§

Sha1

§

Sha256

§

Sha512

Implementations§

Trait Implementations§

source§

impl Clone for TotpAlgorithm

source§

fn clone(&self) -> TotpAlgorithm

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TotpAlgorithm

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TotpAlgorithm

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TotpAlgorithm

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for TotpAlgorithm

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq<TotpAlgorithm> for TotpAlgorithm

source§

fn eq(&self, other: &TotpAlgorithm) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for TotpAlgorithm

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for TotpAlgorithm

source§

impl StructuralEq for TotpAlgorithm

source§

impl StructuralPartialEq for TotpAlgorithm

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/fn.deserialize_totp_algorithm.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/fn.deserialize_totp_algorithm.html new file mode 100644 index 0000000..80e5dc0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/fn.deserialize_totp_algorithm.html @@ -0,0 +1,29 @@ +deserialize_totp_algorithm in docserver::defs::totp_algorithm - Rust
+ + + +
pub fn deserialize_totp_algorithm<'de, D>(
+    deserializer: D
+) -> Result<TotpAlgorithm, D::Error>where
+    D: Deserializer<'de>,
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/index.html new file mode 100644 index 0000000..46b3f16 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/index.html @@ -0,0 +1,26 @@ +docserver::defs::totp_algorithm - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/sidebar-items.js new file mode 100644 index 0000000..613cc9b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_algorithm/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TotpAlgorithm"],"fn":["deserialize_totp_algorithm"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/enum.TotpMode.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/enum.TotpMode.html new file mode 100644 index 0000000..3e231d7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/enum.TotpMode.html @@ -0,0 +1,60 @@ +TotpMode in docserver::defs::totp_mode - Rust
+ + + +
pub enum TotpMode {
+    Mandatory,
+    Optional,
+    No,
+}

Variants§

§

Mandatory

§

Optional

§

No

Implementations§

Trait Implementations§

source§

impl Clone for TotpMode

source§

fn clone(&self) -> TotpMode

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TotpMode

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TotpMode

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TotpMode

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for TotpMode

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq<TotpMode> for TotpMode

source§

fn eq(&self, other: &TotpMode) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for TotpMode

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for TotpMode

source§

impl StructuralEq for TotpMode

source§

impl StructuralPartialEq for TotpMode

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/fn.deserialize_totp_mode.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/fn.deserialize_totp_mode.html new file mode 100644 index 0000000..6343f51 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/fn.deserialize_totp_mode.html @@ -0,0 +1,29 @@ +deserialize_totp_mode in docserver::defs::totp_mode - Rust
+ + + +
pub fn deserialize_totp_mode<'de, D>(
+    deserializer: D
+) -> Result<TotpMode, D::Error>where
+    D: Deserializer<'de>,
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/index.html new file mode 100644 index 0000000..96d229c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/index.html @@ -0,0 +1,26 @@ +docserver::defs::totp_mode - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/sidebar-items.js new file mode 100644 index 0000000..b452dc1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/totp_mode/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TotpMode"],"fn":["deserialize_totp_mode"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_empty.html b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_empty.html new file mode 100644 index 0000000..a645c24 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_empty.html @@ -0,0 +1,26 @@ +default_empty in docserver::defs::tracedata - Rust
+ + + +
fn default_empty() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_tracedata_items.html b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_tracedata_items.html new file mode 100644 index 0000000..8e93526 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/fn.default_tracedata_items.html @@ -0,0 +1,26 @@ +default_tracedata_items in docserver::defs::tracedata - Rust
+ + + +
fn default_tracedata_items() -> Vec<TraceContent>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/index.html new file mode 100644 index 0000000..23303c0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/index.html @@ -0,0 +1,26 @@ +docserver::defs::tracedata - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/sidebar-items.js new file mode 100644 index 0000000..d042a37 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["default_empty","default_tracedata_items"],"struct":["TraceContent","TraceData"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceContent.html b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceContent.html new file mode 100644 index 0000000..8a14661 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceContent.html @@ -0,0 +1,58 @@ +TraceContent in docserver::defs::tracedata - Rust
+ + + +
pub struct TraceContent {
+    pub when: String,
+    pub sid: String,
+    pub origin: String,
+    pub trigger: String,
+    pub id: String,
+    pub info: String,
+    pub context: String,
+    pub role: String,
+}

Fields§

§when: String§sid: String§origin: String§trigger: String§id: String§info: String§context: String§role: String

Implementations§

Trait Implementations§

source§

impl Clone for TraceContent

source§

fn clone(&self) -> TraceContent

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TraceContent

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TraceContent

source§

fn default() -> TraceContent

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TraceContent

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for TraceContent

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceData.html b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceData.html new file mode 100644 index 0000000..b050317 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/tracedata/struct.TraceData.html @@ -0,0 +1,53 @@ +TraceData in docserver::defs::tracedata - Rust
+ + + +
pub struct TraceData {
+    pub server: String,
+    pub timestamp: String,
+    pub contents: Vec<TraceContent>,
+}

Fields§

§server: String§timestamp: String§contents: Vec<TraceContent>

Implementations§

Trait Implementations§

source§

impl Clone for TraceData

source§

fn clone(&self) -> TraceData

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TraceData

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TraceData

source§

fn default() -> TraceData

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for TraceData

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for TraceData

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user/constant.DISPLAY_SEPARATOR.html b/resources/sitehome_model/srcdocserver/docserver/defs/user/constant.DISPLAY_SEPARATOR.html new file mode 100644 index 0000000..4bb254a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user/constant.DISPLAY_SEPARATOR.html @@ -0,0 +1,26 @@ +DISPLAY_SEPARATOR in docserver::defs::user - Rust
+ + + +
const DISPLAY_SEPARATOR: &str = "=";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user/fn.default_user_status.html b/resources/sitehome_model/srcdocserver/docserver/defs/user/fn.default_user_status.html new file mode 100644 index 0000000..c709143 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user/fn.default_user_status.html @@ -0,0 +1,26 @@ +default_user_status in docserver::defs::user - Rust
+ + + +
fn default_user_status() -> UserStatus
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/user/index.html new file mode 100644 index 0000000..1c175aa --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user/index.html @@ -0,0 +1,26 @@ +docserver::defs::user - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/user/sidebar-items.js new file mode 100644 index 0000000..c7155ae --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DISPLAY_SEPARATOR"],"fn":["default_user_status"],"struct":["User"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user/struct.User.html b/resources/sitehome_model/srcdocserver/docserver/defs/user/struct.User.html new file mode 100644 index 0000000..37daa5f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user/struct.User.html @@ -0,0 +1,82 @@ +User in docserver::defs::user - Rust
+ + + +

Struct docserver::defs::user::User

source ·
pub struct User {
Show 17 fields + pub id: i64, + pub name: String, + pub fullname: String, + pub email: String, + pub description: String, + pub password: String, + pub otp_enabled: bool, + pub otp_verified: bool, + pub otp_base32: String, + pub otp_auth_url: String, + pub otp_defs: String, + pub roles: String, + pub created: String, + pub lastaccess: String, + pub status: UserStatus, + pub items: String, + pub isadmin: bool, +
}

Fields§

§id: i64§name: String§fullname: String§email: String§description: String§password: String§otp_enabled: bool§otp_verified: bool§otp_base32: String§otp_auth_url: String§otp_defs: String§roles: String§created: String§lastaccess: String§status: UserStatus§items: String§isadmin: bool

Implementations§

source§

impl User

source

pub async fn add(self, store: &UserStore) -> Result<i64>

source

pub async fn select( + field: &str, + value: &str, + human: bool, + store: &UserStore +) -> Result<Self>

source

pub async fn delete(id: i64, store: &UserStore) -> Result<bool>

source

pub async fn update(self, store: &UserStore) -> Result<bool>

source

pub fn show(&self, sep: &str)

source

pub async fn list( + store: &UserStore, + human: bool, + show: bool, + sep: &str +) -> Result<Vec<User>>

source

pub async fn count(store: &UserStore) -> Result<i64>

source

fn line_format(self) -> String

source

pub fn hash_items(items: &str) -> HashMap<String, String>

source

pub fn items(&self) -> HashMap<String, String>

source

pub fn json_items(items: HashMap<String, String>) -> String

source

pub fn from_data(&mut self, user_data: UserData)

source

pub fn disable_totp(&mut self)

source

pub fn from_user(&mut self, new_user: User)

source

pub fn session_data(&self) -> String

source

pub fn estimate_password(word: &str) -> String

source

pub fn password_score(word: &str) -> u8

Trait Implementations§

source§

impl Clone for User

source§

fn clone(&self) -> User

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for User

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for User

source§

fn default() -> User

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for User

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for User

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Entry for User

source§

impl PartialEq<User> for User

source§

fn eq(&self, other: &User) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<User> for User

source§

fn partial_cmp(&self, other: &User) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Serialize for User

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for User

Auto Trait Implementations§

§

impl RefUnwindSafe for User

§

impl Send for User

§

impl Sync for User

§

impl Unpin for User

§

impl UnwindSafe for User

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_action/enum.UserAction.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/enum.UserAction.html new file mode 100644 index 0000000..567c318 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/enum.UserAction.html @@ -0,0 +1,55 @@ +UserAction in docserver::defs::user_action - Rust
+ + + +
pub enum UserAction {
+    Access,
+    Log(String),
+    Request(String),
+    View(String),
+    List(String),
+    Profile(String),
+    Other,
+}

Variants§

§

Access

§

Log(String)

§

Request(String)

§

View(String)

§

List(String)

§

Profile(String)

§

Other

Implementations§

source§

impl UserAction

source

pub fn from_str(value: &str, info: String) -> UserAction

source

pub fn info(&self) -> String

Trait Implementations§

source§

impl Clone for UserAction

source§

fn clone(&self) -> UserAction

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for UserAction

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl Display for UserAction

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_action/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/index.html new file mode 100644 index 0000000..f4203cf --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/index.html @@ -0,0 +1,26 @@ +docserver::defs::user_action - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_action/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/sidebar-items.js new file mode 100644 index 0000000..9d27f49 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_action/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["UserAction"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_id/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/index.html new file mode 100644 index 0000000..93d6f59 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/index.html @@ -0,0 +1,26 @@ +docserver::defs::user_id - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_id/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/sidebar-items.js new file mode 100644 index 0000000..93c50c5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["UserId"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_id/struct.UserId.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/struct.UserId.html new file mode 100644 index 0000000..72010e3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_id/struct.UserId.html @@ -0,0 +1,68 @@ +UserId in docserver::defs::user_id - Rust
+ + + +

Struct docserver::defs::user_id::UserId

source ·
pub struct UserId(Uuid);

Tuple Fields§

§0: Uuid

Implementations§

source§

impl UserId

source

pub fn new() -> Self

source

pub fn from(data: &str) -> Option<Self>

source§

impl UserId

source

pub fn log_user_id_action( + &self, + action: UserAction, + sessions_config: &SessionsConfig +) -> Result<()>

Log user actions to config.user_store_access|reqs_store_file/user_id/config.user_store_access path +Add a line with timestamp +It also get ReqHeaderMap to add more data ?

+
source

fn id_path(&self, file: &str, sessions_config: &SessionsConfig) -> String

source

fn write_data(&self, file_path: &str, data: &str, overwrite: bool) -> Result<()>

source

pub fn sid_settings_path(&self, sessions_config: &SessionsConfig) -> String

source

pub fn sid_settings_content(&self, sessions_config: &SessionsConfig) -> String

source

pub fn save_trace_data( + &self, + trace_data: TraceData, + sessions_config: &SessionsConfig +) -> Result<()>

source

pub fn save_sid_request( + &self, + data: &str, + sessions_config: &SessionsConfig +) -> Result<()>

source

pub fn read_sid_requests( + &self, + sessions_config: &SessionsConfig +) -> Result<Vec<String>, Box<dyn Error>>

Trait Implementations§

source§

impl Clone for UserId

source§

fn clone(&self) -> UserId

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'de> Deserialize<'de> for UserId

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for UserId

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Serialize for UserId

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Copy for UserId

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_role/enum.UserRole.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/enum.UserRole.html new file mode 100644 index 0000000..ffb5db5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/enum.UserRole.html @@ -0,0 +1,61 @@ +UserRole in docserver::defs::user_role - Rust
+ + + +
pub enum UserRole {
+    SuperUser,
+    Developer,
+    User,
+    Anonymous,
+}

Variants§

§

SuperUser

§

Developer

§

User

§

Anonymous

Implementations§

Trait Implementations§

source§

impl Clone for UserRole

source§

fn clone(&self) -> UserRole

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserRole

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserRole

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserRole

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for UserRole

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq<UserRole> for UserRole

source§

fn eq(&self, other: &UserRole) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Serialize for UserRole

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl Eq for UserRole

source§

impl StructuralEq for UserRole

source§

impl StructuralPartialEq for UserRole

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_role/fn.deserialize_user_role.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/fn.deserialize_user_role.html new file mode 100644 index 0000000..ccc038b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/fn.deserialize_user_role.html @@ -0,0 +1,29 @@ +deserialize_user_role in docserver::defs::user_role - Rust
+ + + +
pub fn deserialize_user_role<'de, D>(
+    deserializer: D
+) -> Result<UserRole, D::Error>where
+    D: Deserializer<'de>,
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_role/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/index.html new file mode 100644 index 0000000..2fe413b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/index.html @@ -0,0 +1,26 @@ +docserver::defs::user_role - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/user_role/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/sidebar-items.js new file mode 100644 index 0000000..cbe9dc8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/user_role/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["UserRole"],"fn":["deserialize_user_role"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_empty.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_empty.html new file mode 100644 index 0000000..3a8c86d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_empty.html @@ -0,0 +1,26 @@ +default_empty in docserver::defs::userdata - Rust
+ + + +
fn default_empty() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_expire.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_expire.html new file mode 100644 index 0000000..b3e1133 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_expire.html @@ -0,0 +1,26 @@ +default_expire in docserver::defs::userdata - Rust
+ + + +
fn default_expire() -> u64
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_isadmin.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_isadmin.html new file mode 100644 index 0000000..abc0630 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_isadmin.html @@ -0,0 +1,26 @@ +default_isadmin in docserver::defs::userdata - Rust
+ + + +
fn default_isadmin() -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_items.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_items.html new file mode 100644 index 0000000..f91e3f3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_items.html @@ -0,0 +1,26 @@ +default_items in docserver::defs::userdata - Rust
+ + + +
fn default_items() -> HashMap<String, String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_otp_empty.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_otp_empty.html new file mode 100644 index 0000000..c1fcdb1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_otp_empty.html @@ -0,0 +1,26 @@ +default_otp_empty in docserver::defs::userdata - Rust
+ + + +
fn default_otp_empty() -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_send_email.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_send_email.html new file mode 100644 index 0000000..09aa8c6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/fn.default_send_email.html @@ -0,0 +1,26 @@ +default_send_email in docserver::defs::userdata - Rust
+ + + +
fn default_send_email() -> bool
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/index.html new file mode 100644 index 0000000..130fee4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/index.html @@ -0,0 +1,26 @@ +docserver::defs::userdata - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/sidebar-items.js new file mode 100644 index 0000000..c2972e8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["default_empty","default_expire","default_isadmin","default_items","default_otp_empty","default_send_email"],"struct":["UserData","UserInvitation","UserItem","UserLogin"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserData.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserData.html new file mode 100644 index 0000000..7cb8baa --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserData.html @@ -0,0 +1,61 @@ +UserData in docserver::defs::userdata - Rust
+ + + +
pub struct UserData {
+    pub id: String,
+    pub name: String,
+    pub fullname: String,
+    pub description: String,
+    pub email: String,
+    pub password: String,
+    pub otp_code: String,
+    pub otp_url: String,
+    pub otp_auth: String,
+    pub roles: String,
+    pub items: HashMap<String, String>,
+}

Fields§

§id: String§name: String§fullname: String§description: String§email: String§password: String§otp_code: String§otp_url: String§otp_auth: String§roles: String§items: HashMap<String, String>

Trait Implementations§

source§

impl Clone for UserData

source§

fn clone(&self) -> UserData

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserData

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserData

source§

fn default() -> UserData

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserData

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for UserData

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserInvitation.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserInvitation.html new file mode 100644 index 0000000..a7d3fdb --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserInvitation.html @@ -0,0 +1,55 @@ +UserInvitation in docserver::defs::userdata - Rust
+ + + +
pub struct UserInvitation {
+    pub email: String,
+    pub roles: String,
+    pub expire: u64,
+    pub send_email: bool,
+    pub isadmin: bool,
+}

Fields§

§email: String§roles: String§expire: u64§send_email: bool§isadmin: bool

Trait Implementations§

source§

impl Clone for UserInvitation

source§

fn clone(&self) -> UserInvitation

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserInvitation

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserInvitation

source§

fn default() -> UserInvitation

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserInvitation

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for UserInvitation

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserItem.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserItem.html new file mode 100644 index 0000000..05faafd --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserItem.html @@ -0,0 +1,52 @@ +UserItem in docserver::defs::userdata - Rust
+ + + +
pub struct UserItem {
+    pub name: String,
+    pub value: String,
+}

Fields§

§name: String§value: String

Trait Implementations§

source§

impl Clone for UserItem

source§

fn clone(&self) -> UserItem

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserItem

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserItem

source§

fn default() -> UserItem

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserItem

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for UserItem

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserLogin.html b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserLogin.html new file mode 100644 index 0000000..920ffd7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userdata/struct.UserLogin.html @@ -0,0 +1,53 @@ +UserLogin in docserver::defs::userdata - Rust
+ + + +
pub struct UserLogin {
+    pub name: String,
+    pub password: String,
+    pub otp_auth: String,
+}

Fields§

§name: String§password: String§otp_auth: String

Trait Implementations§

source§

impl Clone for UserLogin

source§

fn clone(&self) -> UserLogin

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserLogin

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserLogin

source§

fn default() -> UserLogin

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserLogin

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Serialize for UserLogin

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/index.html new file mode 100644 index 0000000..204ea02 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/index.html @@ -0,0 +1,26 @@ +docserver::defs::usernotifydata - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/sidebar-items.js new file mode 100644 index 0000000..87b0336 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["UserNotifyData"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/struct.UserNotifyData.html b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/struct.UserNotifyData.html new file mode 100644 index 0000000..cb36286 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/usernotifydata/struct.UserNotifyData.html @@ -0,0 +1,55 @@ +UserNotifyData in docserver::defs::usernotifydata - Rust
+ + + +
pub struct UserNotifyData {
+    pub key: String,
+    pub id: String,
+    pub auth: String,
+}

Fields§

§key: String§id: String§auth: String

Implementations§

source§

impl UserNotifyData

source

pub fn data_claim(&self, _config: &Config) -> HashMap<String, String>

source

pub fn token( + &self, + server_config: &Config, + paseto_config: &ConfigPaSeToken, + expire: bool +) -> String

source

pub fn from_token( + token: &str, + paseto_config: &ConfigPaSeToken +) -> (String, Self)

Trait Implementations§

source§

impl Debug for UserNotifyData

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserNotifyData

source§

fn default() -> UserNotifyData

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/enum.UserStatus.html b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/enum.UserStatus.html new file mode 100644 index 0000000..db3866b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/enum.UserStatus.html @@ -0,0 +1,60 @@ +UserStatus in docserver::defs::userstatus - Rust
+ + + +
pub enum UserStatus {
+    Created,
+    Active,
+    Pending,
+    Lock,
+    Unknown,
+}

Variants§

§

Created

§

Active

§

Pending

§

Lock

§

Unknown

Implementations§

source§

impl UserStatus

source

pub fn from_str(status: &str) -> Self

Trait Implementations§

source§

impl Clone for UserStatus

source§

fn clone(&self) -> UserStatus

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for UserStatus

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for UserStatus

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de> Deserialize<'de> for UserStatus

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl Display for UserStatus

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl PartialEq<UserStatus> for UserStatus

source§

fn eq(&self, other: &UserStatus) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<UserStatus> for UserStatus

source§

fn partial_cmp(&self, other: &UserStatus) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Serialize for UserStatus

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl StructuralPartialEq for UserStatus

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

impl<T> DeserializeOwned for Twhere + T: for<'de> Deserialize<'de>,

§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/fn.deserialize_user_status.html b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/fn.deserialize_user_status.html new file mode 100644 index 0000000..c763392 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/fn.deserialize_user_status.html @@ -0,0 +1,29 @@ +deserialize_user_status in docserver::defs::userstatus - Rust
+ + + +
pub fn deserialize_user_status<'de, D>(
+    deserializer: D
+) -> Result<UserStatus, D::Error>where
+    D: Deserializer<'de>,
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/index.html new file mode 100644 index 0000000..1dbf27f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/index.html @@ -0,0 +1,26 @@ +docserver::defs::userstatus - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/sidebar-items.js new file mode 100644 index 0000000..771cc23 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstatus/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["UserStatus"],"fn":["deserialize_user_status"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstore/enum.UserStore.html b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/enum.UserStore.html new file mode 100644 index 0000000..f03b105 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/enum.UserStore.html @@ -0,0 +1,48 @@ +UserStore in docserver::defs::userstore - Rust
+ + + +
pub enum UserStore {
+    File(String),
+    Sql(AnyPool),
+}

Variants§

§

File(String)

§

Sql(AnyPool)

Implementations§

source§

impl UserStore

source

pub async fn from_str(store: &str) -> Self

Trait Implementations§

source§

impl Clone for UserStore

source§

fn clone(&self) -> UserStore

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstore/index.html b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/index.html new file mode 100644 index 0000000..79c3996 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/index.html @@ -0,0 +1,26 @@ +docserver::defs::userstore - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/defs/userstore/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/sidebar-items.js new file mode 100644 index 0000000..f9316a9 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/defs/userstore/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["UserStore"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/fn.main.html b/resources/sitehome_model/srcdocserver/docserver/fn.main.html new file mode 100644 index 0000000..181bdc1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/fn.main.html @@ -0,0 +1,26 @@ +main in docserver - Rust
+ + + +

Function docserver::main

source ·
pub(crate) fn main()
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/fn.make_https.html b/resources/sitehome_model/srcdocserver/docserver/fn.make_https.html new file mode 100644 index 0000000..240c910 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/fn.make_https.html @@ -0,0 +1,30 @@ +make_https in docserver - Rust
+ + + +

Function docserver::make_https

source ·
pub(crate) fn make_https(
+    host: String,
+    uri: Uri,
+    ports: Ports
+) -> Result<Uri, BoxError>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/fn.redirect_http_to_https.html b/resources/sitehome_model/srcdocserver/docserver/fn.redirect_http_to_https.html new file mode 100644 index 0000000..29ca525 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/fn.redirect_http_to_https.html @@ -0,0 +1,26 @@ +redirect_http_to_https in docserver - Rust
+ + + +
pub(crate) async fn redirect_http_to_https(ports: Ports)
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/fn.route.html b/resources/sitehome_model/srcdocserver/docserver/fn.route.html new file mode 100644 index 0000000..f7a2657 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/fn.route.html @@ -0,0 +1,26 @@ +route in docserver - Rust
+ + + +

Function docserver::route

source ·
pub fn route(path: &str, method_router: MethodRouter) -> Router
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.admin_router_handlers.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.admin_router_handlers.html new file mode 100644 index 0000000..cd7208c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.admin_router_handlers.html @@ -0,0 +1,26 @@ +admin_router_handlers in docserver::handlers::admin_handlers - Rust
+ + + +
pub fn admin_router_handlers() -> Router
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_as_admin_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_as_admin_handler.html new file mode 100644 index 0000000..683ee31 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_as_admin_handler.html @@ -0,0 +1,32 @@ +user_as_admin_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_as_admin_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_delete_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_delete_handler.html new file mode 100644 index 0000000..7a55bfa --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_delete_handler.html @@ -0,0 +1,31 @@ +user_delete_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_delete_handler(
+    header: HeaderMap,
+    __arg1: Extension<Arc<AppDBs>>,
+    __arg2: Extension<Cookies>,
+    __arg3: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_disable_totp_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_disable_totp_handler.html new file mode 100644 index 0000000..156379c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_disable_totp_handler.html @@ -0,0 +1,32 @@ +user_disable_totp_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_disable_totp_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_get_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_get_handler.html new file mode 100644 index 0000000..c93e1a0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_get_handler.html @@ -0,0 +1,31 @@ +user_get_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_get_handler(
+    header: HeaderMap,
+    __arg1: Extension<Arc<AppDBs>>,
+    __arg2: Extension<Cookies>,
+    __arg3: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_passwd_reset_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_passwd_reset_handler.html new file mode 100644 index 0000000..e0b0e9a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_passwd_reset_handler.html @@ -0,0 +1,32 @@ +user_passwd_reset_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_passwd_reset_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_save_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_save_handler.html new file mode 100644 index 0000000..55fd017 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.user_save_handler.html @@ -0,0 +1,32 @@ +user_save_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn user_save_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<User>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.users_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.users_handler.html new file mode 100644 index 0000000..efe6fc0 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/fn.users_handler.html @@ -0,0 +1,31 @@ +users_handler in docserver::handlers::admin_handlers - Rust
+ + + +
async fn users_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/index.html b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/index.html new file mode 100644 index 0000000..1eb7a7a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/index.html @@ -0,0 +1,26 @@ +docserver::handlers::admin_handlers - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/sidebar-items.js new file mode 100644 index 0000000..3010e3c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/admin_handlers/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["admin_router_handlers","user_as_admin_handler","user_delete_handler","user_disable_totp_handler","user_get_handler","user_passwd_reset_handler","user_save_handler","users_handler"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/index.html b/resources/sitehome_model/srcdocserver/docserver/handlers/index.html new file mode 100644 index 0000000..d2fa4a2 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/index.html @@ -0,0 +1,26 @@ +docserver::handlers - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.add_session_cookie.html b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.add_session_cookie.html new file mode 100644 index 0000000..90e7906 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.add_session_cookie.html @@ -0,0 +1,34 @@ +add_session_cookie in docserver::handlers::other_handlers - Rust
+ + + +
pub async fn add_session_cookie(
+    make: bool,
+    cookies: &Cookies,
+    session_token: &str,
+    user_data: &str,
+    expire: u64,
+    app_dbs: &AppDBs,
+    cookie_path: &str
+) -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.get_auth_state.html b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.get_auth_state.html new file mode 100644 index 0000000..b33b1ad --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.get_auth_state.html @@ -0,0 +1,30 @@ +get_auth_state in docserver::handlers::other_handlers - Rust
+ + + +
pub async fn get_auth_state(
+    update: bool,
+    cookies: &Cookies,
+    app_dbs: &AppDBs
+) -> AuthState
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.handle_404.html b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.handle_404.html new file mode 100644 index 0000000..002800c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.handle_404.html @@ -0,0 +1,26 @@ +handle_404 in docserver::handlers::other_handlers - Rust
+ + + +
pub async fn handle_404(_req: Request) -> (StatusCode, &'static str)
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.rewrite_request_uri.html b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.rewrite_request_uri.html new file mode 100644 index 0000000..7019160 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/fn.rewrite_request_uri.html @@ -0,0 +1,31 @@ +rewrite_request_uri in docserver::handlers::other_handlers - Rust
+ + + +
pub async fn rewrite_request_uri(
+    __arg0: Extension<Arc<AppDBs>>,
+    __arg1: Extension<Cookies>,
+    req: Request,
+    next: Next
+) -> Result<impl IntoResponse, Response>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/index.html b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/index.html new file mode 100644 index 0000000..e56076a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/index.html @@ -0,0 +1,26 @@ +docserver::handlers::other_handlers - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/sidebar-items.js new file mode 100644 index 0000000..a3be77e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/other_handlers/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["add_session_cookie","get_auth_state","handle_404","rewrite_request_uri"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.page_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.page_handler.html new file mode 100644 index 0000000..be82575 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.page_handler.html @@ -0,0 +1,32 @@ +page_handler in docserver::handlers::pages_handlers - Rust
+ + + +
async fn page_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Path<String>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.pages_router_handlers.html b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.pages_router_handlers.html new file mode 100644 index 0000000..1055b13 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/fn.pages_router_handlers.html @@ -0,0 +1,26 @@ +pages_router_handlers in docserver::handlers::pages_handlers - Rust
+ + + +
pub fn pages_router_handlers() -> Router
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/index.html b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/index.html new file mode 100644 index 0000000..65d6e6c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/index.html @@ -0,0 +1,26 @@ +docserver::handlers::pages_handlers - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/sidebar-items.js new file mode 100644 index 0000000..828c484 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/pages_handlers/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["page_handler","pages_router_handlers"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/handlers/sidebar-items.js new file mode 100644 index 0000000..2590f77 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["admin_handlers","other_handlers","pages_handlers","users_handlers"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.check_item_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.check_item_handler.html new file mode 100644 index 0000000..02a86e1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.check_item_handler.html @@ -0,0 +1,31 @@ +check_item_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn check_item_handler(
+    header: HeaderMap,
+    _uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_handler.html new file mode 100644 index 0000000..c0236d8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_handler.html @@ -0,0 +1,31 @@ +invite_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn invite_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_signup_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_signup_handler.html new file mode 100644 index 0000000..a635e01 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.invite_signup_handler.html @@ -0,0 +1,32 @@ +invite_signup_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn invite_signup_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Path<String>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.login_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.login_handler.html new file mode 100644 index 0000000..b412a3c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.login_handler.html @@ -0,0 +1,31 @@ +login_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn login_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.logout_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.logout_handler.html new file mode 100644 index 0000000..4411733 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.logout_handler.html @@ -0,0 +1,31 @@ +logout_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn logout_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.main_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.main_handler.html new file mode 100644 index 0000000..c4bad95 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.main_handler.html @@ -0,0 +1,31 @@ +main_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn main_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_invite_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_invite_handler.html new file mode 100644 index 0000000..0844e62 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_invite_handler.html @@ -0,0 +1,32 @@ +post_invite_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_invite_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserInvitation>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_login_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_login_handler.html new file mode 100644 index 0000000..e2a6cf5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_login_handler.html @@ -0,0 +1,32 @@ +post_login_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_login_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserLogin>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_reset_password_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_reset_password_handler.html new file mode 100644 index 0000000..6c36ead --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_reset_password_handler.html @@ -0,0 +1,32 @@ +post_reset_password_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_reset_password_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_signup_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_signup_handler.html new file mode 100644 index 0000000..28feec6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_signup_handler.html @@ -0,0 +1,32 @@ +post_signup_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_signup_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserData>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_password_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_password_handler.html new file mode 100644 index 0000000..7be189f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_password_handler.html @@ -0,0 +1,32 @@ +post_user_password_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_user_password_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserData>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_settings_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_settings_handler.html new file mode 100644 index 0000000..7e8357f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.post_user_settings_handler.html @@ -0,0 +1,32 @@ +post_user_settings_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn post_user_settings_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserData>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.reset_password_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.reset_password_handler.html new file mode 100644 index 0000000..ca66e13 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.reset_password_handler.html @@ -0,0 +1,32 @@ +reset_password_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn reset_password_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Path<String>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.signup_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.signup_handler.html new file mode 100644 index 0000000..ce0c16a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.signup_handler.html @@ -0,0 +1,31 @@ +signup_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn signup_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.update_user_item_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.update_user_item_handler.html new file mode 100644 index 0000000..3603903 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.update_user_item_handler.html @@ -0,0 +1,32 @@ +update_user_item_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn update_user_item_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Json<UserItem>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_edit_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_edit_handler.html new file mode 100644 index 0000000..59aba23 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_edit_handler.html @@ -0,0 +1,32 @@ +user_settings_edit_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn user_settings_edit_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>,
+    __arg4: Path<String>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_handler.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_handler.html new file mode 100644 index 0000000..9ba49c2 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.user_settings_handler.html @@ -0,0 +1,31 @@ +user_settings_handler in docserver::handlers::users_handlers - Rust
+ + + +
async fn user_settings_handler(
+    header: HeaderMap,
+    uri: Uri,
+    __arg2: Extension<Arc<AppDBs>>,
+    __arg3: Extension<Cookies>
+) -> Response
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.users_router_handlers.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.users_router_handlers.html new file mode 100644 index 0000000..03d9e3d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/fn.users_router_handlers.html @@ -0,0 +1,26 @@ +users_router_handlers in docserver::handlers::users_handlers - Rust
+ + + +
pub fn users_router_handlers() -> Router
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/index.html b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/index.html new file mode 100644 index 0000000..3ec2aea --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/index.html @@ -0,0 +1,26 @@ +docserver::handlers::users_handlers - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/sidebar-items.js new file mode 100644 index 0000000..620e68a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/handlers/users_handlers/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["check_item_handler","invite_handler","invite_signup_handler","login_handler","logout_handler","main_handler","post_invite_handler","post_login_handler","post_reset_password_handler","post_signup_handler","post_user_password_handler","post_user_settings_handler","reset_password_handler","signup_handler","update_user_item_handler","user_settings_edit_handler","user_settings_handler","users_router_handlers"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/index.html b/resources/sitehome_model/srcdocserver/docserver/index.html new file mode 100644 index 0000000..d31581e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/index.html @@ -0,0 +1,28 @@ +docserver - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_hash.html b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_hash.html new file mode 100644 index 0000000..3e1020b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_hash.html @@ -0,0 +1,27 @@ +generate_hash in docserver::login_password - Rust
+ + + +
pub fn generate_hash(password: impl AsRef<[u8]>) -> String
Expand description

Generate a password hash for the given password.

+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_phc_hash.html b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_phc_hash.html new file mode 100644 index 0000000..0e1840a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.generate_phc_hash.html @@ -0,0 +1,30 @@ +generate_phc_hash in docserver::login_password - Rust
+ + + +
fn generate_phc_hash<'a>(
+    password: &[u8],
+    salt: &'a SaltString
+) -> Result<PasswordHash<'a>>
Expand description

Generate a PHC hash using the preferred algorithm.

+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/fn.verify_password.html b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.verify_password.html new file mode 100644 index 0000000..ad867ba --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/fn.verify_password.html @@ -0,0 +1,30 @@ +verify_password in docserver::login_password - Rust
+ + + +
pub fn verify_password(
+    password: impl AsRef<[u8]>,
+    hash: &str
+) -> Result<(), VerifyError>
Expand description

Verify the provided password against the provided password hash.

+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/index.html b/resources/sitehome_model/srcdocserver/docserver/login_password/index.html new file mode 100644 index 0000000..0c564ac --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/index.html @@ -0,0 +1,26 @@ +docserver::login_password - Rust
+ + + +

Structs

Functions

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/login_password/sidebar-items.js new file mode 100644 index 0000000..229b116 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["generate_hash","generate_phc_hash","verify_password"],"struct":["VerifyError"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/login_password/struct.VerifyError.html b/resources/sitehome_model/srcdocserver/docserver/login_password/struct.VerifyError.html new file mode 100644 index 0000000..ad88495 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/login_password/struct.VerifyError.html @@ -0,0 +1,48 @@ +VerifyError in docserver::login_password - Rust
+ + + +
pub struct VerifyError;
Expand description

Opaque error type.

+

Trait Implementations§

source§

impl Clone for VerifyError

source§

fn clone(&self) -> VerifyError

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for VerifyError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for VerifyError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Copy for VerifyError

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/sidebar-items.js new file mode 100644 index 0000000..01d8f55 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["CFG_FILE_EXTENSION","DEFAULT_ROLES","FILE_SCHEME","GIT_VERSION","PKG_NAME","PKG_VERSION","SESSION_COOKIE_NAME","USERS_FILESTORE","USERS_TABLENAME","USER_AGENT"],"fn":["main","make_https","redirect_http_to_https","route"],"mod":["defs","handlers","login_password","tera_tpls","tools"],"static":["CALLSITE","GIT_VERSION_NAME","META","PKG_FULLNAME"],"struct":["Ports"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/static.CALLSITE.html b/resources/sitehome_model/srcdocserver/docserver/static.CALLSITE.html new file mode 100644 index 0000000..43302d6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/static.CALLSITE.html @@ -0,0 +1,26 @@ +CALLSITE in docserver - Rust
+ + + +

Static docserver::CALLSITE

source ·
pub(crate) static CALLSITE: DefaultCallsite
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/static.GIT_VERSION_NAME.html b/resources/sitehome_model/srcdocserver/docserver/static.GIT_VERSION_NAME.html new file mode 100644 index 0000000..b59b249 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/static.GIT_VERSION_NAME.html @@ -0,0 +1,26 @@ +GIT_VERSION_NAME in docserver - Rust
+ + + +
pub(crate) static GIT_VERSION_NAME: Lazy<String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/static.META.html b/resources/sitehome_model/srcdocserver/docserver/static.META.html new file mode 100644 index 0000000..b128a1b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/static.META.html @@ -0,0 +1,26 @@ +META in docserver - Rust
+ + + +

Static docserver::META

source ·
pub(crate) static META: Metadata<'static>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/static.PKG_FULLNAME.html b/resources/sitehome_model/srcdocserver/docserver/static.PKG_FULLNAME.html new file mode 100644 index 0000000..37f6516 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/static.PKG_FULLNAME.html @@ -0,0 +1,26 @@ +PKG_FULLNAME in docserver - Rust
+ + + +

Static docserver::PKG_FULLNAME

source ·
pub(crate) static PKG_FULLNAME: Lazy<String>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/struct.Ports.html b/resources/sitehome_model/srcdocserver/docserver/struct.Ports.html new file mode 100644 index 0000000..116e62d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/struct.Ports.html @@ -0,0 +1,49 @@ +Ports in docserver - Rust
+ + + +

Struct docserver::Ports

source ·
pub(crate) struct Ports {
+    pub(crate) http: u16,
+    pub(crate) https: u16,
+}

Fields§

§http: u16§https: u16

Trait Implementations§

source§

impl Clone for Ports

source§

fn clone(&self) -> Ports

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Copy for Ports

Auto Trait Implementations§

§

impl RefUnwindSafe for Ports

§

impl Send for Ports

§

impl Sync for Ports

§

impl Unpin for Ports

§

impl UnwindSafe for Ports

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

+
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for Twhere + T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where + S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more
§

impl<T> SendSyncUnwindSafe for Twhere + T: Send + Sync + UnwindSafe + ?Sized,

+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.do_nothing_filter.html b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.do_nothing_filter.html new file mode 100644 index 0000000..95b5849 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.do_nothing_filter.html @@ -0,0 +1,29 @@ +do_nothing_filter in docserver::tera_tpls - Rust
+ + + +
pub fn do_nothing_filter(
+    value: &Value,
+    _: &HashMap<String, Value>
+) -> Result<Value>
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.init_tera.html b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.init_tera.html new file mode 100644 index 0000000..548d2ea --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/fn.init_tera.html @@ -0,0 +1,26 @@ +init_tera in docserver::tera_tpls - Rust
+ + + +

Function docserver::tera_tpls::init_tera

source ·
pub fn init_tera(path: &str) -> Tera
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tera_tpls/index.html b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/index.html new file mode 100644 index 0000000..9ba92cf --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/index.html @@ -0,0 +1,26 @@ +docserver::tera_tpls - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tera_tpls/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/sidebar-items.js new file mode 100644 index 0000000..b68b18c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tera_tpls/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["do_nothing_filter","init_tera"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/fn.generate_uuid.html b/resources/sitehome_model/srcdocserver/docserver/tools/fn.generate_uuid.html new file mode 100644 index 0000000..b1ae2e8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/fn.generate_uuid.html @@ -0,0 +1,26 @@ +generate_uuid in docserver::tools - Rust
+ + + +

Function docserver::tools::generate_uuid

source ·
pub fn generate_uuid(alphabet: String) -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/fn.get_socket_addr.html b/resources/sitehome_model/srcdocserver/docserver/tools/fn.get_socket_addr.html new file mode 100644 index 0000000..c5ee33a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/fn.get_socket_addr.html @@ -0,0 +1,26 @@ +get_socket_addr in docserver::tools - Rust
+ + + +
pub fn get_socket_addr(bind: &str, port: u16) -> SocketAddr
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/fn.path_timestamp.html b/resources/sitehome_model/srcdocserver/docserver/tools/fn.path_timestamp.html new file mode 100644 index 0000000..189a7a5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/fn.path_timestamp.html @@ -0,0 +1,26 @@ +path_timestamp in docserver::tools - Rust
+ + + +
pub fn path_timestamp(filepath: &str) -> u32
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/fn.str_date_from_timestamp.html b/resources/sitehome_model/srcdocserver/docserver/tools/fn.str_date_from_timestamp.html new file mode 100644 index 0000000..d5ebe28 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/fn.str_date_from_timestamp.html @@ -0,0 +1,26 @@ +str_date_from_timestamp in docserver::tools - Rust
+ + + +
pub fn str_date_from_timestamp(timestamp: &str) -> String
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/index.html b/resources/sitehome_model/srcdocserver/docserver/tools/index.html new file mode 100644 index 0000000..b8e7ab5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/index.html @@ -0,0 +1,26 @@ +docserver::tools - Rust
+ + + +
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/docserver/tools/sidebar-items.js b/resources/sitehome_model/srcdocserver/docserver/tools/sidebar-items.js new file mode 100644 index 0000000..43da6df --- /dev/null +++ b/resources/sitehome_model/srcdocserver/docserver/tools/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["generate_uuid","get_socket_addr","path_timestamp","str_date_from_timestamp"]}; \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/help.html b/resources/sitehome_model/srcdocserver/help.html new file mode 100644 index 0000000..0450151 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/help.html @@ -0,0 +1,26 @@ +Rustdoc help
+ + + +

Rustdoc help

Back
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/images/doc.svg b/resources/sitehome_model/srcdocserver/images/doc.svg new file mode 100644 index 0000000..34b7ff3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/images/doc.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/sitehome_model/srcdocserver/images/docserver.svg b/resources/sitehome_model/srcdocserver/images/docserver.svg new file mode 100644 index 0000000..018ed87 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/images/docserver.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/images/git-icon-black.svg b/resources/sitehome_model/srcdocserver/images/git-icon-black.svg new file mode 100644 index 0000000..6b6a26a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/images/git-icon-black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/async_session/session_store/trait.SessionStore.js b/resources/sitehome_model/srcdocserver/implementors/async_session/session_store/trait.SessionStore.js new file mode 100644 index 0000000..00ed627 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/async_session/session_store/trait.SessionStore.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl SessionStore for FileStore"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Args.js b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Args.js new file mode 100644 index 0000000..e279a60 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Args.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Args for Cli"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.CommandFactory.js b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.CommandFactory.js new file mode 100644 index 0000000..3d059b5 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.CommandFactory.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl CommandFactory for Cli"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.FromArgMatches.js b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.FromArgMatches.js new file mode 100644 index 0000000..1162d9a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.FromArgMatches.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl FromArgMatches for Cli"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Parser.js b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Parser.js new file mode 100644 index 0000000..701599a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/clap_builder/derive/trait.Parser.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Parser for Cli"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/clone/trait.Clone.js b/resources/sitehome_model/srcdocserver/implementors/core/clone/trait.Clone.js new file mode 100644 index 0000000..69b9108 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/clone/trait.Clone.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Clone for MailMessage"],["impl Clone for Ports"],["impl Clone for Config"],["impl Clone for SessionStoreDB"],["impl Clone for UiConfig"],["impl Clone for TotpAlgorithm"],["impl Clone for UserStore"],["impl Clone for Local"],["impl Clone for TraceData"],["impl Clone for FileStore"],["impl Clone for UserData"],["impl Clone for AuthState"],["impl Clone for UserRole"],["impl Clone for AppDBs"],["impl Clone for User"],["impl Clone for VerifyError"],["impl Clone for WebMenuItem"],["impl Clone for ServPath"],["impl Clone for TraceContent"],["impl Clone for UserAction"],["impl Clone for UserStatus"],["impl Clone for SubMenuItem"],["impl Clone for UserInvitation"],["impl Clone for TotpMode"],["impl Clone for UserItem"],["impl Clone for UserLogin"],["impl Clone for UserId"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.Eq.js b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.Eq.js new file mode 100644 index 0000000..7abf03b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.Eq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Eq for UserRole"],["impl Eq for TotpMode"],["impl Eq for TotpAlgorithm"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialEq.js b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialEq.js new file mode 100644 index 0000000..8bd2fd1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl PartialEq<User> for User"],["impl PartialEq<UserRole> for UserRole"],["impl PartialEq<UserStatus> for UserStatus"],["impl PartialEq<TotpAlgorithm> for TotpAlgorithm"],["impl PartialEq<TotpMode> for TotpMode"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialOrd.js b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialOrd.js new file mode 100644 index 0000000..66cff7b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/cmp/trait.PartialOrd.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl PartialOrd<User> for User"],["impl PartialOrd<UserStatus> for UserStatus"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/default/trait.Default.js b/resources/sitehome_model/srcdocserver/implementors/core/default/trait.Default.js new file mode 100644 index 0000000..84a71ea --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/default/trait.Default.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Default for TotpMode"],["impl Default for UserInvitation"],["impl Default for Config"],["impl Default for AuthState"],["impl Default for UserLogin"],["impl Default for UserAction"],["impl Default for UserItem"],["impl Default for UserNotifyData"],["impl Default for User"],["impl Default for UserStatus"],["impl Default for Local"],["impl Default for SubMenuItem"],["impl Default for UiConfig"],["impl Default for TraceData"],["impl Default for WebMenuItem"],["impl Default for ServPath"],["impl Default for TotpAlgorithm"],["impl Default for TraceContent"],["impl Default for UserData"],["impl Default for UserRole"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Debug.js b/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Debug.js new file mode 100644 index 0000000..33813ac --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Debug.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Debug for TraceData"],["impl Debug for ServPath"],["impl Debug for UserData"],["impl Debug for User"],["impl Debug for UiConfig"],["impl Debug for Cli"],["impl Debug for WebMenuItem"],["impl Debug for VerifyError"],["impl Debug for Config"],["impl Debug for AuthState"],["impl Debug for TraceContent"],["impl Debug for UserRole"],["impl Debug for UserNotifyData"],["impl Debug for Local"],["impl Debug for TotpAlgorithm"],["impl Debug for UserInvitation"],["impl Debug for SubMenuItem"],["impl Debug for TotpMode"],["impl Debug for UserStatus"],["impl Debug for FileStore"],["impl Debug for MailMessage"],["impl Debug for UserLogin"],["impl Debug for UserItem"],["impl Debug for UserId"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Display.js b/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Display.js new file mode 100644 index 0000000..e515081 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/fmt/trait.Display.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Display for UserAction"],["impl Display for UserRole"],["impl Display for UserStatus"],["impl Display for VerifyError"],["impl Display for User"],["impl Display for TotpMode"],["impl Display for UserId"],["impl Display for TotpAlgorithm"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/iter/traits/iterator/trait.Iterator.js b/resources/sitehome_model/srcdocserver/implementors/core/iter/traits/iterator/trait.Iterator.js new file mode 100644 index 0000000..62edd49 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/iter/traits/iterator/trait.Iterator.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl<T: Entry> Iterator for Entries<T>"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Copy.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Copy.js new file mode 100644 index 0000000..945083e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Copy.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Copy for VerifyError"],["impl Copy for UserId"],["impl Copy for Ports"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Freeze.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Freeze.js new file mode 100644 index 0000000..4b0d490 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Freeze.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Freeze for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl Freeze for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl Freeze for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl Freeze for ServPath",1,["docserver::defs::config::ServPath"]],["impl Freeze for Config",1,["docserver::defs::config::Config"]],["impl Freeze for Cli",1,["docserver::defs::cli::Cli"]],["impl Freeze for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl Freeze for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl Freeze for AuthState",1,["docserver::defs::session::AuthState"]],["impl Freeze for UserData",1,["docserver::defs::userdata::UserData"]],["impl Freeze for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl Freeze for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl Freeze for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl Freeze for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> Freeze for Entries<T>",1,["docserver::defs::entries::Entries"]],["impl Freeze for User",1,["docserver::defs::user::User"]],["impl Freeze for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl Freeze for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl Freeze for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl Freeze for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> Freeze for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl Freeze for UserId",1,["docserver::defs::user_id::UserId"]],["impl Freeze for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl Freeze for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl Freeze for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl Freeze for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl Freeze for Local",1,["docserver::defs::local::Local"]],["impl Freeze for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl Freeze for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl Freeze for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl Freeze for VerifyError",1,["docserver::login_password::VerifyError"]],["impl Freeze for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Send.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Send.js new file mode 100644 index 0000000..2d21cfe --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Send.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Send for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl Send for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl Send for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl Send for ServPath",1,["docserver::defs::config::ServPath"]],["impl Send for Config",1,["docserver::defs::config::Config"]],["impl Send for Cli",1,["docserver::defs::cli::Cli"]],["impl Send for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl Send for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl Send for AuthState",1,["docserver::defs::session::AuthState"]],["impl Send for UserData",1,["docserver::defs::userdata::UserData"]],["impl Send for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl Send for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl Send for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl Send for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> Send for Entries<T>where\n T: Send,",1,["docserver::defs::entries::Entries"]],["impl Send for User",1,["docserver::defs::user::User"]],["impl Send for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl Send for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl Send for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl Send for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> Send for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl Send for UserId",1,["docserver::defs::user_id::UserId"]],["impl Send for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl Send for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl Send for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl Send for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl Send for Local",1,["docserver::defs::local::Local"]],["impl Send for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl Send for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl Send for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl Send for VerifyError",1,["docserver::login_password::VerifyError"]],["impl Send for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralEq.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralEq.js new file mode 100644 index 0000000..a8c1939 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl StructuralEq for UserRole"],["impl StructuralEq for TotpAlgorithm"],["impl StructuralEq for TotpMode"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralPartialEq.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 0000000..682442d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl StructuralPartialEq for TotpAlgorithm"],["impl StructuralPartialEq for UserStatus"],["impl StructuralPartialEq for TotpMode"],["impl StructuralPartialEq for UserRole"],["impl StructuralPartialEq for User"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Sync.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Sync.js new file mode 100644 index 0000000..90fd4d3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Sync.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Sync for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl Sync for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl Sync for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl Sync for ServPath",1,["docserver::defs::config::ServPath"]],["impl Sync for Config",1,["docserver::defs::config::Config"]],["impl Sync for Cli",1,["docserver::defs::cli::Cli"]],["impl Sync for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl Sync for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl Sync for AuthState",1,["docserver::defs::session::AuthState"]],["impl Sync for UserData",1,["docserver::defs::userdata::UserData"]],["impl Sync for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl Sync for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl Sync for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl Sync for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> Sync for Entries<T>where\n T: Sync,",1,["docserver::defs::entries::Entries"]],["impl Sync for User",1,["docserver::defs::user::User"]],["impl Sync for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl Sync for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl Sync for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl Sync for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> Sync for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl Sync for UserId",1,["docserver::defs::user_id::UserId"]],["impl Sync for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl Sync for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl Sync for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl Sync for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl Sync for Local",1,["docserver::defs::local::Local"]],["impl Sync for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl Sync for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl Sync for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl Sync for VerifyError",1,["docserver::login_password::VerifyError"]],["impl Sync for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Unpin.js b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Unpin.js new file mode 100644 index 0000000..4745cf7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/marker/trait.Unpin.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Unpin for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl Unpin for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl Unpin for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl Unpin for ServPath",1,["docserver::defs::config::ServPath"]],["impl Unpin for Config",1,["docserver::defs::config::Config"]],["impl Unpin for Cli",1,["docserver::defs::cli::Cli"]],["impl Unpin for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl Unpin for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl Unpin for AuthState",1,["docserver::defs::session::AuthState"]],["impl Unpin for UserData",1,["docserver::defs::userdata::UserData"]],["impl Unpin for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl Unpin for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl Unpin for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl Unpin for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> Unpin for Entries<T>where\n T: Unpin,",1,["docserver::defs::entries::Entries"]],["impl Unpin for User",1,["docserver::defs::user::User"]],["impl Unpin for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl Unpin for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl Unpin for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl Unpin for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> Unpin for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl Unpin for UserId",1,["docserver::defs::user_id::UserId"]],["impl Unpin for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl Unpin for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl Unpin for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl Unpin for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl Unpin for Local",1,["docserver::defs::local::Local"]],["impl Unpin for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl Unpin for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl Unpin for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl Unpin for VerifyError",1,["docserver::login_password::VerifyError"]],["impl Unpin for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 0000000..5ce629c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl RefUnwindSafe for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl RefUnwindSafe for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl RefUnwindSafe for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl RefUnwindSafe for ServPath",1,["docserver::defs::config::ServPath"]],["impl RefUnwindSafe for Config",1,["docserver::defs::config::Config"]],["impl RefUnwindSafe for Cli",1,["docserver::defs::cli::Cli"]],["impl RefUnwindSafe for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl !RefUnwindSafe for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl RefUnwindSafe for AuthState",1,["docserver::defs::session::AuthState"]],["impl RefUnwindSafe for UserData",1,["docserver::defs::userdata::UserData"]],["impl RefUnwindSafe for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl RefUnwindSafe for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl RefUnwindSafe for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl RefUnwindSafe for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> RefUnwindSafe for Entries<T>where\n T: RefUnwindSafe,",1,["docserver::defs::entries::Entries"]],["impl RefUnwindSafe for User",1,["docserver::defs::user::User"]],["impl !RefUnwindSafe for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl RefUnwindSafe for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl !RefUnwindSafe for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl RefUnwindSafe for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> !RefUnwindSafe for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl RefUnwindSafe for UserId",1,["docserver::defs::user_id::UserId"]],["impl RefUnwindSafe for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl RefUnwindSafe for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl RefUnwindSafe for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl RefUnwindSafe for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl RefUnwindSafe for Local",1,["docserver::defs::local::Local"]],["impl RefUnwindSafe for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl RefUnwindSafe for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl RefUnwindSafe for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl RefUnwindSafe for VerifyError",1,["docserver::login_password::VerifyError"]],["impl RefUnwindSafe for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 0000000..83d5248 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl UnwindSafe for SubMenuItem",1,["docserver::defs::config::SubMenuItem"]],["impl UnwindSafe for WebMenuItem",1,["docserver::defs::config::WebMenuItem"]],["impl UnwindSafe for UiConfig",1,["docserver::defs::config::UiConfig"]],["impl UnwindSafe for ServPath",1,["docserver::defs::config::ServPath"]],["impl UnwindSafe for Config",1,["docserver::defs::config::Config"]],["impl UnwindSafe for Cli",1,["docserver::defs::cli::Cli"]],["impl UnwindSafe for FileStore",1,["docserver::defs::filestore::FileStore"]],["impl !UnwindSafe for SessionStoreDB",1,["docserver::defs::session::SessionStoreDB"]],["impl UnwindSafe for AuthState",1,["docserver::defs::session::AuthState"]],["impl UnwindSafe for UserData",1,["docserver::defs::userdata::UserData"]],["impl UnwindSafe for UserLogin",1,["docserver::defs::userdata::UserLogin"]],["impl UnwindSafe for UserItem",1,["docserver::defs::userdata::UserItem"]],["impl UnwindSafe for UserInvitation",1,["docserver::defs::userdata::UserInvitation"]],["impl UnwindSafe for UserNotifyData",1,["docserver::defs::usernotifydata::UserNotifyData"]],["impl<T> UnwindSafe for Entries<T>where\n T: UnwindSafe,",1,["docserver::defs::entries::Entries"]],["impl UnwindSafe for User",1,["docserver::defs::user::User"]],["impl !UnwindSafe for UserStore",1,["docserver::defs::userstore::UserStore"]],["impl UnwindSafe for UserStatus",1,["docserver::defs::userstatus::UserStatus"]],["impl !UnwindSafe for AppDBs",1,["docserver::defs::appdbs::AppDBs"]],["impl UnwindSafe for ReqHeaderMap",1,["docserver::defs::req_headermap::ReqHeaderMap"]],["impl<'a> !UnwindSafe for ReqHandler<'a>",1,["docserver::defs::req_handler::ReqHandler"]],["impl UnwindSafe for UserId",1,["docserver::defs::user_id::UserId"]],["impl UnwindSafe for UserAction",1,["docserver::defs::user_action::UserAction"]],["impl UnwindSafe for UserRole",1,["docserver::defs::user_role::UserRole"]],["impl UnwindSafe for TraceContent",1,["docserver::defs::tracedata::TraceContent"]],["impl UnwindSafe for TraceData",1,["docserver::defs::tracedata::TraceData"]],["impl UnwindSafe for Local",1,["docserver::defs::local::Local"]],["impl UnwindSafe for MailMessage",1,["docserver::defs::mailer::MailMessage"]],["impl UnwindSafe for TotpMode",1,["docserver::defs::totp_mode::TotpMode"]],["impl UnwindSafe for TotpAlgorithm",1,["docserver::defs::totp_algorithm::TotpAlgorithm"]],["impl UnwindSafe for VerifyError",1,["docserver::login_password::VerifyError"]],["impl UnwindSafe for Ports",1,["docserver::Ports"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/docserver/defs/entries/trait.Entry.js b/resources/sitehome_model/srcdocserver/implementors/docserver/defs/entries/trait.Entry.js new file mode 100644 index 0000000..7f2a2f7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/docserver/defs/entries/trait.Entry.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/serde/de/trait.Deserialize.js b/resources/sitehome_model/srcdocserver/implementors/serde/de/trait.Deserialize.js new file mode 100644 index 0000000..806523f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/serde/de/trait.Deserialize.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl<'de> Deserialize<'de> for WebMenuItem"],["impl<'de> Deserialize<'de> for TotpMode"],["impl<'de> Deserialize<'de> for UserItem"],["impl<'de> Deserialize<'de> for UserInvitation"],["impl<'de> Deserialize<'de> for UserLogin"],["impl<'de> Deserialize<'de> for TraceContent"],["impl<'de> Deserialize<'de> for TraceData"],["impl<'de> Deserialize<'de> for TotpAlgorithm"],["impl<'de> Deserialize<'de> for UserData"],["impl<'de> Deserialize<'de> for ServPath"],["impl<'de> Deserialize<'de> for Config"],["impl<'de> Deserialize<'de> for UserRole"],["impl<'de> Deserialize<'de> for Local"],["impl<'de> Deserialize<'de> for User"],["impl<'de> Deserialize<'de> for UserStatus"],["impl<'de> Deserialize<'de> for SubMenuItem"],["impl<'de> Deserialize<'de> for UiConfig"],["impl<'de> Deserialize<'de> for UserId"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/implementors/serde/ser/trait.Serialize.js b/resources/sitehome_model/srcdocserver/implementors/serde/ser/trait.Serialize.js new file mode 100644 index 0000000..5d531b4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/implementors/serde/ser/trait.Serialize.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"docserver":[["impl Serialize for TraceContent"],["impl Serialize for WebMenuItem"],["impl Serialize for ServPath"],["impl Serialize for TotpMode"],["impl Serialize for Local"],["impl Serialize for TotpAlgorithm"],["impl Serialize for UserInvitation"],["impl Serialize for UserRole"],["impl Serialize for TraceData"],["impl Serialize for UserLogin"],["impl Serialize for UserItem"],["impl Serialize for UserId"],["impl Serialize for UserStatus"],["impl Serialize for UiConfig"],["impl Serialize for User"],["impl Serialize for Config"],["impl Serialize for SubMenuItem"],["impl Serialize for UserData"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/index.html b/resources/sitehome_model/srcdocserver/index.html new file mode 100644 index 0000000..5db85bd --- /dev/null +++ b/resources/sitehome_model/srcdocserver/index.html @@ -0,0 +1,13 @@ + + + + + HTML Redirect + + + + + + + + diff --git a/resources/sitehome_model/srcdocserver/search-index.js b/resources/sitehome_model/srcdocserver/search-index.js new file mode 100644 index 0000000..d69e5aa --- /dev/null +++ b/resources/sitehome_model/srcdocserver/search-index.js @@ -0,0 +1,5 @@ +var searchIndex = JSON.parse('{\ +"docserver":{"doc":"Run ","t":"HHHRRRRHHHHHRRDRRRRLLLLALLLAMMLAFFFFALALLLLRRRRRRRRRRRRRRRRRRRRRRRRAAAAAAAAAAAAAAAAAAAAADLLLLMMLMLLLLLMMLLLLMLDLLLLLLMMLLLLLLMMFMLLLLLMLDDDDDMMMMMMLLLLLLLLLLMLLLLLLLLLLMLLLLLFFFFFFFFFFFFFFFFFFFMLLLLLMMLLLLLLLLLLLLLLLLLLLLLLLMMLLLLLMMMMMMLLMMMMMMMMMMMMMMMMMMMMMLLLLLMMMMMMMMMMMMMLLLLLLMMMMLLLLLLLLLLMMLLLLLMMMMMMMMMMLLLLLMDILLLMLKLLMLLMLLLLLDLLLLLLLLLLLLLLLLFLLMMLLLLLLDLLLLLLLLLLLMLLMLLLLLLLDLLLLLLLMLLLLLLMLLMLLLLLDMLMLLLLLLMLLLLLMLLLLMLLLLLLLLMMLLLLLMLDLLLLLMLLLLLLLLLLLLLMLLLLLLLLDNNNENLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLMLLLLLLLLLNNNELLLLLLFLLLLLLLLLLLLLLLLLNNNELLLLLLFLLLLLLLLLLLLLLLLLDDLLLLLLLLMLMLLFFLLLLLLLLLLMMLLMMLLMMMLLLMLLLLLLLLMRDLLLLLLMLFLMLLMLLLLLLLLLLMLMLMLMLMLLMMMMMMLMLMLLLLMLLLLLLLNNNNNNENLLLLLLLLLLLLLLLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNELLLLLLFLLLLLLLLLLLLLLLLLDDDDLLLLLLLLLLLLLLLLLLLLFFFFFFMLLLLMMMLLLLLLLLLLLLLLLLMMLLLLMMMMMMMMMMMMMMLLLLLLLLLLLLLLLLLLLLMLLLLDMLLLLLLLMLMLLLLLNNNNNELLLLLLFLLLLLLLLLLLLLLLLNNELLLLLLLLLLLLLLAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDLLLLLLLLLFFLLLLLLFLFFFFFF","n":["CALLSITE","CALLSITE","CALLSITE","CFG_FILE_EXTENSION","DEFAULT_ROLES","FILE_SCHEME","GIT_VERSION","GIT_VERSION_NAME","META","META","META","PKG_FULLNAME","PKG_NAME","PKG_VERSION","Ports","SESSION_COOKIE_NAME","USERS_FILESTORE","USERS_TABLENAME","USER_AGENT","borrow","borrow_mut","clone","clone_into","defs","from","from_ref","from_ref","handlers","http","https","into","login_password","main","make_https","redirect_http_to_https","route","tera_tpls","to_owned","tools","try_from","try_into","type_id","vzip","ACCEPT_LANGUAGE","AUTHORIZATION","BEARER","CLAIM_APP_KEY","CLAIM_AUTH","CLAIM_UID","FILE_SCHEME","HELP_EXT","HELP_URI","LOGS_SESSION_COOKIE_NAME","LOG_REQ","REFERER","SESSION_ID","SID_REQUESTS_FILE","SID_SETTINGS_FILE","SID_TRACE_FILE","TEMPLATE_EXT","TOKEN_AUTH_VALUE","TOKEN_KEY_VALUE","USER_AGENT","USER_DATA","X_FORWARDED_FOR","X_INTERNAL","X_REAL_IP","appdbs","cli","config","entries","filestore","local","mailer","req_handler","req_headermap","session","totp_algorithm","totp_mode","tracedata","user","user_action","user_id","user_role","userdata","usernotifydata","userstatus","userstore","AppDBs","borrow","borrow_mut","clone","clone_into","config","context","create_enforcer","enforcer","from","from_ref","from_ref","into","new","sessions_store_db","tera","to_owned","try_from","try_into","type_id","user_store","vzip","Cli","augment_args","augment_args_for_update","borrow","borrow_mut","command","command_for_update","config_path","create_id","fmt","from","from_arg_matches","from_arg_matches_mut","group_id","into","make_token","output_path","parse_args","pasetokeys_path","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","version","vzip","Config","ServPath","SubMenuItem","UiConfig","WebMenuItem","admin_fields","allow_origin","assets_url","authz_model_path","authz_policy_path","bind","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","cert_file","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","css_link","default","default","default","default","default","default_config_array_resource","default_config_dflt_lang","default_config_empty","default_config_invite_expire","default_config_locales","default_config_org","default_config_password_score","default_config_resource","default_config_serv_paths","default_config_totp_algorithm","default_config_totp_digits","default_config_totp_mode","default_config_tpls","default_config_use_mail","default_config_use_random","default_config_web_menu_items","default_is_restricted","default_sub_menu_items","default_web_menu_item_roles","defaults_path","deserialize","deserialize","deserialize","deserialize","deserialize","dflt_lang","docs_index","fix_item_path","fix_root_path","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","full_html_url","hostport","html_url","into","into","into","into","into","invite_expire","is_restricted","items","js_link","key_file","langs","load_from_file","load_items","locales","mail_from","mail_reply_to","main_js_link","name","not_auth","not_found","org","other_css_link","other_js_link","paseto","password_score","path_locales_config","port","prefix","protocol","redirect_to","resources_path","roles","roles","root_path","serialize","serialize","serialize","serialize","serialize","serv_paths","session_expire","session_store_file","session_store_uri","signup_mode","smtp","smtp_auth","src_path","srctyp","srctyp","templates_path","text","text","to_json","to_owned","to_owned","to_owned","to_owned","to_owned","totp_algorithm","totp_digits","totp_mode","tpls","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","typ","typ","type_id","type_id","type_id","type_id","type_id","ui","url","url","url_path","use_mail","use_random","user_store_access","users_store_uri","utils_js_link","verbose","vzip","vzip","vzip","vzip","vzip","web_menu_items","Entries","Entry","append","borrow","borrow_mut","cursor","from","from_line","into","into_iter","marker","new","next","path","try_from","try_into","type_id","vzip","write","FileStore","borrow","borrow_mut","check_paths","cleanup","clear_store","clone","clone_into","count","destroy_session","fmt","from","from_ref","from_ref","get_path","get_session_id_path","into","is_hidden","load_session","load_session_file","ses_file","sess_path","store_session","to_owned","try_from","try_into","type_id","vzip","Local","borrow","borrow_mut","clone","clone_into","default","deserialize","fmt","from","from_ref","from_ref","get_lang","id","into","itm","itms","new","serialize","to_owned","try_from","try_into","type_id","vzip","MailMessage","borrow","borrow_mut","check","clone","clone_into","fmt","from","from","from_ref","from_ref","get_credentials","into","mail_message","new","reply_to","send_html_message","send_message","to","to_owned","try_from","try_into","type_id","vzip","ReqHandler","app_dbs","auth_role","auth_state","bad_request","borrow","borrow_mut","check_request_auth","check_request_help","check_request_invalid","context","from","get_config_lang","get_lang","has_auth_or_new","into","lang","load_md_template_file","load_template_file","new","new_token","notify_data","otp_check","otp_generate","otp_make","prepare_head_json_response","prepare_head_response","prepare_render","prepare_response","render_template","req_header","req_name","response_tpl_msg","template_file_dirpath","try_from","try_into","type_id","uri","vzip","ReqHeaderMap","agent","auth","borrow","borrow_mut","from","header","internal","into","ip","is_browser","is_curl","is_wget","lang","maybe_forwarded","maybe_x_forwarded_for","maybe_x_real_ip","new","referer","req_end_path","req_path","req_path_clean","req_path_contains","req_user","response_user_agent_html","try_from","try_into","type_id","vzip","AuthState","Files","Memory","None","SessionStoreDB","SqlLite","borrow","borrow","borrow_mut","borrow_mut","cleanup_data","clone","clone","clone_into","clone_into","connect_file_store","connect_memory_store","connect_sqlite_store","default","destroy","expire_in","fmt","from","from","from_cookie","from_data","from_ref","from_ref","from_ref","from_ref","id","into","into","is_admin","ses_destroyed","ses_expired","ses_validate","session","store_session_data","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","update_session_data","user","user_data","user_email","user_id","user_items","user_name","user_roles","user_status","vzip","vzip","Sha1","Sha256","Sha512","TotpAlgorithm","borrow","borrow_mut","clone","clone_into","default","deserialize","deserialize_totp_algorithm","eq","equivalent","equivalent","fmt","fmt","from","from_ref","from_ref","from_str","into","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","Mandatory","No","Optional","TotpMode","borrow","borrow_mut","clone","clone_into","default","deserialize","deserialize_totp_mode","eq","equivalent","equivalent","fmt","fmt","from","from_ref","from_ref","from_str","into","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","TraceContent","TraceData","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","contents","contents_to_json","context","default","default","default_empty","default_tracedata_items","deserialize","deserialize","fmt","fmt","from","from","from_ref","from_ref","from_ref","from_ref","id","info","into","into","origin","role","serialize","serialize","server","sid","timestamp","to_json","to_owned","to_owned","trigger","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","when","DISPLAY_SEPARATOR","User","add","borrow","borrow_mut","clone","clone_into","count","created","default","default_user_status","delete","description","deserialize","disable_totp","email","eq","estimate_password","fmt","fmt","from","from_data","from_line","from_ref","from_ref","from_user","fullname","hash_items","id","into","isadmin","items","items","json_items","lastaccess","line_format","list","name","otp_auth_url","otp_base32","otp_defs","otp_enabled","otp_verified","partial_cmp","password","password_score","roles","select","serialize","session_data","show","status","to_owned","to_string","try_from","try_into","type_id","update","vzip","Access","List","Log","Other","Profile","Request","UserAction","View","borrow","borrow_mut","clone","clone_into","default","fmt","from","from_ref","from_ref","from_str","info","into","to_owned","to_string","try_from","try_into","type_id","vzip","UserId","borrow","borrow_mut","clone","clone_into","deserialize","fmt","fmt","from","from","from_ref","from_ref","id_path","into","log_user_id_action","new","read_sid_requests","save_sid_request","save_trace_data","serialize","sid_settings_content","sid_settings_path","to_owned","to_string","try_from","try_into","type_id","vzip","write_data","Anonymous","Developer","SuperUser","User","UserRole","borrow","borrow_mut","clone","clone_into","default","deserialize","deserialize_user_role","eq","equivalent","equivalent","fmt","fmt","from","from_ref","from_ref","from_str","into","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","UserData","UserInvitation","UserItem","UserLogin","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","default","default","default","default","default_empty","default_expire","default_isadmin","default_items","default_otp_empty","default_send_email","description","deserialize","deserialize","deserialize","deserialize","email","email","expire","fmt","fmt","fmt","fmt","from","from","from","from","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","from_ref","fullname","id","into","into","into","into","isadmin","items","name","name","name","otp_auth","otp_auth","otp_code","otp_url","password","password","roles","roles","send_email","serialize","serialize","serialize","serialize","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","value","vzip","vzip","vzip","vzip","UserNotifyData","auth","borrow","borrow_mut","data_claim","default","fmt","from","from_token","id","into","key","token","try_from","try_into","type_id","vzip","Active","Created","Lock","Pending","Unknown","UserStatus","borrow","borrow_mut","clone","clone_into","default","deserialize","deserialize_user_status","eq","fmt","fmt","from","from_ref","from_ref","from_str","into","partial_cmp","serialize","to_owned","to_string","try_from","try_into","type_id","vzip","File","Sql","UserStore","borrow","borrow_mut","clone","clone_into","from","from_ref","from_ref","from_str","into","to_owned","try_from","try_into","type_id","vzip","admin_handlers","other_handlers","pages_handlers","users_handlers","admin_router_handlers","user_as_admin_handler","user_delete_handler","user_disable_totp_handler","user_get_handler","user_passwd_reset_handler","user_save_handler","users_handler","add_session_cookie","get_auth_state","handle_404","rewrite_request_uri","page_handler","pages_router_handlers","check_item_handler","invite_handler","invite_signup_handler","login_handler","logout_handler","main_handler","post_invite_handler","post_login_handler","post_reset_password_handler","post_signup_handler","post_user_password_handler","post_user_settings_handler","reset_password_handler","signup_handler","update_user_item_handler","user_settings_edit_handler","user_settings_handler","users_router_handlers","VerifyError","borrow","borrow_mut","clone","clone_into","fmt","fmt","from","from_ref","from_ref","generate_hash","generate_phc_hash","into","to_owned","to_string","try_from","try_into","type_id","verify_password","vzip","do_nothing_filter","init_tera","generate_uuid","get_socket_addr","path_timestamp","str_date_from_timestamp"],"q":[[0,"docserver"],[43,"docserver::defs"],[88,"docserver::defs::appdbs"],[110,"docserver::defs::cli"],[136,"docserver::defs::config"],[321,"docserver::defs::entries"],[340,"docserver::defs::filestore"],[368,"docserver::defs::local"],[391,"docserver::defs::mailer"],[415,"docserver::defs::req_handler"],[454,"docserver::defs::req_headermap"],[483,"docserver::defs::session"],[541,"docserver::defs::totp_algorithm"],[569,"docserver::defs::totp_mode"],[597,"docserver::defs::tracedata"],[648,"docserver::defs::user"],[707,"docserver::defs::user_action"],[733,"docserver::defs::user_id"],[762,"docserver::defs::user_role"],[791,"docserver::defs::userdata"],[890,"docserver::defs::usernotifydata"],[907,"docserver::defs::userstatus"],[936,"docserver::defs::userstore"],[953,"docserver::handlers"],[957,"docserver::handlers::admin_handlers"],[965,"docserver::handlers::other_handlers"],[969,"docserver::handlers::pages_handlers"],[971,"docserver::handlers::users_handlers"],[989,"docserver::login_password"],[1009,"docserver::tera_tpls"],[1011,"docserver::tools"]],"d":["","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","Configuration TOML file-path to run WebServer REQUIRED","Generate id key for identification","","Returns the argument unchanged.","","","","Calls U::from(self).","Settings-toml-file to Generate PaSeTo Token (-o to …","Output path to save generated token with make_token (-t)","Runs some options from command line like: genererate id, …","Path to generate PaSeTo public and secret keys to use for …","","","","","","Show version ","","Config collects config values.","ServPath collects dir path to server as static content","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A Trait to represent an entry of data from an /etc/{passwd,…","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","Create a new instance of FilesStore","","","","","","","","Returns the argument unchanged.","","","","","Calls U::from(self).","","","As session Id from async_session comes in base64 it will …","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","Find a md template file under …","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","Tries to parse forwarded headers","Tries to parse the x-real-ip header","Tries to parse the x-real-ip header","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","Log user actions to …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Opaque error type.","","","","","","","Returns the argument unchanged.","","","Generate a password hash for the given password.","Generate a PHC hash using the preferred algorithm.","Calls U::from(self).","","","","","","Verify the provided password against the provided password …","","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,0,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,0,20,20,20,20,20,20,20,20,0,0,0,0,0,14,14,14,14,14,14,27,28,29,30,14,27,28,29,30,14,14,27,28,29,30,14,27,28,29,30,14,29,27,28,29,30,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,27,28,29,30,14,14,14,14,14,27,28,29,30,14,27,28,29,30,14,27,27,28,28,29,29,30,30,14,14,14,14,14,27,28,29,30,14,14,30,28,29,14,14,14,14,14,14,14,29,14,30,30,14,29,29,14,14,14,14,14,14,30,14,27,28,14,27,28,29,30,14,14,14,14,14,14,14,14,30,27,28,14,27,28,14,27,28,29,30,14,14,14,14,14,27,28,29,30,14,27,28,29,30,14,27,28,27,28,29,30,14,14,27,28,30,14,14,14,14,29,14,27,28,29,30,14,29,0,0,43,43,43,43,43,46,43,43,43,43,43,43,43,43,43,43,43,0,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,0,47,47,47,47,47,47,47,47,47,47,0,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,0,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,0,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,0,15,15,15,0,15,15,60,15,60,15,15,60,15,60,15,15,15,60,60,60,60,15,60,60,60,15,15,60,60,60,15,60,60,60,60,60,60,15,15,60,15,60,15,60,15,60,15,60,60,60,60,60,60,60,60,15,60,36,36,36,0,36,36,36,36,36,36,0,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,38,38,38,0,38,38,38,38,38,38,0,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,0,0,67,68,67,68,67,68,67,68,68,68,67,67,68,0,0,67,68,67,68,67,68,67,67,68,68,67,67,67,68,67,67,67,68,68,67,68,67,67,68,67,67,68,67,68,67,68,67,68,67,0,0,69,69,69,69,69,69,69,69,0,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,73,73,73,73,73,73,0,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,0,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,74,58,58,58,58,0,58,58,58,58,58,58,0,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,0,0,0,0,71,76,77,78,71,76,77,78,71,76,77,78,71,76,77,78,71,76,77,78,0,0,0,0,0,0,71,71,76,77,78,71,78,78,71,76,77,78,71,76,77,78,71,71,76,76,77,77,78,78,71,71,71,76,77,78,78,71,71,76,77,71,76,71,71,71,76,71,78,78,71,76,77,78,71,76,77,78,71,76,77,78,71,76,77,78,71,76,77,78,77,71,76,77,78,0,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,66,66,66,66,66,0,66,66,66,66,66,66,0,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,16,16,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,88,88,88,88,88,88,88,88,0,0,88,88,88,88,88,88,0,88,0,0,0,0,0,0],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[1,1],[[]],0,[[]],[[]],[[]],0,0,0,[[]],0,[[]],[[2,3,1],[[5,[3,4]]]],[1],[[6,7],8],0,[[]],0,[[],5],[[],5],[[],9],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[10,10],[[]],0,0,[[6,6],[[13,[[12,[11]]]]]],0,[[]],[[]],[[]],[[]],[[14,15,16,[13,[[12,[11]]]],17,18],10],0,0,[[]],[[],5],[[],5],[[],9],0,[[]],0,[19,19],[19,19],[[]],[[]],[[],19],[[],19],0,0,[[20,21],22],[[]],[23,[[5,[20,24]]]],[23,[[5,[20,24]]]],[[],[[26,[25]]]],[[]],0,0,[[],2],0,[[],5],[[],5],[[],9],[[20,23],[[5,[24]]]],[[20,23],[[5,[24]]]],0,[[]],0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,[27,27],[28,28],[29,29],[30,30],[14,14],[[]],[[]],[[]],[[]],[[]],0,[[],27],[[],28],[[],29],[[],30],[[],14],[[],[[31,[2]]]],[[],2],[[],2],[[],32],[[],[[34,[2,33]]]],[[],2],[[],35],[[],2],[[],[[31,[30]]]],[[],36],[[],37],[[],38],[[],[[34,[2,2]]]],[[],39],[[],39],[[],[[31,[28]]]],[[],39],[[],[[31,[27]]]],[[],[[31,[2]]]],0,[40,[[5,[27]]]],[40,[[5,[28]]]],[40,[[5,[29]]]],[40,[[5,[30]]]],[40,[[5,[14]]]],0,0,[[14,2],2],[[14,2]],[[27,21],22],[[28,21],22],[[29,21],22],[[30,21],22],[[14,21],22],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[14,6],2],0,0,[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,[[6,6],[[41,[14]]]],[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[27,42],5],[[28,42],5],[[29,42],5],[[30,42],5],[[14,42],5],0,0,0,0,0,0,0,0,0,0,0,0,0,[14,2],[[]],[[]],[[]],[[]],[[]],0,0,0,0,[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],0,0,[[],9],[[],9],[[],9],[[],9],[[],9],0,0,0,0,0,0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],0,0,0,[[43,2],44],[[]],[[]],0,[[]],[6,[[44,[45]]]],[[]],[[]],0,[6,43],[[[43,[46]]],[[26,[46]]]],0,[[],5],[[],5],[[],9],[[]],[[43,[31,[2]]],44],0,[[]],[[]],[47,48],[47,48],[47,[[51,[[50,[49]]]]]],[47,47],[[]],[47,37],[[47,52],[[51,[[50,[49]]]]]],[[47,21],22],[[]],[[]],[[]],[[47,6],[[48,[2]]]],[[47,6],[[48,[2]]]],[[]],[53,39],[[47,2],[[51,[[50,[49]]]]]],[[47,6],[[48,[[26,[52]]]]]],0,0,[[47,52],[[51,[[50,[49]]]]]],[[]],[[],5],[[],5],[[],9],[[]],0,[[]],[[]],[33,33],[[]],[[],33],[40,[[5,[33]]]],[[33,21],22],[[]],[[]],[[]],[[[34,[2,33]],6,6],33],0,[[]],[[33,6,6],2],0,[[2,[34,[2,2]]],33],[[33,42],5],[[]],[[],5],[[],5],[[],9],[[]],0,[[]],[[]],[10,2],[54,54],[[]],[[54,21],22],[[]],0,[[]],[[]],[[6,55],2],[[]],[[54,56,10],41],[[6,6,6],[[44,[54]]]],0,[[54,6,6,6,10],41],[[54,6,6,10],41],0,[[]],[[],5],[[],5],[[],9],[[]],0,0,[57,58],0,[[57,6],2],[[]],[[]],[[57,6],[[26,[2]]]],[57,[[26,[2]]]],[[57,6],[[26,[2]]]],0,[[]],[57,33],[[57,6],33],[57,2],[[]],0,[[57,6,6,39,6]],[[57,6,6],2],[[59,10,3,60,6],57],[57,2],0,[[57,6,6,6],[[41,[39]]]],[57,[[41,[61]]]],[[57,6,6],[[41,[61]]]],[[57,62]],[[57,62]],[57],[57],[[57,6,6],2],0,0,[[57,6,6],2],[[57,6],[[41,[2]]]],[[],5],[[],5],[[],9],0,[[]],0,[59,2],[59,2],[[]],[[]],[[]],0,[59,2],[[]],[[59,63],2],[59,39],[59,39],[59,39],[[59,14],2],[59,[[26,[64]]]],[59,[[26,[64]]]],[59,[[26,[64]]]],[[62,6],59],[59,2],[6,2],0,[59,[[31,[2]]]],[[59,6],[[31,[2]]]],[[59,10]],[59,39],[[],5],[[],5],[[],9],[[]],0,0,0,0,0,0,[[]],[[]],[[]],[[]],[10],[15,15],[60,60],[[]],[[]],[47,15],[[],15],[65,15],[[],60],[60,39],[[60,32,10],60],[[60,21],22],[[]],[[]],[[2,10],60],[[60,10],60],[[]],[[]],[[]],[[]],[60,2],[[]],[[]],[60,39],[60,39],[60,39],[60,39],0,[[6,6,32,10],2],[[]],[[]],[[],5],[[],5],[[],5],[[],5],[[],9],[[],9],[[52,10],2],0,[60,[[31,[2]]]],[60,2],[60,2],[60,2],[60,2],[60,2],[60,66],[[]],[[]],0,0,0,0,[[]],[[]],[36,36],[[]],[[],36],[40,[[5,[36]]]],[40,[[5,[36]]]],[[36,36],39],[[],39],[[],39],[[36,21],22],[[36,21],22],[[]],[[]],[[]],[6,36],[[]],[[36,42],5],[[]],[[],2],[[],5],[[],5],[[],9],[[]],0,0,0,0,[[]],[[]],[38,38],[[]],[[],38],[40,[[5,[38]]]],[40,[[5,[38]]]],[[38,38],39],[[],39],[[],39],[[38,21],22],[[38,21],22],[[]],[[]],[[]],[6,38],[[]],[[38,42],5],[[]],[[],2],[[],5],[[],5],[[],9],[[]],0,0,[[]],[[]],[[]],[[]],[67,67],[68,68],[[]],[[]],0,[68,[[31,[2]]]],0,[[],67],[[],68],[[],2],[[],[[31,[67]]]],[40,[[5,[67]]]],[40,[[5,[68]]]],[[67,21],22],[[68,21],22],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[]],[[]],0,0,[[67,42],5],[[68,42],5],0,0,0,[67,2],[[]],[[]],0,[[],5],[[],5],[[],5],[[],5],[[],9],[[],9],[[]],[[]],0,0,0,[[69,16],[[44,[70]]]],[[]],[[]],[69,69],[[]],[16,[[44,[70]]]],0,[[],69],[[],66],[[70,16],[[44,[39]]]],0,[40,[[5,[69]]]],[69],0,[[69,69],39],[6,2],[[69,21],22],[[69,21],22],[[]],[[69,71]],[6,[[44,[69,45]]]],[[]],[[]],[[69,69]],0,[6,[[34,[2,2]]]],0,[[]],0,[69,[[34,[2,2]]]],0,[[[34,[2,2]]],2],0,[69,2],[[16,39,39,6],[[44,[[31,[69]]]]]],0,0,0,0,0,0,[[69,69],[[26,[72]]]],0,[6,35],0,[[6,6,39,16],[[44,[69]]]],[[69,42],5],[69,2],[[69,6]],0,[[]],[[],2],[[],5],[[],5],[[],9],[[69,16],[[44,[39]]]],[[]],0,0,0,0,0,0,0,0,[[]],[[]],[73,73],[[]],[[],73],[[73,21],22],[[]],[[]],[[]],[[6,2],73],[73,2],[[]],[[]],[[],2],[[],5],[[],5],[[],9],[[]],0,[[]],[[]],[74,74],[[]],[40,[[5,[74]]]],[[74,21],22],[[74,21],22],[6,[[26,[74]]]],[[]],[[]],[[]],[[74,6,14],2],[[]],[[74,73,14],41],[[],74],[[74,14],[[5,[[31,[2]],[50,[75]]]]]],[[74,6,14],41],[[74,68,14],41],[[74,42],5],[[74,14],2],[[74,14],2],[[]],[[],2],[[],5],[[],5],[[],9],[[]],[[74,6,6,39],41],0,0,0,0,0,[[]],[[]],[58,58],[[]],[[],58],[40,[[5,[58]]]],[40,[[5,[58]]]],[[58,58],39],[[],39],[[],39],[[58,21],22],[[58,21],22],[[]],[[]],[[]],[6,58],[[]],[[58,42],5],[[]],[[],2],[[],5],[[],5],[[],9],[[]],0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[71,71],[76,76],[77,77],[78,78],[[]],[[]],[[]],[[]],[[],71],[[],76],[[],77],[[],78],[[],2],[[],32],[[],39],[[],[[34,[2,2]]]],[[],2],[[],39],0,[40,[[5,[71]]]],[40,[[5,[76]]]],[40,[[5,[77]]]],[40,[[5,[78]]]],0,0,0,[[71,21],22],[[76,21],22],[[77,21],22],[[78,21],22],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[71,42],5],[[76,42],5],[[77,42],5],[[78,42],5],[[]],[[]],[[]],[[]],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],5],[[],9],[[],9],[[],9],[[],9],0,[[]],[[]],[[]],[[]],0,0,[[]],[[]],[[79,14],[[34,[2,2]]]],[[],79],[[79,21],22],[[]],[[6,55]],0,[[]],0,[[79,14,55,39],2],[[],5],[[],5],[[],9],[[]],0,0,0,0,0,0,[[]],[[]],[66,66],[[]],[[],66],[40,[[5,[66]]]],[40,[[5,[66]]]],[[66,66],39],[[66,21],22],[[66,21],22],[[]],[[]],[[]],[6,66],[[]],[[66,66],[[26,[72]]]],[[66,42],5],[[]],[[],2],[[],5],[[],5],[[],9],[[]],0,0,0,[[]],[[]],[16,16],[[]],[[]],[[]],[[]],[6,16],[[]],[[]],[[],5],[[],5],[[],9],[[]],0,0,0,0,[[],8],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[69]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[39,81,6,6,32,10,6],2],[[39,81,10],60],[84],[[[80,[[13,[10]]]],[80,[81]],84,85],[[5,[86,83]]]],[[62,3,[80,[[13,[10]]]],[80,[81]],[87,[2]]],83],[[],8],[[62,3,[80,[[13,[10]]]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[87,[2]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[78]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[76]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[71]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[71]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[71]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[87,[2]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[82,[77]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]],[87,[2]]],83],[[62,3,[80,[[13,[10]]]],[80,[81]]],83],[[],8],0,[[]],[[]],[88,88],[[]],[[88,21],22],[[88,21],22],[[]],[[]],[[]],[89,2],[90,[[92,[91]]]],[[]],[[]],[[],2],[[],5],[[],5],[[],9],[[89,6],[[5,[88]]]],[[]],[[93,[34,[2,93]]],[[94,[93]]]],[6,17],[2,2],[[6,95],63],[6,96],[6,2]],"c":[],"p":[[3,"Ports"],[3,"String"],[3,"Uri"],[6,"BoxError"],[4,"Result"],[15,"str"],[3,"MethodRouter"],[3,"Router"],[3,"TypeId"],[3,"AppDBs"],[3,"Enforcer"],[3,"RwLock"],[3,"Arc"],[3,"Config"],[4,"SessionStoreDB"],[4,"UserStore"],[3,"Tera"],[3,"Context"],[3,"Command"],[3,"Cli"],[3,"Formatter"],[6,"Result"],[3,"ArgMatches"],[6,"Error"],[3,"Id"],[4,"Option"],[3,"SubMenuItem"],[3,"WebMenuItem"],[3,"UiConfig"],[3,"ServPath"],[3,"Vec"],[15,"u64"],[3,"Local"],[3,"HashMap"],[15,"u8"],[4,"TotpAlgorithm"],[15,"usize"],[4,"TotpMode"],[15,"bool"],[8,"Deserializer"],[6,"Result"],[8,"Serializer"],[3,"Entries"],[6,"Result"],[3,"ParseIntError"],[8,"Entry"],[3,"FileStore"],[6,"Result"],[8,"Future"],[3,"Box"],[3,"Pin"],[3,"Session"],[3,"DirEntry"],[3,"MailMessage"],[3,"ConfigPaSeToken"],[3,"Message"],[3,"ReqHandler"],[4,"UserRole"],[3,"ReqHeaderMap"],[3,"AuthState"],[3,"TOTP"],[3,"HeaderMap"],[4,"SocketAddr"],[4,"IpAddr"],[3,"SqliteSessionStore"],[4,"UserStatus"],[3,"TraceContent"],[3,"TraceData"],[3,"User"],[15,"i64"],[3,"UserData"],[4,"Ordering"],[4,"UserAction"],[3,"UserId"],[8,"Error"],[3,"UserLogin"],[3,"UserItem"],[3,"UserInvitation"],[3,"UserNotifyData"],[3,"Extension"],[3,"Cookies"],[3,"Json"],[6,"Response"],[6,"Request"],[3,"Next"],[8,"IntoResponse"],[3,"Path"],[3,"VerifyError"],[8,"AsRef"],[3,"SaltString"],[3,"PasswordHash"],[6,"Result"],[4,"Value"],[6,"Result"],[15,"u16"],[15,"u32"]]}\ +}'); +if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)}; +if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex}; diff --git a/resources/sitehome_model/srcdocserver/settings.html b/resources/sitehome_model/srcdocserver/settings.html new file mode 100644 index 0000000..7781821 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/settings.html @@ -0,0 +1,26 @@ +Rustdoc settings
+ + + +

Rustdoc settings

Back
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/source-files.js b/resources/sitehome_model/srcdocserver/source-files.js new file mode 100644 index 0000000..b0d8cb6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/source-files.js @@ -0,0 +1,4 @@ +var sourcesIndex = JSON.parse('{\ +"docserver":["",[["defs",[],["appdbs.rs","cli.rs","config.rs","entries.rs","filestore.rs","local.rs","mailer.rs","req_handler.rs","req_headermap.rs","session.rs","totp_algorithm.rs","totp_mode.rs","tracedata.rs","user.rs","user_action.rs","user_id.rs","user_role.rs","userdata.rs","usernotifydata.rs","userstatus.rs","userstore.rs"]],["handlers",[],["admin_handlers.rs","other_handlers.rs","pages_handlers.rs","users_handlers.rs"]]],["defs.rs","handlers.rs","login_password.rs","main.rs","tera_tpls.rs","tools.rs"]]\ +}'); +createSourceSidebar(); diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs.rs.html new file mode 100644 index 0000000..33c1238 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs.rs.html @@ -0,0 +1,213 @@ +defs.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+
mod config;
+mod cli;
+mod filestore;
+mod session;
+mod userdata;
+mod usernotifydata;
+mod entries;
+mod user;
+mod userstore;
+mod userstatus;
+#[cfg(feature = "authstore")]
+mod authz;
+mod appdbs;
+mod req_headermap;
+mod req_handler;
+mod user_id;
+mod user_action;
+mod user_role;
+mod tracedata;
+mod local;
+mod mailer;
+mod totp_mode;
+mod totp_algorithm;
+
+pub(crate) use appdbs::AppDBs;
+pub(crate) use session::{
+    SessionStoreDB,
+    AuthState,
+//     Random,
+};
+pub(crate) use filestore::FileStore;
+pub(crate) use user::User;
+pub(crate) use userstore::UserStore;
+pub(crate) use userstatus::UserStatus;
+pub(crate) use userdata::{
+    UserData,
+    UserLogin,
+    UserItem,
+    UserInvitation,
+};
+pub(crate) use usernotifydata::UserNotifyData;
+#[cfg(feature = "authstore")]
+pub(crate) use authz::AuthStore;
+pub(crate) use user_role::UserRole;
+pub(crate) use config::{ServPath,Config};
+pub(crate) use cli::parse_args;
+pub(crate) use req_handler::ReqHandler;
+pub(crate) use req_headermap::ReqHeaderMap;
+pub(crate) use user_id::UserId;
+pub(crate) use user_action::UserAction;
+pub(crate) use tracedata::TraceData;
+pub(crate) use local::Local;
+pub(crate) use mailer::MailMessage;
+
+pub(crate) use totp_algorithm::{TotpAlgorithm,deserialize_totp_algorithm};
+pub(crate) use totp_mode::{TotpMode, deserialize_totp_mode};
+
+pub const TOKEN_KEY_VALUE: &str = "tii-cl";
+pub const TOKEN_AUTH_VALUE: &str = "tii-cl-token";
+pub const CLAIM_UID: &str = "uid";
+pub const CLAIM_AUTH: &str = "auth";
+pub const CLAIM_APP_KEY: &str = "app_key";
+pub const USER_DATA: &str = "user_data";
+pub const BEARER: &str = "Bearer"; 
+pub const USER_AGENT: &str = "user-agent"; 
+pub const FILE_SCHEME: &str = "file:///"; 
+
+pub const SESSION_ID: &str = "sid"; 
+pub const ACCEPT_LANGUAGE: &str = "accept-language"; 
+pub const X_INTERNAL: &str = "x-internal"; 
+pub const X_REAL_IP: &str = "x-real-ip";
+pub const X_FORWARDED_FOR: &str = "x-forwarded-for";
+pub const AUTHORIZATION: &str = "authorization"; 
+pub const REFERER: &str = "referer"; 
+/*
+pub const SID: &str = "sid";
+pub const UI_SETTINGS_FILE: &str = "ui_settings.json";
+*/
+#[allow(dead_code)]
+pub const LOGS_SESSION_COOKIE_NAME: &str = "tiicl_session";
+#[allow(dead_code)]
+pub const SID_REQUESTS_FILE: &str = "sid_requests.json"; 
+#[allow(dead_code)]
+pub const SID_SETTINGS_FILE: &str = "sid_settings.json";
+#[allow(dead_code)]
+pub const SID_TRACE_FILE: &str = "sid_trace.json";
+#[allow(dead_code)]
+pub const HELP_URI: &str = "help";
+#[allow(dead_code)]
+pub const HELP_EXT: &str = "_help";
+#[allow(dead_code)]
+pub const TEMPLATE_EXT: &str = "txt";
+#[allow(dead_code)]
+pub const LOG_REQ: &str = "logreq";
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/appdbs.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/appdbs.rs.html new file mode 100644 index 0000000..8525387 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/appdbs.rs.html @@ -0,0 +1,166 @@ +appdbs.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+

+use tera::{Tera,Context};
+#[cfg(feature = "casbin")]
+use casbin::{CoreApi,Enforcer};
+#[cfg(feature = "casbin")]
+use std::{
+    path::Path,
+    sync::Arc,
+};
+use tokio::sync::RwLock;
+
+use crate::defs::{
+    Config,
+    SessionStoreDB,
+    UserStore,
+};
+#[cfg(feature = "authstore")]
+use crate::defs::AuthStore;
+
+#[derive(Clone)]
+pub struct AppDBs {
+    pub config: Config,
+    #[cfg(feature = "authstore")]
+    pub auth_store: AuthStore,
+    #[cfg(feature = "casbin")]
+    pub enforcer: Arc<RwLock<Enforcer>>,
+    pub sessions_store_db: SessionStoreDB,
+    pub user_store: UserStore,
+    pub tera: Tera,
+    pub context: Context,
+}
+impl AppDBs {
+    #[cfg(feature = "authstore")]
+    pub fn new(config: &Config, store: SessionStoreDB, user_store: UserStore, tera: Tera, context: Context) -> Self {
+        Self {
+            config: config.to_owned(),
+            auth_store: AuthStore::new(&config.authz_store_uri),
+            sessions_store_db: store,
+            user_store,
+            tera,
+            context,
+        }
+    } 
+    #[cfg(feature = "casbin")]
+    pub fn new(config: &Config, store: SessionStoreDB, user_store: UserStore, enforcer: Arc<RwLock<Enforcer>>, tera: Tera, context: Context) -> Self {
+        Self {
+            config: config.to_owned(),
+            enforcer,
+            sessions_store_db: store,
+            user_store,
+            tera,
+            context,
+        }
+    } 
+    #[cfg(feature = "casbin")]
+    pub async fn create_enforcer(model_path: &'static str, policy_path: &'static str) -> Arc<RwLock<Enforcer>> {
+        if ! Path::new(&model_path).exists() {
+            panic!("model path: {} not exists",&model_path);
+        }
+        if ! Path::new(&policy_path).exists() {
+            panic!("policy path: {} not exists",&policy_path);
+        }
+        let e = Enforcer::new(model_path, policy_path)
+            .await
+            .expect("can read casbin model and policy files");
+        Arc::new(RwLock::new(e))
+  }
+}
+
+
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/cli.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/cli.rs.html new file mode 100644 index 0000000..707990a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/cli.rs.html @@ -0,0 +1,216 @@ +cli.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+

+use clap::Parser;
+
+use pasetoken_lib::pasetoken::ConfigPaSeToken;
+//use pasetors::footer::Footer;
+
+use crate::{PKG_NAME,PKG_VERSION};
+
+use crate::tools::generate_uuid;
+
+// Use `clap` to parse command line options with `derive` mode 
+#[derive(Parser, Debug)]
+pub struct Cli {
+
+    /// * Configuration TOML file-path to run `WebServer` REQUIRED
+    #[clap(short = 'c', long = "config", value_parser, display_order=1)]
+    pub config_path: Option<String>,
+
+    /// Generate id key for identification
+    #[clap(short = 'i', long = "id",  action, display_order=2)]
+    pub create_id: bool,
+
+    /// Path to generate PaSeTo public and secret keys to use for tokens
+    #[clap(short = 'p', long = "pasetoken", value_parser, display_order=3)]
+    pub pasetokeys_path: Option<String>,
+
+    /// Settings-toml-file to Generate PaSeTo Token (-o to filepath)
+    #[clap(short = 't', long = "token", value_parser, display_order=4)]
+    pub make_token: Option<String>,
+
+    /// Output path to save generated token with `make_token` (-t)
+    #[clap(short = 'o', long = "output", value_parser, display_order=5)]
+    pub output_path: Option<String>,
+
+    /// Show version 
+    #[clap(short = 'v', long = "version", action, display_order=6)]
+    pub version: bool,
+}
+
+
+/// Runs some options from command line like: genererate id, PaSeTo keys, Token. 
+/// Set TOML config-path to load web-server settings 
+pub fn parse_args() -> String {
+    let args = Cli::parse();
+    if let Some(pasetokeys_path) = args.pasetokeys_path {
+        match pasetoken_lib::generate_keys(&pasetokeys_path,false) {
+            Ok(_) => println!("PaSeTo keys generated to: {}", &pasetokeys_path),
+            Err(e) => eprint!("Error generating keys: {}",e),
+        };
+        std::process::exit(0);
+    }
+    let output_path = if let Some(out_path) = args.output_path {
+        out_path
+    } else {
+        String::from("")
+    };
+    if let Some(def_path) = args.make_token {
+        match ConfigPaSeToken::token_from_file_defs(&def_path, &output_path) {
+            Ok(token) => {
+                if output_path.is_empty() {
+                    println!("{}",&token)
+                } else {
+                    println!("Token from defs {} generated to {}",&def_path,&output_path)
+                }
+            },
+            Err(e) => {
+                if output_path.is_empty() {
+                    eprintln!("Error generating token from file defs {} error: {}",
+                        &def_path, e
+                    )
+                } else {
+                    eprintln!("Error generating token from file defs {} to {} error: {}",
+                        &def_path, &output_path, e
+                    )
+                }
+            },
+        }; 
+        std::process::exit(0);
+    }
+    if args.create_id {
+        println!("{}",generate_uuid(String::from("abcdef0123456789")));
+        std::process::exit(0);
+    }
+    if args.version {
+        println!("{} version: {}",PKG_NAME,PKG_VERSION);
+        std::process::exit(0);
+    }
+
+    let config_path = args.config_path.unwrap_or(String::from(""));
+    if config_path.is_empty() {
+        eprintln!("No config-file found");
+        std::process::exit(2);
+    } 
+    config_path
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/config.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/config.rs.html new file mode 100644 index 0000000..7c0aeac --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/config.rs.html @@ -0,0 +1,729 @@ +config.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+
use std::collections::HashMap;
+use serde::{Serialize, Deserialize};
+//use serde_json::value::{to_value, Value};
+//use log::error;
+use std::io::{Error, ErrorKind, Result};
+
+use pasetoken_lib::ConfigPaSeToken;
+use pasetors::footer::Footer;
+
+use crate::{
+    CFG_FILE_EXTENSION,
+    FILE_SCHEME,
+    defs::{
+        Local, TotpAlgorithm, TotpMode,
+        deserialize_totp_algorithm,
+        deserialize_totp_mode,
+    },
+}; 
+
+use std::path::Path;
+
+// use crate::tools::generate_uuid;
+
+// fn default_config_empty() -> String {
+//   "".to_string()
+// }
+// fn default_config_items() -> HashMap<String,String> {
+//   HashMap::new()
+// }
+fn default_config_resource() -> String {
+  "/".to_string()
+}
+fn default_config_array_resource() -> Vec<String> {
+  Vec::new()
+}
+fn default_config_serv_paths()-> Vec<ServPath> {
+  Vec::new()
+}
+fn default_config_dflt_lang() -> String {
+  "en".to_string()
+}
+// fn default_server_uid() -> String {
+//     generate_uuid(String::from("abcdef0123456789"))
+// }
+fn default_config_org() -> String {
+  "".to_string()
+}
+fn default_config_empty() -> String {
+  "".to_string()
+}
+fn default_config_locales() -> HashMap<String,Local> {
+  HashMap::new()
+}
+fn default_config_tpls() -> HashMap<String,String> {
+  HashMap::new()
+}
+fn default_is_restricted() -> bool {
+  false
+}
+fn default_config_use_mail() -> bool {
+  false
+}
+fn default_config_use_random() -> bool {
+   false
+}
+fn default_config_invite_expire() -> u64 {
+  300
+}
+fn default_config_web_menu_items() -> Vec<WebMenuItem> {
+    Vec::new()
+}
+fn default_web_menu_item_roles() -> Vec<String> {
+    Vec::new()
+}
+fn default_sub_menu_items() -> Vec<SubMenuItem> {
+    Vec::new()
+}
+fn default_config_totp_digits() -> usize {
+    6
+}
+fn default_config_totp_algorithm() -> TotpAlgorithm {
+    TotpAlgorithm::default()
+}
+fn default_config_totp_mode() -> TotpMode {
+    TotpMode::default()
+}
+fn default_config_password_score() -> u8 {
+    0
+}
+#[derive(Debug, Clone, Serialize, Deserialize,Default)]
+pub struct SubMenuItem {
+        #[serde(default = "default_config_empty")]
+    pub typ: String,
+        #[serde(default = "default_config_empty")]
+    pub srctyp: String,
+        #[serde(default = "default_config_empty")]
+    pub text: String,
+        #[serde(default = "default_config_empty")]
+    pub url: String,
+        #[serde(default = "default_web_menu_item_roles")]
+    pub roles: Vec<String>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize,Default)]
+pub struct WebMenuItem {
+        #[serde(default = "default_config_empty")]
+    pub typ: String,
+        #[serde(default = "default_config_empty")]
+    pub srctyp: String,
+        #[serde(default = "default_config_empty")]
+    pub text: String,
+        #[serde(default = "default_config_empty")]
+    pub url: String,
+        #[serde(default = "default_web_menu_item_roles")]
+    pub roles: Vec<String>,
+        #[serde(default = "default_sub_menu_items")]
+    pub items: Vec<SubMenuItem>,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize,Default)]
+pub struct UiConfig {
+        #[serde(default = "default_config_empty")]
+    pub css_link: String,
+        #[serde(default = "default_config_empty")]
+    pub js_link: String,
+        #[serde(default = "default_config_empty")]
+    pub other_css_link: String,
+        #[serde(default = "default_config_empty")]
+    pub other_js_link: String,
+        #[serde(default = "default_config_empty")]
+    pub main_js_link: String,
+        #[serde(default = "default_config_empty")]
+    pub utils_js_link: String,
+        #[serde(default = "default_config_web_menu_items")]
+    pub web_menu_items: Vec<WebMenuItem>,
+} 
+
+/// ServPath collects dir path to server as static content
+#[derive(Debug, Clone, Serialize, Deserialize,Default)]
+pub struct ServPath {
+        #[serde(default = "default_config_empty")]
+    pub src_path: String,
+        #[serde(default = "default_config_empty")]
+    pub url_path: String,
+        #[serde(default = "default_config_empty")]
+    pub not_found: String,
+        #[serde(default = "default_config_empty")]
+    pub not_auth: String,
+        #[serde(default = "default_is_restricted")]
+    pub is_restricted: bool,
+        #[serde(default = "default_config_empty")]
+    pub redirect_to: String,
+}
+/// Config collects config values.
+#[derive(Debug, Clone, Serialize, Deserialize,Default)]
+pub struct Config {
+    pub hostport: String,
+    pub bind: String,
+    pub port: u16,
+    pub protocol: String,
+        #[serde(default = "default_config_org")]
+    pub org: String,
+    pub name: String,
+    pub verbose: u8,
+    pub prefix: String,
+    pub resources_path: String,
+    pub cert_file: String,
+    pub key_file: String,
+    //pub certs_store_path: String,
+    //pub cert_file_sufix: String,
+        #[serde(default = "default_config_array_resource")]
+    pub allow_origin: Vec<String>,
+        #[serde(default = "default_config_array_resource")]
+    pub langs: Vec<String>,
+        #[serde(default = "default_config_dflt_lang")]
+    pub dflt_lang: String,
+        #[serde(default = "default_config_empty")]
+    pub path_locales_config: String,
+        #[serde(default = "default_config_locales")]
+    pub locales: HashMap<String,Local>,
+
+    // Some paths 
+        #[serde(default = "default_config_resource")]
+    pub root_path: String,
+        #[serde(default = "default_config_resource")]
+    pub defaults_path: String,
+        #[serde(default = "default_config_serv_paths")]
+    pub serv_paths: Vec<ServPath>,
+        #[serde(default = "default_config_resource")]
+    pub docs_index: String,
+
+        #[serde(default = "default_config_resource")]
+    pub templates_path: String,
+        #[serde(default = "default_config_resource")]
+    pub html_url: String,
+        #[serde(default = "default_config_resource")]
+    pub assets_url: String,
+
+        #[serde(default = "default_config_resource")]
+    pub users_store_uri: String,
+        #[serde(default = "default_config_empty")]
+    pub user_store_access: String,
+
+        #[serde(default = "default_config_empty")]
+    pub signup_mode: String,
+        #[serde(default = "default_config_invite_expire")]
+    pub invite_expire: u64,
+        #[serde(default = "default_config_use_random")]
+    pub use_random: bool,
+        #[serde(default = "default_config_totp_digits")]
+    pub totp_digits: usize,
+        #[serde(default = "default_config_totp_mode", deserialize_with = "deserialize_totp_mode")]
+    pub totp_mode: TotpMode,
+        #[serde(default = "default_config_totp_algorithm", deserialize_with = "deserialize_totp_algorithm")]
+    pub totp_algorithm: TotpAlgorithm,
+
+        #[serde(default = "default_config_password_score")]
+    pub password_score: u8,
+        #[serde(default = "default_config_empty")]
+    pub admin_fields: String,
+        #[serde(default = "default_config_empty")]
+    pub mail_from: String,
+        #[serde(default = "default_config_empty")]
+    pub mail_reply_to: String,
+
+        #[serde(default = "default_config_use_mail")]
+    pub use_mail: bool,
+        #[serde(default = "default_config_empty")]
+    pub smtp: String,
+        #[serde(default = "default_config_empty")]
+    pub smtp_auth: String,
+
+    #[cfg(feature = "authstore")]
+        #[serde(default = "default_config_resource")]
+    pub authz_store_uri: String,
+    #[cfg(feature = "casbin")]
+        #[serde(default = "default_config_empty")]
+    pub authz_model_path: String,
+    #[cfg(feature = "casbin")]
+        #[serde(default = "default_config_empty")]
+    pub authz_policy_path: String,
+        #[serde(default = "default_config_empty")]
+
+    pub session_store_uri: String,
+        #[serde(default = "default_config_empty")]
+    pub session_store_file: String,
+    pub session_expire: u64,
+
+    pub paseto: ConfigPaSeToken,
+
+    pub ui: UiConfig,
+
+        #[serde(default = "default_config_tpls")]
+    pub tpls: HashMap<String,String>,
+}
+
+impl Config {
+    fn fix_root_path<Config>(&mut self, root_path:  String ) { 
+        if root_path != self.root_path {
+            self.root_path = root_path.to_owned();
+        }
+        if self.root_path.is_empty() || ! Path::new(&self.root_path).exists() {
+            return;
+        }
+        if self.users_store_uri.starts_with(FILE_SCHEME) {
+            self.users_store_uri = format!("{}{}",
+                FILE_SCHEME, self.fix_item_path(self.users_store_uri.replace(FILE_SCHEME,"")));
+        } 
+        if self.session_store_uri.starts_with(FILE_SCHEME) {
+            self.session_store_uri = format!("{}{}",
+                FILE_SCHEME, self.fix_item_path(self.session_store_uri.replace(FILE_SCHEME,"")));
+        }
+        self.cert_file = self.fix_item_path(self.cert_file.to_owned());
+        self.key_file = self.fix_item_path(self.key_file.to_owned());
+        self.templates_path = self.fix_item_path(self.templates_path.to_owned());
+        self.defaults_path = self.fix_item_path(self.defaults_path.to_owned());
+        self.paseto.public_path = self.fix_item_path(self.paseto.public_path.to_owned());
+        self.paseto.secret_path = self.fix_item_path(self.paseto.secret_path.to_owned());
+        #[cfg(feature = "authstore")]
+        if self.authz_store_uri.starts_with(FILE_SCHEME) {
+            self.authz_store_uri = format!("{}{}", 
+                FILE_SCHEME, self.fix_item_path(self.authz_store_uri.replace(FILE_SCHEME,"")));
+        }
+        #[cfg(feature = "casbin")]
+        {
+            self.authz_model_path = self.fix_item_path(self.authz_model_path.to_owned());
+            self.authz_policy_path = self.fix_item_path(self.authz_policy_path.to_owned());
+        }
+        // Loading paseto 
+        (self.paseto.public_data, self.paseto.secret_data) = self.paseto.load_data();
+        self.paseto.footer = ConfigPaSeToken::make_footer(
+            self.paseto.map_footer.to_owned()
+        ).unwrap_or(Footer::new());
+    }
+    fn fix_item_path(&mut self, item: String ) -> String { 
+        if !item.is_empty() && ! Path::new(&item).exists() {
+            format!("{}/{}",&self.root_path,&item)
+        } else {
+            item
+        }
+    }
+    pub fn load_items(&mut self ) { 
+        self.fix_root_path::<Config>(self.root_path.to_owned());
+    } 
+    #[allow(dead_code)] 
+    pub fn to_json(&self) -> String {
+        serde_json::to_string(self).unwrap_or_else(|e|{
+            println!("Error to convert Config to json: {}",e);
+            String::from("")
+        })
+    }
+    // #[allow(dead_code)] 
+    // pub fn st_html_path(&self) -> &'static str  {
+    //     Box::leak(self.html_path.to_owned().into_boxed_str())
+    // }
+    #[allow(dead_code)] 
+    pub fn full_html_url(&self, url: &str) -> String {
+        format!("{}://{}:{}/{}",
+            &self.protocol,&self.bind,&self.port,
+            url
+        )
+    }
+    pub fn load_from_file<'a>(file_cfg: &str, name: &str) -> Result<Self> { 
+        let item_cfg: Self;
+        let file_path: String;
+        if file_cfg.contains(CFG_FILE_EXTENSION) {
+            file_path = file_cfg.to_string();
+        } else { 
+            file_path = format!("{}{}",file_cfg.to_string(),CFG_FILE_EXTENSION);
+        }
+        let config_content:  &'a str;
+        match std::fs::read_to_string(&file_path) {
+            Ok(cfgcontent) => config_content = Box::leak(cfgcontent.into_boxed_str()),
+            Err(e) => 
+                return Err(Error::new(
+                    ErrorKind::InvalidInput,
+                    format!("Error read {}: {}",&file_path,e)
+                )),
+        };
+        // match toml::from_str::<T>(&config_content) {
+        match toml::from_str::<Self>(&config_content) {
+            Ok(cfg) => item_cfg = cfg, 
+            Err(e) => return Err(Error::new(
+                ErrorKind::InvalidInput,
+                format!("Error loading config {}: {}",&file_path,e)
+            )),
+        };
+        log::info!("Loaded {} config from: {}", &name, &file_path);
+        Ok(item_cfg)
+    } 
+
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/entries.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/entries.rs.html new file mode 100644 index 0000000..f15f81d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/entries.rs.html @@ -0,0 +1,247 @@ +entries.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+
/// Generic `Iterator` over implementor's of
+/// [`Entry`](trait.Entry.html)'s.
+///
+/// # Examples
+///
+/// #### Iterate over /etc/passwd printing usernames
+///
+/// ```
+/// use std::path::Path;
+/// use pgs_files::passwd::PasswdEntry;
+/// use pgs_files::Entries;
+///
+/// for entry in Entries::<PasswdEntry>::new(&Path::new("/etc/passwd")) {
+///     println!("{}", entry.name);
+/// }
+/// ```
+
+use std::{
+    io::{BufRead,BufReader,Write},
+    fs::{OpenOptions,File},
+    path::Path,
+    marker::PhantomData,
+    num::ParseIntError,
+};
+
+pub struct Entries<T> {
+    path: String,
+    cursor: BufReader<File>,
+    marker: PhantomData<T>,
+}
+
+impl<T> Entries<T> {
+    pub fn new(file_path: &str) -> Entries<T> {
+        let file = Path::new(&file_path);
+        if ! file.exists()  {
+            File::create(file).unwrap_or_else(|e|{
+               eprintln!("Error file: {}",e);
+               std::process::exit(2)
+            });
+        }
+        let reader = BufReader::new(File::open(file).ok().unwrap());
+        Entries {
+            path: file_path.to_owned(),
+            cursor: reader,
+            marker: PhantomData,
+        }
+    }
+    pub fn append(&self, entry: String) -> anyhow::Result<()> {
+        let file = Path::new(&self.path);
+        if ! file.exists()  {
+            std::fs::write(file,format!("{}\n",entry).as_bytes())?;
+        } else {
+            let target_file = OpenOptions::new()
+                .write(true)
+                .append(true) // This is needed to append to file
+                .open(&file);
+            if let Ok(mut file) = target_file {
+                file.write_all( format!("{}\n",entry).as_bytes())?;
+            }
+        }
+        Ok(())
+    }
+    pub fn write(&self, entries: &Vec<String>) -> anyhow::Result<()> {
+        let file = Path::new(&self.path);
+        std::fs::write(file,format!("{}\n",entries.clone().join("\n")).as_bytes())?;
+        // let target_file = OpenOptions::new()
+        //     .write(true)
+        //     .open(&file);
+        // if let Ok(mut file) = target_file {
+        //     file.write_all(entries.clone().join("\n").as_bytes())?;
+        // }
+        Ok(())
+    }
+}
+
+
+impl<T: Entry> Iterator for Entries<T> {
+
+    type Item = T;
+
+    fn next(&mut self) -> Option<T> {
+        let mut line = String::new();
+        loop {
+            // We might need to make multiple loops to drain off
+            // comment lines. Start with an empty string per loop.
+            line.clear();
+            match self.cursor.read_line(&mut line){
+                Ok(0) => return None,
+                Ok(_) => (),
+                _     => return None,
+            }
+
+            if line.starts_with("#") {
+                continue;
+            }
+
+            match T::from_line(&line) {
+                Ok(entry) => return Some(entry),
+                // Parse Error. Just ignore this entry.
+                _         => (),
+            }
+        }
+    }
+
+}
+
+/// A Trait to represent an entry of data from an
+/// /etc/{`passwd`,`group`,`shadow`} file.
+pub trait Entry: Sized {
+    fn from_line(line: &str) -> anyhow::Result<Self, ParseIntError>;
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/filestore.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/filestore.rs.html new file mode 100644 index 0000000..181fe61 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/filestore.rs.html @@ -0,0 +1,761 @@ +filestore.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+

+use async_session::{Result, Session, SessionStore};
+use anyhow::anyhow;
+use async_trait::async_trait;
+use std::{
+    fs,
+    path::Path,
+};
+use walkdir::{DirEntry, WalkDir};
+use binascii::bin2hex;
+
+#[allow(unused)]
+fn is_hidden(entry: &DirEntry) -> bool {
+    entry.file_name()
+        .to_str()
+        .map(|s| s.starts_with("."))
+        .unwrap_or(false)
+}
+#[derive(Debug, Clone)]
+pub struct FileStore {
+    pub sess_path: String,
+    pub ses_file: String,
+}
+#[async_trait]
+impl SessionStore for FileStore {
+    async fn load_session(&self, cookie_value: String) -> Result<Option<Session>> {
+        let id = Session::id_from_cookie_value(&cookie_value)?;
+        log::trace!("loading session by id `{}`", &id);
+        //dbg!("loading session by id `{}`", &id);
+        self.load_session_file(&id).await
+    }
+    async fn store_session(&self, session: Session) -> Result<Option<String>> {
+        log::trace!("storing session by id `{}`", session.id());
+        let id_filename = match self.get_path(session.id()) {
+            Ok(res) => res,
+            Err(e) => {
+                return Err(e);
+            }
+        };
+        // let mut out_buffer = [0u8; 100];
+        // let id_filename = if let Ok(res) = bin2hex(session.id().as_bytes(),&mut out_buffer) {
+        //    std::str::from_utf8(res)?.to_owned()
+        // } else {
+        //    return Ok(None);
+        // };
+        let sess_id_path = format!("{}/{}", self.sess_path, &id_filename);
+        if ! Path::new(&sess_id_path).exists() {
+            fs::create_dir(&sess_id_path)?;
+        }
+        let content_session = serde_json::to_string(&session)?;
+        fs::write(&format!("{}/{}",&sess_id_path, self.ses_file), content_session)?;
+        //session.reset_data_changed(); // do not need is it is serialized in file write 
+        Ok(session.into_cookie_value())
+    }
+    async fn destroy_session(&self, session: Session) -> Result {
+        log::trace!("destroying session by id `{}`", session.id());
+        match self.get_path(session.id()) {
+            Ok(res) => match self.get_session_id_path(&res) {
+                Ok(session_id_path) => Ok(fs::remove_file(&session_id_path)?),
+                Err(e) => Err(e),
+            },
+            Err(e) => Err(e) 
+        }
+        // let mut out_buffer = [0u8; 100];
+        // if let Ok(res) = bin2hex(session.id().as_bytes(),&mut out_buffer) {
+        //     let id_filename = std::str::from_utf8(res)?.to_owned();
+        //     Ok(fs::remove_file(
+        //         &format!("{}/{}/{}",self.sess_path, &id_filename, self.ses_file)
+        //     )?)
+        // } else {
+        //     Ok(())
+        // }
+    }
+    async fn clear_store(&self) -> Result {
+        log::trace!("clearing memory store");
+        let sess_path = format!("{}", self.sess_path);
+        fs::remove_dir_all(&sess_path)?;
+        fs::create_dir(&sess_path)?;
+        Ok(())
+    }
+}
+impl FileStore {
+    /// Create a new instance of FilesStore
+    pub fn check_paths(&self) -> Result {
+        if ! Path::new(&self.sess_path).exists() {
+            fs::create_dir(&self.sess_path)?;
+        }
+        Ok(())
+    }
+    pub fn get_path(&self,id: &str) -> Result<String> {
+        let mut out_buffer = [0u8; 100];
+        match bin2hex(&id.as_bytes(),&mut out_buffer) {
+            Ok(res) => Ok(std::str::from_utf8(res)?.to_owned()),
+            Err(e) => {
+                Err(anyhow!("Filename path {} not generated: {:?}", &id, &e))
+            }
+        } 
+    }
+    pub fn get_session_id_path(&self,id_filename: &str) -> Result<String> {
+        let session_id_path = format!("{}/{}/{}",self.sess_path, id_filename, &self.ses_file);
+        if ! Path::new(&session_id_path).exists() {
+           Err(anyhow!("Filename path {} not found: {}", id_filename, &session_id_path ))
+        } else {
+            Ok(session_id_path)
+        }
+    }
+    /// As session Id from `async_session` comes in base64 it will be not valid for OS filename 
+    /// `bin2hex` pass id to hex as bytes and from there to string or viceversa
+    pub async fn load_session_file(&self, id: &str) -> Result<Option<Session>> {
+        let session_id_path = match self.get_path(id) {
+            Ok(res) => match self.get_session_id_path(&res) {
+                Ok(path) => path,
+                Err(e) => return Err(e),
+            },
+            Err(e) => {
+                return Err(e);
+            }
+        };
+        // let mut out_buffer = [0u8; 100];
+        // let id_filename = if let Ok(res) = bin2hex(&id.as_bytes(),&mut out_buffer) {
+        //    std::str::from_utf8(res)?.to_owned()
+        // } else {
+        //    return Ok(None);
+        // };
+        // let session_id_path = format!("{}/{}/{}",self.sess_path, &id_filename, &self.ses_file);
+        // dbg!(&session_id_path);
+        if ! Path::new(&session_id_path).exists() {
+            dbg!("No path: {}", &session_id_path);
+            // let sess_id_path = format!("{}/{}", self.sess_path, &id_filename);
+            // if ! Path::new(&sess_id_path).exists() {
+            //     fs::create_dir(&sess_id_path)?;
+            // }
+            // create
+        }
+        if let Ok(session_content) = fs::read_to_string(&session_id_path) {
+            // match serde_json::from_str::<serde_json::Value>(&session_content) {
+            match serde_json::from_str::<Session>(&session_content) {
+                Ok(session) => {
+                    Ok(session.validate())
+                },
+                Err(e) => { 
+                    dbg!("Error loading session content from {}: {}",&session_id_path, e);
+                    //log::error!("Error loading session content from {}: {}",&session_id_path, e);
+                    Ok(None)
+                }
+            }
+        } else {
+            Ok(None)
+        }
+    }
+    #[allow(dead_code)]
+    pub async fn cleanup(&self) -> Result {
+        log::trace!("cleaning up file store...");
+        let mut count: usize = 0;
+        let sess_path = format!("{}", self.sess_path);
+        let walker = WalkDir::new(&sess_path).into_iter();
+        for entry in walker.filter_entry(|e| !is_hidden(e)) {
+            match entry {
+                Ok(dir_entry) => {
+                    // println!("{}", &dir_entry.path().display());
+                    if ! Path::new(&dir_entry.path()).is_dir() {
+                        continue;
+                    }
+                    let session_file = format!("{}/{}",&dir_entry.path().display(), &self.ses_file);
+                    let id_path = format!("{}",&dir_entry.path().display());
+                    let id = id_path.replace(&sess_path,"");
+                    if let Some(session) = self.load_session_file(&id).await.unwrap_or_default() {
+                        if session.is_expired() {
+                            let _ = fs::remove_file(&session_file);
+                            log::trace!("found {} expired session",&id_path);
+                            count +=1;
+                        }
+                    }
+                },
+                Err(e) =>  println!("Error on {}: {}", &sess_path, e)
+            }
+        }
+        log::trace!("found {} expired session {} cleaned",&sess_path, count);
+        Ok(())
+    }
+    #[allow(dead_code)]
+    pub async fn count(&self) -> usize {
+        let mut count: usize = 0;
+        let sess_path = format!("{}", self.sess_path);
+        let walker = WalkDir::new(&sess_path).into_iter();
+        for entry in walker.filter_entry(|e| !is_hidden(e)) {
+            match entry {
+                Ok(dir_entry) => {
+                    // println!("{}", &dir_entry.path().display());
+                    if ! Path::new(&dir_entry.path()).is_dir() {
+                        continue;
+                    }
+                    let session_file = format!("{}/{}",&dir_entry.path().display(), &self.ses_file);
+                    if Path::new(&session_file).exists() {
+                        count +=1;
+                    }
+                },
+                Err(e) =>  println!("Error on {}: {}", &sess_path, e)
+            }
+        }
+        count
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use async_std::task;
+    use std::time::Duration;
+    const TEST_SESS_FILESTORE: &str = "/tmp/test_sess_filestore";
+    const TEST_IDS_FILESTORE: &str = "/tmp/test_ids_filestore";
+
+    #[async_std::test]
+    async fn creating_a_new_session_with_no_expiry() -> Result {
+        let sess_path_store = format!("{}_0", TEST_SESS_FILESTORE);
+        let ids_path_store = format!("{}_0", TEST_IDS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let _ = fs::remove_dir_all(&ids_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+        let mut session = Session::new();
+        session.insert("key", "Hello")?;
+        let cloned = session.clone();
+        let cookie_value = store.store_session(session).await?.unwrap();
+        assert!(true);
+        let loaded_session = store.load_session(cookie_value).await?.unwrap();
+        assert_eq!(cloned.id(), loaded_session.id());
+        assert_eq!("Hello", &loaded_session.get::<String>("key").unwrap());
+        assert!(!loaded_session.is_expired());
+        assert!(loaded_session.validate().is_some());
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let _ = fs::remove_dir_all(&ids_path_store);
+        Ok(())
+    }
+    #[async_std::test]
+    async fn updating_a_session() -> Result {
+        let sess_path_store = format!("{}_1", TEST_SESS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+
+        let mut session = Session::new();
+
+        session.insert("key", "value")?;
+        let cookie_value = store.store_session(session).await?.unwrap();
+
+        let mut session = store.load_session(cookie_value.clone()).await?.unwrap();
+        session.insert("key", "other value")?;
+
+        assert_eq!(store.store_session(session).await?, None);
+        let session = store.load_session(cookie_value).await?.unwrap();
+        assert_eq!(&session.get::<String>("key").unwrap(), "other value");
+        fs::remove_dir_all(&sess_path_store)?;
+        Ok(())
+    }
+
+    #[async_std::test]
+    async fn updating_a_session_extending_expiry() -> Result {
+        let sess_path_store = format!("{}_2", TEST_SESS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+
+        let mut session = Session::new();
+        session.expire_in(Duration::from_secs(1));
+        let original_expires = session.expiry().unwrap().clone();
+        let cookie_value = store.store_session(session).await?.unwrap();
+
+        let mut session = store.load_session(cookie_value.clone()).await?.unwrap();
+
+        assert_eq!(session.expiry().unwrap(), &original_expires);
+        session.expire_in(Duration::from_secs(3));
+        let new_expires = session.expiry().unwrap().clone();
+        assert_eq!(None, store.store_session(session).await?);
+
+        let session = store.load_session(cookie_value.clone()).await?.unwrap();
+        assert_eq!(session.expiry().unwrap(), &new_expires);
+
+        task::sleep(Duration::from_secs(3)).await;
+        assert_eq!(None, store.load_session(cookie_value).await?);
+        fs::remove_dir_all(&sess_path_store)?;
+        Ok(())
+    }
+
+    #[async_std::test]
+    async fn creating_a_new_session_with_expiry() -> Result {
+        let sess_path_store = format!("{}_3", TEST_SESS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+
+        let mut session = Session::new();
+        session.expire_in(Duration::from_secs(3));
+        session.insert("key", "value")?;
+        let cloned = session.clone();
+
+        let cookie_value = store.store_session(session).await?.unwrap();
+
+        let loaded_session = store.load_session(cookie_value.clone()).await?.unwrap();
+        assert_eq!(cloned.id(), loaded_session.id());
+        assert_eq!("value", &*loaded_session.get::<String>("key").unwrap());
+
+        assert!(!loaded_session.is_expired());
+
+        task::sleep(Duration::from_secs(3)).await;
+        assert_eq!(None, store.load_session(cookie_value).await?);
+        fs::remove_dir_all(&sess_path_store)?;
+        Ok(())
+    }
+
+    #[async_std::test]
+    async fn destroying_a_single_session() -> Result {
+        let sess_path_store = format!("{}_4", TEST_SESS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+
+        for _ in 0..3i8 {
+            store.store_session(Session::new()).await?;
+        }
+        let cookie = store.store_session(Session::new()).await?.unwrap();
+        assert_eq!(4, store.count().await);
+        let session = store.load_session(cookie.clone()).await?.unwrap();
+        store.destroy_session(session.clone()).await?;
+        assert!(store.load_session(cookie).await.is_err());
+        assert_eq!(3, store.count().await);
+
+        // attempting to destroy the session again IS an ERROR, file should be deleted before
+        assert!(store.destroy_session(session).await.is_err());
+        fs::remove_dir_all(&sess_path_store)?;
+        Ok(())
+    }
+
+    #[async_std::test]
+    async fn clearing_the_whole_store() -> Result {
+        let sess_path_store = format!("{}_5", TEST_SESS_FILESTORE);
+        let _ = fs::remove_dir_all(&sess_path_store);
+        let store = FileStore {
+            sess_path: sess_path_store.to_owned(),
+            ses_file: String::from("session"),
+        };
+        store.check_paths()?;
+
+        for _ in 0..3i8 {
+            store.store_session(Session::new()).await?;
+        }
+        assert_eq!(3, store.count().await);
+        store.clear_store().await.unwrap();
+        assert_eq!(0, store.count().await);
+        fs::remove_dir_all(&sess_path_store)?;
+        Ok(())
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/local.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/local.rs.html new file mode 100644 index 0000000..f058bcb --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/local.rs.html @@ -0,0 +1,100 @@ +local.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+
use std::collections::HashMap;
+use serde::{Serialize, Deserialize};
+
+#[derive(Debug, Clone, Serialize, Deserialize ,Default)]
+pub struct Local {
+    pub id: String,
+    pub itms: HashMap<String,String>
+}
+
+impl Local {
+    pub fn new(id: String, itms: HashMap<String,String>) -> Self {
+        Self {
+            id,
+            itms
+        }
+    }
+    #[allow(dead_code)]
+    pub fn itm(&self, key: &str, dflt: &str) -> String {
+        match self.itms.get(key) {
+            Some(val) => format!("{}",val),
+            None => if dflt.is_empty() {
+                format!("{}",key)
+            } else {
+                format!("{}",dflt)
+            }
+        }
+    }
+    pub fn get_lang(locales: &HashMap<String, Local>, key: &str, dflt: &str) -> Local {
+        match  locales.get(key) {
+            Some(val) => val.to_owned(),
+            None =>  match locales.get(dflt) {
+                Some(val) => val.to_owned(),
+                None => Local::new(String::from(""),HashMap::new()),
+            }
+        }
+    }
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/mailer.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/mailer.rs.html new file mode 100644 index 0000000..3ac6abc --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/mailer.rs.html @@ -0,0 +1,329 @@ +mailer.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+
use lettre::{
+    transport::smtp::authentication::Credentials,
+    AsyncSmtpTransport,
+    AsyncTransport, 
+    Tokio1Executor,
+//    Address,
+    message::{
+       Mailbox,
+       header::ContentType,
+       MultiPart,
+       SinglePart,
+    },
+    Message,
+};
+
+use crate::defs::AppDBs;
+use pasetoken_lib::ConfigPaSeToken;
+use serde_json::json;
+
+#[derive(Clone,Debug)]
+pub struct MailMessage {
+    pub from: Mailbox,
+    pub to: Mailbox,
+    pub reply_to: Mailbox,
+}
+    
+impl MailMessage {
+     pub fn new(from: &str, to: &str, reply: &str) -> anyhow::Result<Self>  {
+        let reply_to = if reply.is_empty() {
+           to
+        } else {
+            reply
+        };
+        Ok(
+            Self { 
+                from: from.parse()?,
+                to: to.parse()?,
+                reply_to: reply_to.parse()?,
+            }
+        )
+    }
+    pub fn check(app_dbs: &AppDBs) -> String {
+        if app_dbs.config.smtp.is_empty() {
+            String::from("Error: no mail server")
+        } else if app_dbs.config.mail_from.is_empty() {
+            String::from("Error: no mail from address")
+        } else {
+            String::from("")
+        }
+    }
+    #[allow(dead_code)]
+    pub async fn send_message(&self, subject: &str, body: &str, app_dbs: &AppDBs) -> std::io::Result<()> {
+        match  Message::builder()
+            .from(self.from.to_owned())
+            .reply_to(self.reply_to.to_owned())
+            .to(self.to.to_owned())
+            .subject(subject)
+            .header(ContentType::TEXT_PLAIN)
+            .body(body.to_owned())
+        {
+            Ok(message) => self.mail_message(message, app_dbs).await,
+            Err(e) => 
+                return Err(std::io::Error::new(
+                    std::io::ErrorKind::NotFound,
+                    format!("ERROR: Invalid mail: {}",e)
+                ))
+        }
+    }
+    pub async fn send_html_message(&self, subject: &str, body: &str, html_body: &str, app_dbs: &AppDBs) -> std::io::Result<()> {
+        match  Message::builder()
+            .from(self.from.to_owned())
+            .reply_to(self.reply_to.to_owned())
+            .to(self.to.to_owned())
+            .subject(subject)
+            .multipart(
+            MultiPart::alternative() // This is composed of two parts.
+                .singlepart(
+                    SinglePart::builder()
+                        .header(ContentType::TEXT_PLAIN)
+                        .body(body.to_owned()),
+                )
+                .singlepart(
+                    SinglePart::builder()
+                        .header(ContentType::TEXT_HTML)
+                        .body(html_body.to_owned()),
+                ),
+            )
+        {
+            Ok(message) => self.mail_message(message, app_dbs).await,
+            Err(e) => 
+                return Err(std::io::Error::new(
+                    std::io::ErrorKind::NotFound,
+                    format!("ERROR: Invalid mail: {}",e)
+                ))
+        }
+    }
+    pub async fn mail_message(&self, message: Message, app_dbs: &AppDBs) -> std::io::Result<()> {
+        let mail_cred = crate::defs::MailMessage::get_credentials(&app_dbs.config.smtp_auth, &app_dbs.config.paseto);
+        if ! mail_cred.contains("|") {
+            return Err(std::io::Error::new(
+                std::io::ErrorKind::NotFound,
+                format!("ERROR: Invalid mail credentials")
+            )); 
+        }
+        let auth_data: Vec<String> = mail_cred.split("|").map(|s| s.to_string()).collect();
+        if auth_data.len() < 2 {
+            return Err(std::io::Error::new(
+                std::io::ErrorKind::NotFound,
+                format!("ERROR: Invalid mail credentials")
+            ));
+        }
+        let creds = Credentials::new(auth_data[0].to_owned(), auth_data[1].to_owned());
+        // Open a remote connection to gmail
+        let mailer: AsyncSmtpTransport<Tokio1Executor> =
+            AsyncSmtpTransport::<Tokio1Executor>::relay(&app_dbs.config.smtp)
+                .unwrap()
+                .credentials(creds)
+                .build();
+
+        // Send the email
+        match mailer.send(message).await {
+            Ok(_) => Ok(()),
+            Err(e) => Err(std::io::Error::new(
+                std::io::ErrorKind::NotConnected,
+                format!("ERROR: Could not send email: {e:?}")
+            ))
+        }
+    }
+    pub fn get_credentials(token: &str, paseto_config: &ConfigPaSeToken) -> String {
+        match paseto_config.pasetoken() {
+            Ok(paseto) => {
+                match paseto.trusted(token, false) {
+                    Ok(trusted_token) => {
+                        if let Some(claims) = trusted_token.payload_claims() {
+                            claims.get_claim("smtp_auth").unwrap_or(&json!("")).to_string().replace("\"","")
+                        } else {
+                            String::from("")
+                        }
+                    },
+                    Err(e) => {
+                        println!("Token not trusted: {}",e);
+                        String::from("")
+                    },
+                }
+            },
+            Err(e) => {
+                println!("Error collecting notify data: {}",e);
+                String::from("")
+            }
+        }
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/req_handler.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/req_handler.rs.html new file mode 100644 index 0000000..eff649c --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/req_handler.rs.html @@ -0,0 +1,1313 @@ +req_handler.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+
use axum::http::{header::{HeaderValue,CONTENT_TYPE, HeaderMap},uri::Uri};
+use html_minifier::HTMLMinifier;
+use std::io::{ErrorKind, Result};
+use std::{
+    error::Error,
+    path::Path,
+//    collections::HashMap,
+    str,
+};
+use tera::Context;
+use totp_rs::{Algorithm, TOTP, Secret};
+use rand::Rng;
+
+use crate::defs::{
+//    Config,
+    AppDBs,
+    ReqHeaderMap,
+    UserRole,
+    UserNotifyData,
+    Local,
+    User,
+//    AuthState,
+    // UserId,
+    // //    SESSION_ID,
+    HELP_URI,
+    HELP_EXT,
+    TEMPLATE_EXT,
+    TOKEN_AUTH_VALUE,
+    TOKEN_KEY_VALUE,
+};
+use crate::defs::session::AuthState;
+
+pub struct ReqHandler<'a> {
+    pub req_header: ReqHeaderMap,
+    pub app_dbs: &'a AppDBs,
+    pub lang: Local,
+    pub uri:  &'a Uri,
+    pub notify_data: UserNotifyData,
+    pub auth_state: AuthState,
+    pub req_name: String,
+    pub context: Context,
+}
+
+impl<'a> ReqHandler<'a> {
+    pub fn new(req_header: ReqHeaderMap, app_dbs: &'a AppDBs, uri: &'a Uri, auth_state: &'a AuthState, req_name: &str) -> Self {
+        let lang = Local::get_lang(&app_dbs.config.locales,&app_dbs.config.dflt_lang, &app_dbs.config.dflt_lang);
+        let ( _, notify_data) = req_header.req_user(&app_dbs);
+        // dbg!("{}",&notify_data);
+        let mut context = app_dbs.context.to_owned();
+        context.insert("site_name",&app_dbs.config.name);
+        context.insert("site_org", &app_dbs.config.org);
+        context.insert("lang", &lang.itms);
+        context.insert("req_name", &req_name);
+        context.insert("main_url", &format!("{}://{}",&app_dbs.config.protocol, &app_dbs.config.hostport));
+        context.insert("html_url", &app_dbs.config.html_url);
+        context.insert("assets_url", &app_dbs.config.assets_url);
+        context.insert("req_path", uri.path());
+        context.insert("css_link", &app_dbs.config.ui.css_link);
+        context.insert("js_link", &app_dbs.config.ui.js_link);
+        context.insert("other_css_link", &app_dbs.config.ui.other_css_link);
+        context.insert("other_js_link", &app_dbs.config.ui.other_js_link);
+        context.insert("main_js_link", &app_dbs.config.ui.main_js_link);
+        context.insert("utils_js_link", &app_dbs.config.ui.utils_js_link);
+        context.insert("web_menu_items", &app_dbs.config.ui.web_menu_items);
+        context.insert("usr_roles", &auth_state.user_roles());
+        let user_items = User::hash_items(&auth_state.user_items());
+        context.insert("usr_items", &user_items);
+        context.insert("usr_name", &auth_state.user_name());
+        if auth_state.is_admin() {
+            context.insert("isadmin", "TRUE");
+        }
+        context.insert("usr_email", &auth_state.user_email());
+        context.insert("session_expire", &app_dbs.config.session_expire);
+        context.insert("update_session_item", &format!("{}://{}/update_item",
+            &app_dbs.config.protocol, &app_dbs.config.hostport));
+        let user_id = auth_state.id();
+        let sid = if user_id.is_empty() || user_id == "No ID" {
+            String::from("") 
+        } else {
+            user_id.replace("-", "").to_owned()
+        };
+        context.insert("session_id",&sid);
+        context.insert("signup_mode",&app_dbs.config.signup_mode);
+        // dbg!(&services_check);
+        ReqHandler { 
+            req_header,
+            app_dbs,
+            lang,
+            uri,
+            notify_data,
+            auth_state: auth_state.to_owned(),
+            req_name: req_name.to_owned(),
+            context,
+        }
+    }
+    /// Find a `md` template file under `templates_path/md/server.name/req_path` or under `templates_path/md/req_path`
+    /// render if found path or return `dflt_content`
+    pub fn load_md_template_file(&mut self,tpl_path: &str, tpl_file: &str, in_html: bool, dflt_content: &str) {
+        let md_path = tpl_path.replace("html","md")
+            .replace("txt","md");
+        let md_file = tpl_file.replace(".j2",".md");
+        let (md_full_path,tpl_path) = if Path::new(&format!("{}/{}{}/{}",
+            &self.app_dbs.config.templates_path,
+            &md_path,
+            &self.app_dbs.config.name,
+            &md_file
+        )).exists() {
+            (
+                format!("{}/{}{}/{}", 
+                    &self.app_dbs.config.templates_path,
+                    &md_path,
+                    &self.app_dbs.config.name,
+                    &md_file,
+                ),
+                format!("{}{}/{}",
+                    &md_path,
+                    &self.app_dbs.config.name,
+                    &md_file,
+                )
+            )
+        } else if Path::new(&format!("{}{}/{}",
+            &self.app_dbs.config.templates_path,
+            &md_path,
+            &md_file,
+        )).exists() {
+            (
+                format!("{}/{}{}", 
+                    &self.app_dbs.config.templates_path,
+                    &md_path,
+                    &md_file,
+                ),
+                   format!("{}{}", 
+                    &md_path,
+                    &md_file,
+                ) 
+            )
+        } else if Path::new(&format!("{}/md/{}",
+            &self.app_dbs.config.templates_path,
+            &md_file,
+        )).exists() {
+            (
+                format!("{}/md/{}", 
+                    &self.app_dbs.config.templates_path,
+                    &md_file,
+                ),
+                   format!("md/{}", 
+                    &md_file,
+                ) 
+            )
+        } else {
+            (String::from(""), String::from(""))
+        };
+        if !md_full_path.is_empty() {
+            let md_content = {
+                let res = if Path::new(&md_full_path).exists() {
+                    self.render_template(&tpl_path, dflt_content)
+                } else {
+                    String::from("")
+                };
+                res
+                // if res.is_empty() {
+                //     std::fs::read_to_string(&md_full_path).unwrap_or(String::from(""))
+                // } else {
+                //     res
+                // }
+            };
+            self.context.insert("md_file", &md_file); 
+            //if !md_content.is_empty() {
+            //     self.context.insert("md_page", format!("{} {}", &md_file.replace(".md",""),&self.app_dbs.config.name).as_str());
+            //     if in_html { // self.response_in_html() {
+            //         self.context.insert("page_content",Self::markdown_to_html(&md_content).as_str());
+            //     } else {
+            //         self.context.insert("page_content",&md_content);
+            //     }
+            // }
+        } 
+    }
+    pub fn template_file_dirpath(&self, tpl_file: &str) -> Result<String> {
+       let tpl_path = if Path::new(&format!("{}/{}",
+            &self.app_dbs.config.templates_path,
+            &tpl_file
+        )).exists() {
+            ""
+        } else if self.req_header.is_browser() && Path::new(&format!("{}/html/{}",
+            &self.app_dbs.config.templates_path,
+            &tpl_file
+        )).exists() {
+            "html/"
+        } else if Path::new(&format!("{}/txt/{}",
+            &self.app_dbs.config.templates_path,
+            &tpl_file
+        )).exists() {
+            "txt/"
+        } else if Path::new(&format!("{}/md/{}",
+            &self.app_dbs.config.templates_path,
+            &tpl_file
+        )).exists() {
+            "md/"
+        } else { 
+            return Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: Invalid path for {}",&tpl_file)
+            ));
+        };
+        Ok(tpl_path.to_owned())
+    }
+    pub fn prepare_head_response(&self, res_header: &mut HeaderMap) {
+        if self.req_header.is_browser() || self.req_header.is_wget() {
+            res_header.append(axum::http::header::CONTENT_TYPE,
+                HeaderValue::try_from("text/html; charset=utf-8")
+                .expect("URI isn't a valid header value")
+            );
+        } 
+    }
+    pub fn prepare_head_json_response(&self, res_header: &mut HeaderMap) {
+        res_header.append(axum::http::header::CONTENT_TYPE,
+            HeaderValue::try_from("application/json; charset=utf-8")
+            .expect("URI isn't a valid header value")
+        );
+    }
+    pub fn prepare_response(&mut self) {
+        // self.req_header.header.contains_key(axum::http::header::CONTENT_TYPE)
+        if self.req_header.is_browser() || self.req_header.is_wget() {
+           self.req_header.header.append(axum::http::header::CONTENT_TYPE,
+                HeaderValue::try_from("text/html; charset=utf-8")
+                .expect("URI isn't a valid header value")
+            );
+        }
+    }
+    pub fn prepare_render(&mut self) {
+        //let sid_settings = self.sid_settings(UserId::from(&self.user_id)).to_owned();
+        // let session_ui_config = SessionUiConfig {
+        //     token: self.has_auth_or_new(),
+        //     sid: self.user_id.to_owned(),
+        //     config: self.app_dbs.config.client.web_config.to_owned(),
+        //     locales: self.app_dbs.config.locales.to_owned(),
+        //     ui: if self.user_id.is_empty() {
+        //         self.app_dbs.config.client.ui_config.to_owned()
+        //     } else {
+        //         sid_settings.uiconfig.to_owned()
+        //     },
+        //     settings: self.app_dbs.config.client.ui_settings.to_owned(),
+        // };
+       // self.context.insert("sid_config", &sid_settings);
+        //self.context.insert("sid_config_values", &sid_settings.to_json());
+        // self.context.insert("sid_ui_config", &session_ui_config);
+        self.context.insert("agent",&self.req_header.agent());
+    }
+    pub fn load_template_file(&mut self, tpl_file: &str, dflt_content: &str) -> String {
+        let tpl_file = if tpl_file.ends_with(".html") || tpl_file.ends_with(".txt") || tpl_file.ends_with(".j2") {
+            tpl_file.to_owned()
+        } else {
+            format!("{}.j2",tpl_file) 
+        };
+        // Madness about template path
+        let (tplfile, tpl_path) = match self.template_file_dirpath(&tpl_file) {
+            Ok(res) => (tpl_file.to_owned(), res),
+            Err(_e) => match self.template_file_dirpath(&dflt_content) {
+                Ok(res) =>(tpl_file.to_owned(), res),
+                Err(_e) => {
+                    let tplfile = format!("{}.j2",&dflt_content);
+                    match self.template_file_dirpath(&tplfile) {
+                        Ok(res) => (tplfile, res),
+                        Err(_e)  => (tplfile, String::from(""))
+                    }
+                }
+            }
+        };
+        let template_file = if Path::new(&format!("{}/{}{}",
+            &self.app_dbs.config.templates_path,
+            &tpl_path,
+            &tpl_file
+        )).exists() {
+            format!("{}{}", &tpl_path, &tplfile)
+        } else {
+            String::from("html/notfound.j2")
+        };
+        if self.app_dbs.config.verbose > 0 {
+            dbg!("path: {}, file: {}, template_file: {}",&tpl_path,&tpl_file,&template_file);
+        }
+        self.prepare_render(); 
+        self.context.insert("path",&tpl_file);
+        self.load_md_template_file(&tpl_path, &tpl_file, tpl_path.contains("html"),"");
+        self.render_template(&template_file, &dflt_content)    
+        // self.app_dbs.tera.render(tpl_file, &context).unwrap_or_else(|e|{
+        //     println!("load template: {} errors: {}",&tpl_file,e);
+        //     dflt_content.to_owned()
+        // })
+/*
+        if Path::new(&tpl_file).exists() {
+            if let Ok(template_content) = fs::read_to_string(&tpl_file) {
+                let mut content = template_content;
+                content = self.content_replace("tpl_header", &content, "");
+                content = self.content_replace("tpl_footer", &content, "");
+                content = self.content_replace("req_name", &content, &self.req_name);
+                content = self.content_replace("logs_url", &content, 
+                    &format!("{}:{}",&self.app_dbs.config.protocol, &self.app_dbs.config.hostport)
+                );
+                content = self.content_replace("req_path", &content, &self.uri.path());
+                let sid = if self.user_id.is_empty() || self.user_id == "No ID" {
+                   String::from("") 
+                } else {
+                   self.user_id.replace("-", "").to_owned()
+                };
+                content = self.content_replace("session_id", &content, &sid );
+                content = self.content_replace("token", &content, "");
+                return content
+            }
+        }
+        println!("load template: {} not found using defaults",&tpl_file);
+        dflt_content.to_owned()
+*/
+    }
+    /*
+    pub fn load_template_filename(&mut self, tpl_file: &str, dflt_content: &str) -> String {
+        self.load_template_file(&format!(
+                "{}/{}.{}",
+                //"{}/{}/{}.{}",
+                //&self.app_dbs.config.templates_path,
+                self.req_header.lang(&self.app_dbs.config),
+                &tpl_file,
+                TEMPLATE_EXT
+            ), dflt_content)
+    }
+    fn content_replace(&mut self, key: &str, content: &str, dflt_content: &str) -> String {
+        let tpl_var = format!("{{{{ {} }}}}",&key);
+        if content.contains(&tpl_var) {
+            if key.starts_with("tpl_") {
+                content.replace(&tpl_var,self.load_template_file(
+                    &format!(
+                        "{}/{}/{}.{}",
+                        &self.app_dbs.config.templates_path,
+                        self.req_header.lang(&self.app_dbs.config),
+                        &key,
+                        TEMPLATE_EXT
+                    ), dflt_content).as_str())
+            } else {
+                content.replace(&tpl_var,dflt_content)
+            }
+        } else {
+            content.to_owned()
+        }
+    }
+    */
+   pub fn render_template(&mut self,template_file: &str, dflt_content: &str) -> String {    
+        //self.check_services(None);
+        self.context.insert("page", &template_file.replace(".j2","").replace("html/", "").as_str());
+        if template_file.contains("md") || template_file.contains("sample") || template_file.contains("code") {
+           self.context.insert("with_code", "true");
+        }
+        match self.app_dbs.tera.render(&template_file, &self.context) {
+            Ok(s) => {
+                // println!("{:?}", s);
+                if self.req_header.is_browser() {
+                    let mut html_minifier = HTMLMinifier::new();
+                    match html_minifier.digest(s.as_str()) {
+                        Ok(_) => { 
+                            let Ok(result) = str::from_utf8(html_minifier.get_html()) else { return s };
+                            // let result = str::from_utf8(html_minifier.get_html()).unwrap_or(s);
+                            result.to_owned()
+                        },
+                        Err(e) => {
+                            println!("Error minifier: {}",e);
+                            s
+                        },
+                    }
+                    // match html_minifier.digest(s.as_str()) {
+                    //    Ok(_) => str::from_utf8(html_minifier.get_html()).unwrap_or_default().to_owned(),
+                    //    Err(e) => {
+                    //     println!("Error minifier: {}",e);
+                    //     s
+                    //    },
+                    // }
+                } else {
+                   s
+                }
+            },
+            Err(e) => {
+                println!("Error: {}", &e);
+                let mut cause = e.source();
+                while let Some(e) = cause {
+                    println!("Reason: {}", e);
+                    cause = e.source();
+                }
+                dflt_content.to_owned()
+            }
+        }
+    }
+    pub fn check_request_help(&mut self) -> Option<String> {
+        //dbg!(&self.uri);
+        let uri_path = self.uri.path();
+        if uri_path.contains(&format!("/{}",HELP_URI)) || uri_path.contains(&format!(",{}",HELP_URI)) {
+            if self.req_header.is_browser() {
+                  let uri = format!(
+                    "{}://{}#{}?{}",
+                    &self.app_dbs.config.protocol,
+                    &self.app_dbs.config.hostport,
+                    HELP_URI,
+                    &self.req_name
+                );
+                // Pass LOCATION to header should work but JavaScript should do it also add some info 
+                // if req_header.referer().contains("/html/")  
+                // req_header.header.insert(LOCATION, HeaderValue::try_from(&uri).expect("URI isn't a valid header value"));
+                // dbg!(&req_header.header);
+                self.req_header.header.append(CONTENT_TYPE,
+                    HeaderValue::try_from("text/html; charset=utf-8").expect("URI isn't a valid header value"));
+                // TODO load maud template for this
+                Some(
+                    format!("<script>location.href='{}'</script>",&uri)
+                )
+            } else {
+                Some (
+                    self.load_template_file(&format!(
+                        "{}/{}/{}{}.{}",
+                            &self.app_dbs.config.templates_path,
+                            self.req_header.lang(&self.app_dbs.config),
+                            self.req_name,
+                            HELP_EXT,
+                            TEMPLATE_EXT
+                        ),
+                        &format!("{}{}",&self.req_name,HELP_EXT)
+                    )
+                )
+            }
+        } else {
+            None
+        }
+    }
+    pub fn check_request_invalid(&mut self, name: &str) -> Option<String> {
+        if let Some(help_info) = self.check_request_help() {
+            return Some(help_info);
+        }
+        if name.len() == 0 {
+            let lang = self.req_header.lang(&self.app_dbs.config);            
+            let (tpl_file, dflt_msg) = if self.req_header.is_browser() {
+                // TODO load template for this
+                self.req_header.header.append(CONTENT_TYPE,
+                    HeaderValue::try_from("text/html; charset=utf-8").expect("URI isn't a valid header value"));
+                (
+                    format!("{}/{}_invalid.html",&self.app_dbs.config.templates_path,&lang),
+                    format!("<h2>invalid path</h2>")
+                )
+            } else {
+                (
+                    format!("{}/{}/invalid.{}",&self.app_dbs.config.templates_path,&lang,TEMPLATE_EXT),
+                    format!("invalid path"),
+                )
+            };
+            Some(self.load_template_file(&tpl_file, &dflt_msg))
+        } else {
+            None
+        }
+    }
+    pub fn check_request_auth(&mut self, _url_pathname: &str) -> Option<String> {
+        if let Some(help_info) = self.check_request_help() {
+            return Some(help_info);
+        }
+        // dbg!(self.req_header.auth());
+        let user_id = self.auth_state.id();
+        if self.req_header.auth().is_empty() && (user_id.is_empty() || user_id == "No ID") {
+            let msg = "No Authorization found";
+            self.context.insert("page_content", &msg);
+            if let Some(tpl) = self.app_dbs.config.tpls.get("noauth") {
+                Some(
+                    self.response_tpl_msg(tpl,  &msg)
+                )
+            } else {
+                Some( msg.to_owned())
+            }
+            // if self.req_header.is_browser() && self.req_header.internal().is_empty() {
+            //     let uri = format!(
+            //         "{}://{}{}",
+            //         &self.app_dbs.config.protocol,
+            //         &self.app_dbs.config.hostport,
+            //         &url_pathname
+            //     );
+            //     // Pass LOCATION to header should work but JavaScript should do it also add some info 
+            //     // if req_header.referer().contains("/html/")  
+            //     // req_header.header.insert(LOCATION, HeaderValue::try_from(&uri).expect("URI isn't a valid header value"));
+            //     // dbg!(&req_header.header);
+            //     self.req_header.header.append(CONTENT_TYPE,
+            //         HeaderValue::try_from("text/html; charset=utf-8").expect("URI isn't a valid header value"));
+                
+            //     Some(
+            //             // TODO load template for this
+            //             // format!("<script>location.href='{}'</script>",&uri)
+            //         )
+            // } else { 
+            //     Some( 
+            //         self.load_template_file(&format!(
+            //                 "{}/{}/request_no_auth.{}",
+            //                 &self.app_dbs.config.templates_path,
+            //                 self.req_header.lang(&self.app_dbs.config.server),
+            //                 TEMPLATE_EXT
+            //             ),
+            //             "invalid request auth")
+            //     )
+            // }
+        } else {
+            None
+        }
+    }
+    pub fn bad_request(&mut self,msg: &str) -> String {
+
+        if let Some(tpl) = self.app_dbs.config.tpls.get("notfound") {
+            self.response_tpl_msg(tpl, msg)
+        } else {
+            msg.to_owned()
+        }
+    }
+    pub fn response_tpl_msg(&mut self, tpl:& str, msg: &str) -> String {
+        self.prepare_response();
+        let root_tpl = if self.req_header.is_browser() {
+            "html"
+        } else {
+            "txt"
+        };
+        self.context.insert("page_content", &msg);
+        self.load_template_file(&format!("{}/{}",&root_tpl,&tpl), &msg)
+    }
+    pub fn auth_role(&self) -> UserRole {
+        #[cfg(feature = "authstore")]
+        if let Some(authz) =  self.app_dbs.auth_store.authz.get(&self.notify_data.auth) {
+            println!("aut: {}, name: {}, role: {}",&self.notify_data.auth, &authz.name,&authz.role);
+            authz.role.to_owned()
+        } else {
+            UserRole::Anonymous
+        }
+        #[cfg(feature = "casbin")]
+        UserRole::Anonymous
+    }
+    pub fn get_config_lang(&self) -> Local {
+       Local::get_lang(&self.app_dbs.config.locales,&self.app_dbs.config.dflt_lang,&self.app_dbs.config.dflt_lang)
+    }
+    pub fn get_lang(&self, key: &str) -> Local {
+       Local::get_lang(&self.app_dbs.config.locales, key, &self.app_dbs.config.dflt_lang)
+    }
+    // pub fn sid_settings(&mut self, op_user_id: Option<UserId> ) -> SidSettings {
+    //     if let Some(user_id) = op_user_id {
+    //         let sid_settings = user_id.sid_settings(&self.app_dbs.sessions_config);
+    //         if sid_settings.lang != self.lang.id {
+    //             self.lang = self.get_lang(&sid_settings.lang);
+    //         }
+    //         sid_settings
+    //     } else {
+    //         self.app_dbs.sessions_config.sid_settings.to_owned()
+    //     }
+    // }
+    pub fn new_token(&self) -> String {
+        let user_notify_data = UserNotifyData {
+            id: format!("{}",self.auth_state.id()),
+            auth: TOKEN_AUTH_VALUE.to_owned(),
+            key: TOKEN_KEY_VALUE.to_owned(),
+        };
+        user_notify_data.token(&self.app_dbs.config, &self.app_dbs.config.paseto, false)
+    }
+    pub fn has_auth_or_new(&self) -> String {
+        if self.req_header.auth().is_empty() {
+            self.new_token()
+        } else {
+            self.req_header.auth()
+        }
+    }
+    pub fn otp_make(&self, code: &str, defs: &str) -> Result<TOTP>  {
+        let secret = match Secret::Encoded(code.to_owned()).to_bytes() {
+            Ok(scrt) => scrt,
+            Err(e) => 
+                return Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: Invalid Secret {}",&e)
+                ))
+        };
+        let (digits, str_algorithm) = if defs.is_empty() {
+            (   self.app_dbs.config.totp_digits,
+                format!("{}",self.app_dbs.config.totp_algorithm)
+            )
+        } else {
+            let arr_defs = defs.split(",").collect::<Vec<&str>>();
+            if arr_defs.len() > 1 {
+                (   arr_defs[0].parse().unwrap_or(self.app_dbs.config.totp_digits),
+                    arr_defs[1].to_owned()
+                )
+            } else {
+                (   self.app_dbs.config.totp_digits,
+                    format!("{}",self.app_dbs.config.totp_algorithm)
+                )
+            }
+        };
+        let algorithm = match str_algorithm.to_uppercase().as_str() {
+            "SHA1" => Algorithm::SHA1,
+            "SHA256" => Algorithm::SHA256,
+            "SHA512" => Algorithm::SHA512,
+            _ => Algorithm::SHA1,
+        };
+        let totp = match TOTP::new(
+            algorithm,
+            digits,
+            1,
+            30,
+            secret,
+            Some(format!("{}",self.app_dbs.config.name)),
+            format!("{}",self.app_dbs.config.org)
+        ) {
+            Ok(totp) => totp,
+            Err(e) =>
+                return Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: Invalid Topt {}",&e)
+                ))
+        };
+        Ok(totp)
+    }
+    pub fn otp_generate(&self) -> Result<TOTP> {
+        let mut rng = rand::thread_rng();
+        let data_byte: [u8; 21] = rng.gen();
+        let base32_string = base32::encode(base32::Alphabet::RFC4648 { padding: false }, &data_byte);
+        match self.otp_make(&base32_string, "") {
+            Ok(totp) => Ok(totp),
+            Err(e) =>
+                Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: Invalid TOTP {}",&e)
+                ))
+        }
+    }
+    pub fn otp_check(&self, code: &str, token: &str, defs: &str) -> Result<bool> {
+        let totp = match self.otp_make(code, defs) {
+            Ok(totp) => totp,
+            Err(e) =>
+                return Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: Invalid TOTP {}",&e)
+                ))
+        };
+        match totp.check_current(&token) {
+            Ok(result) => Ok(result),
+            Err(e) => 
+                return Err(std::io::Error::new(
+                ErrorKind::NotFound,
+                format!("ERROR: check {}",&e)
+                ))
+        }
+    } 
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/req_headermap.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/req_headermap.rs.html new file mode 100644 index 0000000..810f140 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/req_headermap.rs.html @@ -0,0 +1,519 @@ +req_headermap.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+

+use std::{fs, path::Path, net::{IpAddr,SocketAddr}};
+use axum::http::{header::FORWARDED, HeaderMap};
+use forwarded_header_value::{ForwardedHeaderValue, Identifier};
+
+use crate::defs::{
+    Config as ServerConfig,
+    AUTHORIZATION,
+    REFERER,
+    BEARER,
+    USER_AGENT,
+    ACCEPT_LANGUAGE,
+    X_FORWARDED_FOR,
+    X_REAL_IP,
+    X_INTERNAL,
+    SESSION_ID,
+    FILE_SCHEME,
+    AppDBs,
+    UserId,
+};
+
+use crate::defs::UserNotifyData;
+
+pub struct ReqHeaderMap {
+    pub header: HeaderMap,
+    pub req_path: Vec<String>,    
+}
+
+impl ReqHeaderMap {
+    pub fn new(header: HeaderMap, request_path: &str) -> Self {
+        let req_path = 
+            Self::req_end_path(request_path)
+            .split(",").map(|s| s.to_string())
+            .collect();
+        ReqHeaderMap {
+            header,
+            req_path,
+        }
+    }
+    pub fn req_end_path(req_path: &str) -> String {
+        let arr_req_path: Vec<String> = req_path.split("/").map(|s| s.to_string()).collect();
+        format!("{}",arr_req_path[arr_req_path.len()-1])
+    } 
+    pub fn req_user(&self, app_dbs: &AppDBs) -> (String, UserNotifyData) {
+        let token = self.auth();
+        if !token.is_empty() {
+            // dbg!(&token);
+            return UserNotifyData::from_token(&token, &app_dbs.config.paseto);
+        } else {
+            let arr_req_path: Vec<String> = self.req_path.iter()
+                .filter(|it| it.contains(SESSION_ID))
+                .map(|s| s.to_string())
+                .collect();
+            if arr_req_path.len() > 0 && arr_req_path[0].contains(SESSION_ID) { 
+                let req_sid = format!("{}",&arr_req_path[0].replace(SESSION_ID, ""));
+                if let Some(uid) = UserId::from(&req_sid) {
+                    let id_path = format!("{}/{}", &app_dbs.config.users_store_uri.replace(FILE_SCHEME, ""), &uid);
+                    if ! Path::new(&id_path).exists() {
+                        let _ = fs::create_dir(&id_path);
+                    }
+                    let id = format!("{}",uid);
+                    return (   
+                        id.to_owned(),
+                        UserNotifyData{
+                            key: String::from(SESSION_ID),
+                            auth: id.to_owned(),
+                            id,
+                        }
+                    );
+                }
+            }
+        }
+        (String::from(""), UserNotifyData::default())
+    }
+    #[allow(dead_code)]
+    pub fn req_path_clean(&self) -> Vec<String> {
+        let arr_value: Vec<String> = 
+            self.req_path.iter()
+            .filter(|it| !it.contains(SESSION_ID))
+            .map(|s| s.to_string())
+            .collect();
+        // if path has sid, this will make an empty value and arr_value.len() will be 1
+        if arr_value.len() == 1 && arr_value[0].is_empty() {
+            Vec::new()
+        } else {
+            arr_value
+        }
+    }
+    #[allow(dead_code)]
+    pub fn req_path_contains(&self,value: &str) -> Vec<String> {
+        let arr_value: Vec<String> = 
+            self.req_path.iter()
+            .filter(|it| it.contains(value))
+            .map(|s| s.to_string())
+            .collect();
+        if arr_value.len() == 0 || arr_value[0].is_empty() {
+            Vec::new()
+        } else {
+            arr_value
+        }
+    }
+    pub fn auth(&self) -> String {
+        if let Some(auth) = self.header.get(AUTHORIZATION) {
+            format!("{}",auth.to_str().unwrap_or("").replace(&format!("{} ", BEARER),""))
+        } else { 
+            String::from("")
+        }
+    }
+    #[allow(dead_code)]
+    pub fn referer(&self) -> String {
+        if let Some(referer) = self.header.get(REFERER) {
+            format!("{}",referer.to_str().unwrap_or(""))
+        } else { 
+            String::from("")
+        }
+    }
+    #[allow(dead_code)]
+    pub fn internal(&self) -> String {
+        if let Some(internal) = self.header.get(X_INTERNAL) {
+            format!("{}",internal.to_str().unwrap_or(""))
+        } else { 
+            String::from("")
+        }
+    }
+    pub fn is_browser(&self) -> bool {
+        if let Some(user_agent) = self.header.get(USER_AGENT) {
+            let agent = user_agent.to_str().unwrap_or(""); 
+            if agent.contains("Mozilla") { 
+                true
+            } else if agent.contains("WebKit") {
+                true
+            } else if agent.contains("Chrome") {
+                true
+            } else {
+                false
+            }
+        } else { 
+            false
+        } 
+    }
+    #[allow(dead_code)]
+    pub fn is_curl(&self) -> bool {
+        if let Some(user_agent) = self.header.get(USER_AGENT) {
+            let agent = user_agent.to_str().unwrap_or(""); 
+            if agent.contains("curl") { 
+                true
+            } else {
+                false
+            }
+        } else { 
+            false
+        } 
+    }
+    pub fn is_wget(&self) -> bool {
+        if let Some(user_agent) = self.header.get(USER_AGENT) {
+            let agent = user_agent.to_str().unwrap_or("").to_lowercase(); 
+            if agent.contains("wget") { 
+                true
+            } else {
+                false
+            }
+        } else { 
+            false
+        } 
+    }
+    #[allow(dead_code)]
+    pub fn response_user_agent_html(&self) -> bool {
+        if let Some(user_agent) = self.header.get(USER_AGENT) {
+            let agent = user_agent.to_str().unwrap_or("").to_lowercase(); 
+            agent.contains("curl") || agent.contains("wget") 
+        } else {
+            false
+        }
+    }
+    #[allow(dead_code)]
+    pub fn agent(&self) -> String {
+        if let Some(user_agent) = self.header.get(USER_AGENT) {
+            user_agent.to_str().unwrap_or("").to_owned()
+        } else {
+            String::from("")
+        }
+    }
+    #[allow(dead_code)]
+    pub fn lang(&self, config: &ServerConfig) -> String {
+        if let Some(langs) = self.header.get(ACCEPT_LANGUAGE) {
+            let langs_data = langs.to_str().unwrap_or("");
+            if langs_data.is_empty() {
+                format!("{}",config.dflt_lang)
+            } else {
+                let arr_langs: Vec<String> = langs_data.split(",").map(|s| s.to_string()).collect();
+                let arr_lang: Vec<String> = arr_langs[0].split("-").map(|s| s.to_string()).collect();
+                format!("{}",arr_lang[0])
+            }
+        } else {
+            format!("{}",config.dflt_lang)
+        }
+    }
+    /// Tries to parse the `x-real-ip` header
+    #[allow(dead_code)]
+    fn maybe_x_forwarded_for(&self) -> Option<IpAddr> {
+        self.header
+            .get(X_FORWARDED_FOR)
+            .and_then(|hv| hv.to_str().ok())
+            .and_then(|s| s.split(',').find_map(|s| s.trim().parse::<IpAddr>().ok()))
+    }
+
+    /// Tries to parse the `x-real-ip` header
+    #[allow(dead_code)]
+    fn maybe_x_real_ip(&self) -> Option<IpAddr> {
+        self.header
+            .get(X_REAL_IP)
+            .and_then(|hv| hv.to_str().ok())
+            .and_then(|s| s.parse::<IpAddr>().ok())
+    }
+
+    /// Tries to parse `forwarded` headers
+    #[allow(dead_code)]
+    fn maybe_forwarded(&self) -> Option<IpAddr> {
+        self.header
+            .get_all(FORWARDED).iter().find_map(|hv| {
+                hv.to_str()
+                    .ok()
+                    .and_then(|s| ForwardedHeaderValue::from_forwarded(s).ok())
+                    .and_then(|f| {
+                        f.iter()
+                            .filter_map(|fs| fs.forwarded_for.as_ref())
+                            .find_map(|ff| match ff {
+                                Identifier::SocketAddr(a) => Some(a.ip()),
+                                Identifier::IpAddr(ip) => Some(*ip),
+                                _ => None,
+                            })
+                    })
+        })
+    }
+    #[allow(dead_code)]
+    pub fn ip(&self, addr: &SocketAddr) -> String {
+        if let Some(ip) = self.maybe_x_real_ip()
+            .or_else(||self.maybe_x_forwarded_for())
+            .or_else(|| self.maybe_forwarded())
+            .or_else(|| None )
+        {
+            format!("{}",ip)
+        } else {
+            format!("{}",addr)
+        }
+    }
+}    
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/session.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/session.rs.html new file mode 100644 index 0000000..3bfc8e7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/session.rs.html @@ -0,0 +1,811 @@ +session.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+
//use async_trait::async_trait;
+use async_session::{Session, SessionStore,MemoryStore};
+use async_sqlx_session::SqliteSessionStore;
+// use std::sync::{Arc,Mutex};
+
+// use axum::{
+//     http::{
+//         StatusCode,
+//         request::Parts,
+//     },
+//     extract::FromRequestParts,
+// };
+// use tower_cookies::Cookies;
+// use rand_chacha::ChaCha8Rng;
+// pub type Random = Arc<Mutex<ChaCha8Rng>>;
+
+use crate::{
+//    SESSION_COOKIE_NAME,
+    defs::{
+        FileStore,
+        User,
+        AppDBs,
+        SESSION_ID,
+        USER_DATA,
+    },
+};
+
+use super::UserStatus;
+
+#[derive(Clone)]
+pub enum SessionStoreDB {
+    Files(FileStore),
+    SqlLite(SqliteSessionStore),
+    Memory(MemoryStore),
+    None,
+}
+/// In `SessionStoreDB` creation match the corresponding store to return it as item argument 
+impl SessionStoreDB {
+    pub fn connect_file_store(store: FileStore) -> Self{
+        SessionStoreDB::Files(store)
+    }
+    pub fn connect_memory_store() -> Self{
+        SessionStoreDB::Memory(MemoryStore::new())
+    } 
+    pub fn connect_sqlite_store(store: SqliteSessionStore) -> Self{
+        SessionStoreDB::SqlLite(store)
+    } 
+    pub async fn store_session_data(id: &str, user_data: &str, expire: u64, app_dbs: &AppDBs) -> String {
+        // dbg!("user_data: {}",&user_data);
+        let mut session = Session::new();
+        if ! id.is_empty() {
+            session.insert(SESSION_ID, id).unwrap_or_else(|e|{
+                println!("Error insert session {}",e);
+            });
+        }
+        if ! user_data.is_empty() {
+            session.insert(USER_DATA, user_data).unwrap_or_else(|e|{
+                println!("Error insert session {}",e);
+            });
+        }
+        if expire > 0 {
+            session.expire_in(std::time::Duration::from_secs(expire));
+        } else if app_dbs.config.session_expire > 0 {
+            session.expire_in(std::time::Duration::from_secs(app_dbs.config.session_expire));
+        }
+        //session.into_cookie_value().unwrap_or_default()
+        match app_dbs.sessions_store_db.to_owned() {
+            SessionStoreDB::Files(store) => {
+                store.store_session(session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default()
+            },
+            SessionStoreDB::SqlLite(store) => {
+               store.store_session(session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default() 
+            },
+            SessionStoreDB::Memory(store) => {
+                store.store_session(session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default()
+            },
+            SessionStoreDB::None => {
+                String::from("")
+            },
+        }
+    }
+    pub async fn update_session_data(session: Session, app_dbs: &AppDBs) -> String {
+        //session.into_cookie_value().unwrap_or_default()
+        let cur_session = session.clone();
+        match app_dbs.sessions_store_db.to_owned() {
+            SessionStoreDB::Files(store) => {
+                store.store_session(session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default()
+            },
+            SessionStoreDB::SqlLite(store) => {
+                let _ = store.destroy_session(session).await;
+                store.store_session(cur_session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default() 
+            },
+            SessionStoreDB::Memory(store) => {
+                store.store_session(session).await.unwrap_or_else(|e|{
+                    println!("Error store session {}",e);
+                    None
+                }).unwrap_or_default()
+            },
+            SessionStoreDB::None => {
+                String::from("")
+            },
+        }
+    }
+    pub async fn cleanup_data(app_dbs: &AppDBs) {
+        //session.into_cookie_value().unwrap_or_default()
+        match app_dbs.sessions_store_db.to_owned() {
+            SessionStoreDB::Files(store) => {
+                let _ = store.cleanup().await;
+            },
+            SessionStoreDB::SqlLite(store) => {
+                let _ = store.cleanup().await;
+            },
+            SessionStoreDB::Memory(store) => {
+                let _ = store.cleanup().await;
+            },
+            SessionStoreDB::None => {
+            },
+        }
+    }
+}
+
+#[derive(Clone, Default, Debug)]
+pub struct AuthState{
+    pub session: Option<Session>,
+    pub user: Option<User>, 
+}
+impl AuthState {
+    // pub fn new(session: Session, user: User) -> Self {
+    //     let sid = session.get("sid").unwrap_or_default();
+    //     let user_store = &app_dbs.user_store;
+    //     let user = User::select("id", sid, user_store).await.unwrap_or_default();
+    //     //let user = User::from_id(sid, app_dbs);
+    //     Self {
+    //         session,
+    //         user
+    //     }
+    // }
+    // pub fn sid(&self) -> String {
+    //     if let Some(session) = &self.session {
+    //         session.get("sid").unwrap_or_default()
+    //     } else {
+    //         String::from("")
+    //     }
+    // }
+    pub fn id(&self) -> String {
+        if let Some(session) = &self.session {
+            session.id().to_owned()
+        } else {
+            String::from("")
+        }
+    }
+    #[allow(dead_code)]
+    pub fn ses_expired(&self) -> bool {
+        if let Some(session) = &self.session {
+            session.is_expired()
+        } else {
+            true
+        }
+    }
+    pub fn ses_destroyed(&self) -> bool {
+        if let Some(session) = &self.session {
+            session.is_destroyed()
+        } else {
+            true
+        }
+    }
+    pub fn destroy(&self) -> bool {
+        if let Some(mut session) = self.session.to_owned() {
+            session.destroy();
+            self.ses_destroyed()
+        } else {
+            true
+        }
+    }
+    #[allow(dead_code)]
+    pub fn ses_validate(&self) -> bool {
+        if let Some(session) = &self.session {
+            session.clone().validate().is_some()
+        } else {
+            false
+        }
+    }
+    pub fn user_data(&self) -> Vec<String> {
+        if let Some(session) = &self.session {
+            let user_data: String = session.get(USER_DATA).unwrap_or_default();
+            user_data.split("|").map(|s| s.to_string()).collect()
+        } else {
+            Vec::new()
+        }
+    }
+    pub fn user_id(&self) -> String {
+        let user_data = self.user_data();
+        if user_data.len() > 0 && user_data[0] != "0" {
+            user_data[0].to_owned()
+        } else {
+            String::from("")
+        }
+    }
+    pub fn user_name(&self) -> String {
+        let user_data = self.user_data();
+        if user_data.len() > 1 && user_data[1] != "" {
+            user_data[1].to_owned()
+        } else {
+            String::from("")
+        }
+    }
+    pub fn user_email(&self) -> String {
+        let user_data = self.user_data();
+        if user_data.len() > 2 && user_data[2] != "" {
+            user_data[2].to_owned()
+        } else {
+            String::from("")
+        }
+    }
+    pub fn user_roles(&self) -> String {
+        let user_data = self.user_data();
+        if user_data.len() > 3 && user_data[3] != "" {
+            user_data[3].to_owned()
+        } else {
+            String::from("")
+        }
+    } 
+    pub fn user_items(&self) -> String {
+        let user_data = self.user_data();
+        if user_data.len() > 4 && user_data[4] != "" {
+            user_data[4].to_owned()
+        } else {
+            String::from("")
+        }
+    } 
+    pub fn is_admin(&self) -> bool {
+        let user_data = self.user_data();
+        if user_data.len() > 5 && user_data[5] != "" {
+            user_data[5] == "true"  || user_data[5] == "1"
+        } else {
+            false
+        }
+    } 
+    #[allow(dead_code)]
+    pub fn user_status(&self) -> UserStatus {
+        let user_data = self.user_data();
+        if user_data.len() > 6 && user_data[6] != "" {
+            UserStatus::from_str(&user_data[6])
+        } else {
+            UserStatus::Unknown
+        }
+    } 
+    pub async fn expire_in(&mut self, expire_secs: u64, app_dbs: &AppDBs ) -> Self {
+        if let Some(mut session) = self.session.to_owned() {
+            session.expire_in(std::time::Duration::from_secs(expire_secs));
+            let _ = SessionStoreDB::update_session_data(session.to_owned(),&app_dbs).await;
+            Self {
+                session: Some(session),
+                user: self.user.to_owned(),
+            }
+        } else {
+            self.to_owned()
+        }
+    } 
+    #[allow(dead_code)]
+    pub async fn from_data(&self, app_dbs: &AppDBs) -> Self {
+        let user_id = self.user_id();
+        let user = if !user_id.is_empty() {
+            // dbg!(&user_id);
+            match User::select("id", &user_id, false, &app_dbs.user_store).await {
+                Ok(user) => Some(user),
+                Err(e) => {
+                    println!("Error user {}: {:#}",&user_id,e);
+                    None
+                }
+            }
+        } else {
+            None
+        };
+        // dbg!(&user);
+        Self {
+            session: self.session.to_owned(),
+            user,
+        }
+    }
+    pub async fn from_cookie(session_cookie: String, app_dbs: &AppDBs) -> Self {
+        let result_session = match app_dbs.sessions_store_db.to_owned() {
+            SessionStoreDB::Files(store) => 
+                store
+                    .load_session(session_cookie)
+                    .await
+            ,
+            SessionStoreDB::SqlLite(store) =>
+                store
+                    .load_session(session_cookie)
+                    .await
+            ,
+            SessionStoreDB::Memory(store) => 
+                store
+                    .load_session(session_cookie.to_string())
+                    .await
+            ,
+            SessionStoreDB::None => {
+                dbg!("No store");
+                return AuthState::default();
+            },
+        };
+        // dbg!(&result_session);
+        match result_session {
+            Ok(op_session) => if let Some(session) = op_session {
+                if let Some(sid) = session.get::<String>("sid") {
+                    // dbg!(
+                    //     "UserDataFromSession: session decoded success, user_data={}",
+                    //     &session
+                    // );
+                    let user_store = &app_dbs.user_store;
+                    let user = User::select("id", &sid, false, user_store).await.unwrap_or_default();
+                    return AuthState {
+                        session: Some(session),
+                        user: Some(user)
+                    };
+                } else {
+                    println!("No `sid` found in session");
+                }
+            },
+            Err(e) => {
+                println!("Error session {}", e);
+            }
+        }  
+        AuthState::default()
+    }
+}
+
+/*
+#[async_trait]
+impl<S> FromRequestParts<S> for AuthState
+where
+    S: Send + Sync,
+{
+    type Rejection = (StatusCode, &'static str);
+
+    async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result<Self, Self::Rejection> {
+        // let h = parts.headers.to_owned();
+        // dbg!(&h);
+/*
+        if let Some(app_dbs) = parts.extensions.get::<Arc<AppDBs>>()  {
+            if let Some(cookies) = parts.extensions.get::<Cookies>()  {
+                if let Some(s_cookie) = cookies.get(SESSION_COOKIE_NAME) {
+                    let session_cookie = s_cookie.to_string().replace(&format!("{}=",SESSION_COOKIE_NAME),"");
+                    println!("From request parts cookie: {}",session_cookie);
+                    // continue to decode the session cookie
+                    // return Ok(
+                    //     AuthState::from_cookie(session_cookie, app_dbs).await
+                    // );           
+                } 
+            }
+        }
+        */
+        Ok(AuthState::default())
+        // Err((
+        //     StatusCode::INTERNAL_SERVER_ERROR,
+        //     "No `user_data` found in session",
+        // ))
+        // let cookie = Option::<Cookie>::g(parts, state);
+        // let cookie = Cookies::get(parts, state);
+        // if let Some(_user_agent) = parts.headers.get(USER_AGENT) {
+        //     Ok(AuthState(None))
+        // } else {
+        //     Err((StatusCode::BAD_REQUEST, "`User-Agent` header is missing"))
+        // }
+//         let cookie = Option::<TypedHeader<Cookie>>::from_request_parts(req, state)
+        //let cookies = Cookies::from(pa, state).await?;
+
+//         let info: String = cookies
+//             .get(SESSION_COOKIE_NAME)
+// //            .and_then(|c| c.value().parse().ok())
+//             .unwrap_or_default()
+//             ;
+//         dbg!(&info);
+//         //cookies.add(Cookie::new(COOKIE_NAME, visited.to_string()));
+     }
+}
+*/
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_algorithm.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_algorithm.rs.html new file mode 100644 index 0000000..3876217 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_algorithm.rs.html @@ -0,0 +1,100 @@ +totp_algorithm.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+
use serde::{Deserialize,Serialize,Deserializer};
+
+#[derive(Eq, PartialEq, Clone, Serialize, Debug, Deserialize)]
+pub enum TotpAlgorithm {
+  Sha1,
+  Sha256,
+  Sha512,
+}
+impl Default for TotpAlgorithm {
+    fn default() -> Self {
+       TotpAlgorithm::Sha1
+    }
+}
+impl std::fmt::Display for TotpAlgorithm {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            TotpAlgorithm::Sha1 => write!(f,"sha1"),
+            TotpAlgorithm::Sha256 => write!(f,"sha256"),
+            TotpAlgorithm::Sha512 => write!(f,"sha512"),
+        }
+    }
+}
+impl TotpAlgorithm {
+    pub fn from_str(value: &str) -> TotpAlgorithm {
+        match value {
+            "sha1" |  "SHA1" => TotpAlgorithm::Sha1,
+            "sha512" |  "SHA512" => TotpAlgorithm::Sha512,
+            "sha256" |  "SHA256" => TotpAlgorithm::Sha256,
+            _ => TotpAlgorithm::default(),
+        }
+    }
+}
+pub fn deserialize_totp_algorithm<'de, D>(deserializer: D) -> Result<TotpAlgorithm, D::Error>
+where D: Deserializer<'de> {
+    let buf = String::deserialize(deserializer)?;
+    Ok(TotpAlgorithm::from_str(&buf))
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_mode.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_mode.rs.html new file mode 100644 index 0000000..649b50d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/totp_mode.rs.html @@ -0,0 +1,100 @@ +totp_mode.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+
use serde::{Deserialize,Serialize,Deserializer};
+
+#[derive(Eq, PartialEq, Clone, Serialize, Debug, Deserialize)]
+pub enum TotpMode {
+  Mandatory,
+  Optional,
+  No,
+}
+impl Default for TotpMode {
+    fn default() -> Self {
+       TotpMode::No
+    }
+}
+impl std::fmt::Display for TotpMode {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            TotpMode::Mandatory => write!(f,"mandatory"),
+            TotpMode::Optional => write!(f,"optional"),
+            TotpMode::No => write!(f,"no"),
+        }
+    }
+}
+impl TotpMode {
+    pub fn from_str(value: &str) -> TotpMode {
+        match value {
+            "mandatory" | "Mandaltory" | "required" | "Required"  => TotpMode::Mandatory,
+            "optional" |  "Optional" => TotpMode::Optional,
+            "no" |  "No" => TotpMode::No,
+            _ => TotpMode::default(),
+        }
+    }
+}
+pub fn deserialize_totp_mode<'de, D>(deserializer: D) -> Result<TotpMode, D::Error>
+where D: Deserializer<'de> {
+    let buf = String::deserialize(deserializer)?;
+    Ok(TotpMode::from_str(&buf))
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/tracedata.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/tracedata.rs.html new file mode 100644 index 0000000..2326883 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/tracedata.rs.html @@ -0,0 +1,134 @@ +tracedata.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+
// use std::collections::HashMap;
+use serde::{Deserialize,Serialize};
+
+fn default_empty() -> String {
+  "/".to_string()
+}
+fn default_tracedata_items() -> Vec<TraceContent> {
+  Vec::new()
+}
+
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct TraceContent {
+    #[serde(default = "default_empty")]
+    pub when: String,
+    #[serde(default = "default_empty")]
+    pub sid: String,
+    #[serde(default = "default_empty")]
+    pub origin: String,
+    #[serde(default = "default_empty")]
+    pub trigger: String,
+    #[serde(default = "default_empty")]
+    pub id: String,
+    #[serde(default = "default_empty")]
+    pub info: String,
+    #[serde(default = "default_empty")]
+    pub context: String,
+    #[serde(default = "default_empty")]
+    pub role: String,
+}
+impl TraceContent {
+    #[allow(dead_code)]
+    pub fn to_json(&self) -> String {
+        serde_json::to_string(self).unwrap_or_else(|e|{
+            println!("Error to convert TraceContent to json: {}",e);
+            String::from("")
+        })
+    }
+}
+
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct TraceData {
+    #[serde(default = "default_empty")]
+    pub server: String, 
+    #[serde(default = "default_empty")]
+    pub timestamp: String, 
+    #[serde(default = "default_tracedata_items")]
+    pub contents: Vec<TraceContent>,
+}
+impl TraceData {
+    #[allow(dead_code)]
+    pub fn contents_to_json(&self) -> Vec<String> {
+        self.contents.clone().into_iter().map(|item| item.to_json()).collect()
+    }
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/user.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/user.rs.html new file mode 100644 index 0000000..0281c1f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/user.rs.html @@ -0,0 +1,1237 @@ +user.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+
use serde::{Deserialize,Serialize}; 
+use sqlx::Row;
+use std::{collections::HashMap};
+use futures::TryStreamExt;
+use anyhow::{anyhow,Context, Result};
+use std::fmt;
+
+use std::num::ParseIntError;
+use crate::{
+    defs::{
+        entries::{Entries,Entry},
+        UserData,
+        UserStore,
+        UserStatus,
+    },
+    USERS_TABLENAME,
+    tools::str_date_from_timestamp,
+};
+
+const DISPLAY_SEPARATOR: &str = "=";
+
+fn default_user_status() -> UserStatus {
+  UserStatus::default()
+}
+
+#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize,Default)]
+pub struct User {
+    pub id: i64,
+    pub name:     String,
+    pub fullname: String,
+    pub email:    String,
+    pub description: String,
+    pub password: String,
+    pub otp_enabled: bool,
+    pub otp_verified: bool,
+    pub otp_base32: String,
+    pub otp_auth_url: String,
+    pub otp_defs: String,
+    pub roles: String,
+    pub created:  String,
+    pub lastaccess: String,
+    #[serde(default = "default_user_status")]
+    pub status: UserStatus,
+    pub items: String,
+    pub isadmin: bool,
+}
+
+impl fmt::Display for User {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        // Write strictly the first element into the supplied output
+        // stream: `f`. Returns `fmt::Result` which indicates whether the
+        // operation succeeded or failed. Note that `write!` uses syntax which
+        // is very similar to `println!`.
+        let sep = DISPLAY_SEPARATOR;
+        let content = format!(
+            "ID{} {}
+Name{} {} 
+FullName{} {}
+Description{} {}
+Email{} {}
+Password{} {}
+otp_enabled{} {}
+otp_verified{} {}
+otp_base32{} {}
+otp_auth_url{} {}
+otp_defs{} {}
+Roles{} {}
+Created{} {}
+Last access{} {}
+Status{} {}
+Items{} {}
+IsAdmin{} {}",
+            sep, self.id,
+            sep, self.name, sep, self.fullname,
+            sep, self.description,
+            sep, self.email,
+            sep, self.password,
+            sep, self.otp_enabled,
+            sep, self.otp_verified,
+            sep, self.otp_base32,
+            sep, self.otp_auth_url,
+            sep, self.otp_defs,
+            sep, self.roles,
+            sep, self.created, sep, self.lastaccess,
+            sep, self.status,
+            sep, self.items,
+            sep, self.isadmin
+        );
+        write!(f, "{}", content)
+    }
+}
+
+impl Entry for User {
+    fn from_line(line: &str) -> Result<User, ParseIntError> {
+        let parts: Vec<&str> = line.split(":").map(|part| part.trim()).collect();
+        Ok(User {
+            id: parts[0].to_string().parse::<i64>().unwrap_or_default(),
+            name: parts[1].to_string(),
+            fullname: parts[2].to_string(),
+            description: parts[3].to_string(),
+            email: parts[4].to_string(),
+            password: parts[5].to_string(),
+            otp_enabled: if parts[6] == "TRUE" { true } else { false},
+            otp_verified: if parts[7] == "TRUE" { true } else { false},
+            otp_base32: parts[8].to_string(),
+            otp_auth_url: parts[9].to_string(),
+            otp_defs: parts[10].to_string(),
+            roles: parts[11].to_string(),
+            created: parts[12].to_string(),
+            lastaccess: parts[13].to_string(),
+            status: UserStatus::from_str(&parts[14].to_string()),
+            items: parts[15].to_string(),
+            isadmin: if parts[16] == "TRUE" { true } else { false},
+        })
+    }
+}
+impl User {
+
+    pub async fn add(self, store: &UserStore) -> Result<i64> {
+
+        match store {
+            UserStore::Sql(pool) => {
+                let query_result = sqlx::query(
+                    format!("INSERT INTO {} ( 
+                    name, fullname, email, description, password, otp_enabled, otp_verified,
+                    otp_base32,
+                    otp_auth_url,
+                    otp_defs,
+                    roles, created, lastaccess, status, items, isadmin
+                    ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", USERS_TABLENAME).as_str()
+                )
+                .bind(self.name)
+                .bind(self.fullname)
+                .bind(self.email)
+                .bind(self.description)
+                .bind(self.password)
+                .bind(self.otp_enabled)
+                .bind(self.otp_verified)
+                .bind(self.otp_base32)
+                .bind(self.otp_auth_url)
+                .bind(self.otp_defs)
+                .bind(self.roles)
+                .bind(self.created)
+                .bind(self.lastaccess)
+                .bind(format!("{}",self.status))
+                .bind(self.items)
+                .bind(self.isadmin)
+                .execute(pool).await?;
+                Ok(query_result.last_insert_id().unwrap_or_default())
+            },
+            UserStore::File(file_path) => {
+                // use itertools::Itertools;
+                // let entries: Vec<String> = concat(vec![
+                //     Entries::new(Path::new(&file_path)).map(|user: User|{ 
+                //         user.line_format()
+                //     }).collect(),
+                //     vec![ self.line_format()]
+                // ]);
+                // Entries::<User>::write(Path::new(&file_path), &entries); 
+                let all: Vec<User> = Entries::new(&file_path).collect();
+                let id = if all.len() > 0 {
+                    all[all.len()-1].id + 1
+                } else {
+                    1
+                };
+                let mut new_user = self.to_owned();
+                new_user.id = id;
+                let entries: Entries<User> = Entries::new(&file_path);
+                match entries.append(new_user.line_format()) {
+                    Ok(_) => Ok(id),
+                    Err(e) => {
+                        println!("Error add item to file: {}",e);
+                        Err(anyhow!("No data added")).context("User add")
+                    }
+                }
+            },
+        }
+    }
+    pub async fn select(field: &str, value: &str, human: bool, store: &UserStore) -> Result<Self> {
+        match store {
+            UserStore::Sql(pool) => {
+                let query_str =  format!("SELECT * FROM {} WHERE {} = ? ", USERS_TABLENAME, field);
+                let mut stream = sqlx::query(
+                    &query_str
+                )
+                .bind(value)
+                //.map(|row: PgRow| {
+                //    map the row into a user-defined domain type
+                //})
+                .fetch(pool);
+                if let Some(row) = stream.try_next().await? {
+                    let str_status: String = row.try_get("status")?;
+                    let status = UserStatus::from_str(&str_status);
+                    let created = if human {
+                        let created: String = row.try_get("created")?;
+                        str_date_from_timestamp(&created)
+                    } else {
+                        row.try_get("created")?
+                    };
+                    let lastaccess = if human {
+                        let lastaccess: String = row.try_get("lastaccess")?;
+                        str_date_from_timestamp(&lastaccess)
+                    } else {
+                        row.try_get("lastaccess")?
+                    };
+                    Ok(Self{
+                        id: row.try_get("id")?,
+                        name: row.try_get("name")?,
+                        fullname: row.try_get("fullname")?,
+                        email: row.try_get("email")?,
+                        description: row.try_get("description")?,
+                        password: row.try_get("password")?,
+                        otp_enabled: row.try_get("otp_enabled")?,
+                        otp_verified: row.try_get("otp_verified")?,
+                        otp_base32: row.try_get("otp_base32")?,
+                        otp_auth_url: row.try_get("otp_auth_url")?,
+                        otp_defs: row.try_get("otp_defs")?,
+                        roles: row.try_get("roles")?,
+                        created,
+                        lastaccess,
+                        status,
+                        items: row.try_get("items")?,
+                        isadmin: row.try_get("isadmin")?,
+                    })
+                } else {
+                    Err(anyhow!("No data found")).context("User select")
+                }
+            },
+            UserStore::File(file_path) => {
+                if let Some(user) = 
+                    Entries::<User>::new(&file_path).find(|it| 
+                        match field {
+                            "id" => it.id == value.parse::<i64>().unwrap_or_default(),
+                            "name" => it.name == value,
+                            "fullname" => it.fullname == value,
+                            "email" => it.email == value,
+                            "description" => it.description == value,
+                            "otp_base32" => it.otp_base32 == value,
+                            "roles" => it.roles == value,
+                            "items" => it.items == value,
+                            "isadmin" => match value { 
+                                "TRUE" => it.isadmin,
+                                _ => !it.isadmin,
+                            },
+                            _ => false,
+                        }
+                    )
+                {
+                    Ok(user)
+                } else {
+                    Err(anyhow!("No data found")).context("User select")
+                }
+            },
+        }
+    }
+
+    pub async fn delete(id: i64, store: &UserStore) -> Result<bool> {
+        match store {
+            UserStore::Sql(pool) => {
+                let query_str = format!("DELETE FROM {} WHERE id = ?", USERS_TABLENAME);
+                let query_result = sqlx::query(
+                        &query_str
+                    ) 
+                    .bind(id)
+                    .execute(pool).await?;
+                 Ok(query_result.rows_affected() > 0)
+            },
+            UserStore::File(file_path) => {
+                let new_entries: Vec<String> = 
+                    Entries::<User>::new(&file_path).filter(|it| it.id != id).map(|user|
+                       user.line_format() 
+                    ).collect();
+                let entries = Entries::<User>::new(&file_path);
+                match entries.write(&new_entries) {
+                    Ok(_) => Ok(true),
+                    Err(e) => {
+                        println!("Error data delete '{}': {}", id, e);
+                        Err(anyhow!("No data delete").context("User delete"))
+                    }
+                }
+            },
+        }
+    }
+    pub async fn update(self, store: &UserStore) -> anyhow::Result<bool> {
+        match store {
+            UserStore::Sql(pool) => {
+                let query_str = format!("UPDATE {} SET name = ?, fullname = ?, 
+                    email = ?, description = ?, password = ?,
+                    otp_enabled = ?, otp_verified = ?,
+                    otp_base32 = ?, otp_auth_url = ?,
+                    otp_defs = ?,
+                    roles = ?,
+                    created = ?, lastaccess = ?,
+                    status = ?,
+                    items = ?,
+                    isadmin = ? 
+                 WHERE id = ? ",
+                    USERS_TABLENAME
+                );
+                let query_result = sqlx::query(
+                        &query_str
+                    ) 
+                    .bind(self.name)
+                    .bind(self.fullname)
+                    .bind(self.email)
+                    .bind(self.description)
+                    .bind(self.password)
+                    .bind(self.otp_enabled)
+                    .bind(self.otp_verified)
+                    .bind(self.otp_base32)
+                    .bind(self.otp_auth_url)
+                    .bind(self.otp_defs)
+                    .bind(self.roles)
+                    .bind(self.created)
+                    .bind(self.lastaccess)
+                    .bind(format!("{}",self.status))
+                    .bind(self.items)
+                    .bind(self.isadmin)
+                    .bind(self.id)
+                    .execute(pool).await?;
+                 Ok(query_result.rows_affected() > 0)
+            },
+            UserStore::File(file_path) => {
+                let new_entries: Vec<String> = Entries::new(&file_path).map(|user: User|{ 
+                    if user.id == self.id {
+                        self.to_owned().line_format()
+                    } else {
+                        user.line_format()
+                    }
+                }).collect();
+                let entries = Entries::<User>::new(&file_path);
+                match entries.write(&new_entries) {
+                    Ok(_) => Ok(true),
+                    Err(e) => {
+                        println!("Error data update '{}': {}", self.id, e);
+                        Err(anyhow!("No data updated").context("User update"))
+                    }
+                }
+            },
+        }
+    }
+    pub fn show(&self, sep: &str) {
+        let content = if sep.is_empty() {
+            format!( "{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}",
+                self.id,
+                self.name, self.fullname,
+                self.description,
+                self.email,
+                self.password,
+                self.otp_enabled,
+                self.otp_verified,
+                self.otp_base32,
+                self.otp_auth_url,
+                self.otp_defs,
+                self.roles,
+                self.created,
+                self.lastaccess,
+                self.status,
+                self.items,
+                self.isadmin
+            )
+        } else {
+            format!("{}",&self).replace(DISPLAY_SEPARATOR, sep)
+        };
+        println!("{}\n_____________________________",content);
+    }
+    pub async fn list(store: &UserStore, human: bool, show: bool, sep: &str) -> anyhow::Result<Vec<User>> {
+        let mut usrs: Vec<User> = Vec::new();
+        match store {
+            UserStore::Sql(pool) => {
+                let query_str =  format!("SELECT * FROM {}", USERS_TABLENAME);
+                let mut stream = sqlx::query(
+                    &query_str
+                )
+                //.map(|row: PgRow| {
+                //  map the row into a user-defined domain type
+                //})
+                .fetch(pool);
+                while let Some(row) = stream.try_next().await? {
+                    let str_status: String = row.try_get("status")?;
+                    let status = UserStatus::from_str(&str_status);
+                    let created = if human {
+                        let created: String = row.try_get("created")?;
+                        str_date_from_timestamp(&created)
+                    } else {
+                        row.try_get("created")?
+                    };
+                    let lastaccess = if human {
+                        let lastaccess: String = row.try_get("lastaccess")?;
+                        str_date_from_timestamp(&lastaccess)
+                    } else {
+                        row.try_get("lastaccess")?
+                    };
+                    let user = Self{
+                        id: row.try_get("id")?,
+                        name: row.try_get("name")?,
+                        fullname: row.try_get("fullname")?,
+                        email: row.try_get("email")?,
+                        description: row.try_get("description")?,
+                        password: row.try_get("password")?,
+                        otp_enabled: row.try_get("otp_enabled")?,
+                        otp_verified: row.try_get("otp_verified")?,
+                        otp_base32: row.try_get("otp_base32")?,
+                        otp_auth_url: row.try_get("otp_auth_url")?,
+                        otp_defs: row.try_get("otp_defs")?,
+                        roles: row.try_get("roles")?,
+                        created,
+                        lastaccess,
+                        status,
+                        items: row.try_get("items")?,
+                        isadmin: row.try_get("isadmin")?,
+                    };
+                    if show { user.show(sep); }
+                    usrs.push(user);
+                }
+                Ok(usrs)
+            },
+            UserStore::File(file_path) => {
+                let all: Vec<User> = Entries::new(&file_path).collect();
+                if show {
+                    for user in all.to_owned() { if show { user.show(sep); } }
+                }
+                Ok(all)
+            },
+            // UserStore::None => Err(anyhow!("No store set")).context("Users list"),
+        }
+    }       
+    pub async fn count(store: &UserStore) -> anyhow::Result<i64> {
+        match store {
+            UserStore::Sql(pool) => {
+
+                let query_str =  format!("SELECT count(*) as total FROM {}", USERS_TABLENAME);
+                let row = sqlx::query(
+                    &query_str
+                )
+                .fetch_one(pool).await?;
+
+                let total: i64 = row.try_get("total")?;
+                Ok(total)
+            },
+            UserStore::File(file_path) => {
+                let all: Vec<User> = Entries::new(&file_path).collect();
+                Ok(all.len() as i64)
+            },
+        }
+    }
+    fn line_format(self) -> String {
+        format!( "{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}:{}",
+            self.id,
+            self.name, self.fullname,
+            self.description,
+            self.email,
+            self.password,
+            self.otp_enabled,
+            self.otp_verified,
+            self.otp_base32,
+            self.otp_auth_url,
+            self.otp_defs,
+            self.roles,
+            self.created, self.lastaccess,
+            self.status,
+            self.items,
+            self.isadmin
+        )
+    }
+    pub fn hash_items(items: &str) -> HashMap<String,String> {
+        if items.is_empty() {
+            HashMap::new()
+        } else {
+            serde_json::from_str(items).unwrap_or_else(|e|{
+                println!("Error to convert user items to json: {}",e);
+                HashMap::new()
+            })
+        }
+    }
+    pub fn items(&self) -> HashMap<String,String> {
+        Self::hash_items(&self.items)
+    }
+    pub fn json_items(items: HashMap<String,String>) -> String {
+        serde_json::to_string(&items).unwrap_or_else(|e|{
+            println!("Error to convert user items to string: {}",e);
+            String::from("")
+        })
+    }
+    pub fn from_data(&mut self, user_data: UserData) {
+        if !user_data.name.is_empty() {
+            self.name = user_data.name.to_owned();
+        }
+        if !user_data.fullname.is_empty() {
+            self.fullname = user_data.fullname.to_owned();
+        }
+        if !user_data.description.is_empty() {
+            self.description = user_data.description.to_owned();
+        }
+        if !user_data.email.is_empty() {
+            self.email = user_data.email.to_owned();
+        }
+        if !user_data.otp_code.is_empty() {
+            self.otp_base32 = user_data.otp_code.to_owned();
+        }
+        if !user_data.otp_url.is_empty() {
+            self.otp_auth_url = user_data.otp_url.to_owned();
+        }
+        if !user_data.roles.is_empty() {
+            self.roles = user_data.roles.to_owned();
+        }
+        if !user_data.items.is_empty() {
+            let mut items_hash = self.items();
+            for (key,val) in user_data.items {
+                items_hash.insert(key,val);
+            }
+            self.items = Self::json_items(items_hash);
+        }
+    }
+    pub fn disable_totp(&mut self) {
+        self.otp_base32 = String::from("");
+        self.otp_auth_url = String::from("");
+        self.otp_defs = String::from("");
+        self.otp_verified =  false;
+        self.otp_enabled =  false;
+    }
+    pub fn from_user(&mut self, new_user: User) {
+        if !new_user.name.is_empty() {
+            self.name = new_user.name.to_owned();
+        }
+        if !new_user.fullname.is_empty() {
+            self.fullname = new_user.fullname.to_owned();
+        }
+        if !new_user.description.is_empty() {
+            self.description = new_user.description.to_owned();
+        }
+        if !new_user.email.is_empty() {
+            self.email = new_user.email.to_owned();
+        }
+        if !new_user.password.is_empty() {
+            self.password = new_user.password.to_owned();
+        }
+        if new_user.otp_enabled  {
+            self.disable_totp();
+        } else {
+            if !new_user.otp_base32.is_empty() {
+                self.otp_base32 = new_user.otp_base32.to_owned();
+            }
+            if !new_user.otp_auth_url.is_empty() {
+                self.otp_auth_url = new_user.otp_auth_url.to_owned();
+            }
+            if !new_user.otp_defs.is_empty() {
+                self.otp_defs = new_user.otp_defs.to_owned();
+            }
+            self.otp_verified =  new_user.otp_verified;
+        }
+        if !new_user.roles.is_empty() {
+            self.roles = new_user.roles.to_owned();
+        }
+        if !new_user.items.is_empty() {
+            self.items = new_user.items.to_owned();
+        }
+        if new_user.status != self.status {
+            self.status = new_user.status.to_owned();
+        }
+    }
+    pub fn session_data(&self) -> String {
+        format!("{}|{}|{}|{}|{}|{}|{}",
+            &self.id,
+            &self.name,
+            &self.email,
+            &self.roles,
+            &self.items,
+            &self.isadmin,
+            &self.status
+        )
+    }
+    pub fn estimate_password(word: &str) -> String  {
+         match zxcvbn::zxcvbn(word, &[]) {
+            Ok(estimate) => {
+                if let Some(feedback) = estimate.feedback() {
+                    let arr_suggestions: Vec<String> = feedback.suggestions().iter().map(|s| format!("{}",s)).collect();
+                    let suggestions = arr_suggestions.join("\n");
+                    if let Some(warning) = feedback.warning() {
+                        let warning = format!("{}", warning);
+                        format!("{}|{}|{}",estimate.score(),suggestions,warning)
+                    } else {
+                        format!("{}|{}|",estimate.score(),suggestions)
+                    }
+                } else {
+                    format!("{}||",estimate.score())
+                }
+            },
+            Err(e) => {
+                println!("Error password strength estimator: {}", e);
+                String::from("-1|||")
+            }
+        }
+    }
+    pub fn password_score(word: &str) -> u8 {
+         match zxcvbn::zxcvbn(word, &[]) {
+            Ok(estimate) => {
+                estimate.score()
+            },
+            Err(e) => {
+                println!("Error password strength estimator: {}", e);
+                0
+            }
+        }
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/user_action.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_action.rs.html new file mode 100644 index 0000000..2a059ab --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_action.rs.html @@ -0,0 +1,141 @@ +user_action.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+

+// use serde::{Deserialize, Serialize};
+
+#[derive(Clone)]
+pub enum UserAction {
+    Access,
+    Log(String),
+    Request(String),
+    View(String),
+    List(String),
+    Profile(String),
+    Other,
+}
+impl Default for UserAction {
+    fn default() -> Self {
+        UserAction::Other
+    }
+}
+impl std::fmt::Display for UserAction {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+           UserAction::Access => write!(f,"access"),
+           UserAction::Log(info) =>write!(f,"log: {}", info),
+           UserAction::Request(info) =>write!(f,"request: {}", info),
+           UserAction::View(info) => write!(f,"view: {}", info),
+           UserAction::List(info) => write!(f,"list: {}", info),
+           UserAction::Profile( info) => write!(f,"profile: {}", info),
+           UserAction::Other => write!(f,"other"),
+        }
+    }
+}
+impl UserAction {
+    #[allow(dead_code)]
+    pub fn from_str(value: &str, info: String) -> UserAction {
+        match value {
+            "access" | "Access" => UserAction::Access,
+            "log" | "Log" => UserAction::Log(info),
+            "request" | "Request" => UserAction::Request(info),
+            "view" | "View" => UserAction::View(info),
+            "list" | "List" => UserAction::List(info),
+            "profile" | "Profile " => UserAction::Profile(info),
+            "other" | "Other " => UserAction::Other,
+            _ => UserAction::default(),
+        }
+    }
+    #[allow(dead_code)]
+    pub fn info(&self) -> String {
+        match self {
+            UserAction::Access => String::from(""),
+            UserAction::Log(info) => info.to_owned(),
+            UserAction::Request(info) => info.to_owned(),
+            UserAction::View(info) => info.to_owned(),
+            UserAction::List(info) => info.to_owned(),
+            UserAction::Profile(info) => info.to_owned(),
+            UserAction::Other => String::from(""),
+        }
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/user_id.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_id.rs.html new file mode 100644 index 0000000..b781992 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_id.rs.html @@ -0,0 +1,551 @@ +user_id.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+
use std::{
+    io::Write,
+    // sync::Arc,
+    fmt::Debug,
+    fs,
+    path::{Path, PathBuf},
+    io::{Error, ErrorKind},
+    
+};
+use log::error;
+// use async_session::{MemoryStore, Session, SessionStore};
+use serde::{Deserialize, Serialize};
+//use tiitls_utils::logs::file;
+use uuid::Uuid;
+use crate::defs::{
+    FILE_SCHEME,
+    SID_SETTINGS_FILE,
+    SID_REQUESTS_FILE,
+    SID_TRACE_FILE,
+//    SID_UI_FILE,
+//    UI_SETTINGS_FILE,
+//    SidSettings,
+    Config as SessionsConfig, 
+    TraceData,
+    UserAction,
+};
+
+#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
+pub struct UserId(Uuid);
+
+impl UserId {
+    #[allow(dead_code)]
+    pub fn new() -> Self {
+        Self(Uuid::new_v4())
+    }
+    pub fn from(data: &str) -> Option<Self> {
+        match Uuid::parse_str(data) {
+            Ok(uuid) => Some(Self(uuid)),
+            Err(_) => None,
+        }
+    }
+}
+
+impl std::fmt::Display for UserId {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.0)
+    }
+}
+impl UserId {
+
+    /// Log user actions to config.user_store_access|reqs_store_file/user_id/config.user_store_access path
+    /// Add a line with timestamp 
+    /// It also get ReqHeaderMap to add more data ?
+    #[allow(dead_code)]
+    pub fn log_user_id_action(&self, action: UserAction, sessions_config: &SessionsConfig) -> std::io::Result<()> {
+        let id_path = format!("{}/{}",
+            sessions_config.users_store_uri.replace(FILE_SCHEME, ""),
+            self);
+        if ! Path::new(&id_path).exists() {
+            fs::create_dir(&id_path)?;
+        }
+        let now = chrono::Utc::now().timestamp().to_string();
+        let (log_data, file_path) = match action {
+            UserAction::Access => (
+               format!("{}\n",now),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::Log(info) => (
+               format!("notity:{}:{}\n",now,info),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::Request(info) => (
+               format!("req:{}:{}\n",now,info),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::View(info) => (
+               format!("view:{}:{}\n",now,info),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::List(info) => (
+               format!("list:{}:{}\n",now,info),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::Profile(info) => (
+               format!("profile:{}:{}\n",now,info),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+            UserAction::Other => (
+               format!("other:{}::\n",now),
+               format!("{}/{}",&id_path,sessions_config.user_store_access)
+            ),
+        };
+        self.write_data(&file_path, &log_data, false)
+        // if ! Path::new(&file_path).exists() {
+        //     fs::write(&file_path, log_data)?;
+        // } else  {
+        //     let access_id_file = fs::OpenOptions::new()
+        //         .write(true)
+        //         .append(true) // This is needed to append to file
+        //         .open(&file_path);
+        //     if let Ok(mut file) = access_id_file {
+        //         let _ = file.write_all(log_data.as_bytes())?;
+        //     }
+        // }
+        // Ok(())
+    }
+    fn id_path(&self, file: &str, sessions_config: &SessionsConfig) -> String {
+        format!("{}/{}/{}",
+          sessions_config.users_store_uri.replace(FILE_SCHEME, ""),
+          self,file)
+    }
+    #[allow(dead_code)]
+    fn write_data(&self, file_path: &str, data: &str, overwrite: bool) -> std::io::Result<()> {
+        let check_path = |path: &Path| -> std::io::Result<()> {
+            if ! Path::new(&path).exists() {
+                if let Err(e) = std::fs::create_dir(&path) {
+                    return Err(Error::new( ErrorKind::InvalidInput,
+                        format!("Error create path {}: {}",&path.display(), e)
+                    ));
+                    // std::process::exit(2)
+                }
+            }
+            Ok(())
+        };
+        if file_path.is_empty() || data.is_empty() {
+            return Err(Error::new(
+                ErrorKind::InvalidInput,
+                format!("Error save {}",&file_path)
+            ));
+        }
+        if ! Path::new(&file_path).exists() {
+            let path = PathBuf::from(&file_path);
+            if let Some(dir_path) =  path.parent() {
+                if ! Path::new(&dir_path).exists() {
+                    if let Some(parent_dir_path) = dir_path.parent() { 
+                        if ! Path::new(&parent_dir_path).exists() {
+                            let res = check_path(&parent_dir_path);
+                            if res.is_err() { return res; }
+                        }
+                    }
+                    let res = check_path(&dir_path);
+                    if res.is_err() { return res; }
+                }
+            }
+        }
+        if overwrite || ! Path::new(&file_path).exists() {
+            fs::write(&file_path, data)?;
+            println!("Overwrite: {}",&file_path);
+        } else {
+            let sid_settings_file = fs::OpenOptions::new()
+                .write(true)
+                .append(true) // This is needed to append to file
+                .open(&file_path);
+            if let Ok(mut file) = sid_settings_file {
+                file.write_all(data.as_bytes())?;
+            }
+            println!("write: {}",&file_path);
+        }
+        Ok(())
+    }
+    
+    #[allow(dead_code)]
+    pub fn sid_settings_path(&self, sessions_config: &SessionsConfig) -> String {
+       self.id_path(SID_SETTINGS_FILE, sessions_config)
+    }
+    #[allow(dead_code)]
+    pub fn sid_settings_content(&self, sessions_config: &SessionsConfig) -> String {
+        let file_path = self.sid_settings_path(sessions_config);
+        if ! Path::new(&file_path).exists() {
+            String::from("")
+        } else {
+            match std::fs::read_to_string(&file_path) {
+                Ok(content) => content,
+                Err(e) => {
+                    error!("Error read {}: {}",&file_path,e);
+                    String::from("")
+                }
+            }
+        }
+    }
+    // pub fn sid_settings(&self, sessions_config: &SessionsConfig) -> SidSettings {
+    //     let file_path = self.id_path(SID_SETTINGS_FILE, sessions_config);
+    //     if Path::new(&file_path).exists() {
+    //         match std::fs::read_to_string(&file_path) {
+    //             Ok(content) => sessions_config.sid_settings.from_json(&content,&file_path),
+    //             Err(e) => {
+    //                 error!("Error read {}: {}",&file_path,e);
+    //                 sessions_config.sid_settings.to_owned()
+    //             }
+    //         }
+    //     } else {
+    //         //dbg!(&sessions_config.sid_settings);
+    //         sessions_config.sid_settings.to_owned()
+    //     }
+    // }
+    // pub fn save_sid_settings(&self, sid_settings: SidSettings, sessions_config: &SessionsConfig) -> std::io::Result<()> {
+    //     let file_path = self.id_path(SID_SETTINGS_FILE, sessions_config);
+    //     let data = sid_settings.to_json();
+    //     self.write_data(&file_path, &data, true)
+    // }
+    #[allow(dead_code)]
+    pub fn save_trace_data(&self, trace_data: TraceData, sessions_config: &SessionsConfig) -> std::io::Result<()> {
+        // let file_curenv_path = self.id_path(&format!("{}/{}",trace_data.server,SID_CURENV_FILE), sessions_config);
+        // let res_curenv = self.write_data(&file_curenv_path, &trace_data.curenv, true);
+        // let _ = res_curenv.as_ref().unwrap_or_else(|e|{
+        //     println!("Error save trace curenv: {}",&e);
+        //     &()
+        // });
+        // if res_curenv.is_err() {
+        //     return res_curenv;
+        // }
+        // if trace_data.ui.len() > 0 {
+        //     let file_ui_path = self.id_path(&format!("{}/{}",trace_data.server,SID_UI_FILE), sessions_config);
+        //     let res_ui = self.write_data(&file_ui_path, &trace_data.ui, true); 
+        //     let _ = res_ui.as_ref().unwrap_or_else(|e|{
+        //         println!("Error save trace ui: {}",&e);
+        //         &()
+        //     });
+        //     if res_ui.is_err() { return res_ui; }
+        // }
+        let file_trace_path = self.id_path(&format!("{}/{}",trace_data.server,SID_TRACE_FILE), sessions_config);
+        let contents = trace_data.contents_to_json();
+        let mut result = Ok(());
+        let lines = contents.len() - 1;
+        for (idx, line) in contents.iter().enumerate() {
+            let prfx = if idx == 0 && Path::new(&file_trace_path).exists() {
+              ",\n"
+            } else {
+              ""
+            };
+            let sfx = if idx == lines {
+                ""
+            } else {
+                ",\n"
+            };
+           result = self.write_data(
+                &file_trace_path, 
+                format!("{}{}{}",&prfx,&line,&sfx).as_str(),
+                false
+            );
+            let _ = result.as_ref().unwrap_or_else(|e|{
+                println!("Error save trace contets: {} line {}",&e, &idx);
+                &()
+            });
+            if result.is_err() {
+                break;
+            }
+        }
+        result
+    }
+    #[allow(dead_code)]
+    pub fn save_sid_request(&self, data: &str, sessions_config: &SessionsConfig) -> std::io::Result<()> {
+        let file_path = self.id_path(SID_REQUESTS_FILE, sessions_config);
+        println!("---- {}",&file_path);
+        self.write_data(&file_path, &data, false)
+    }
+    #[allow(dead_code)]
+    pub fn read_sid_requests(&self, sessions_config: &SessionsConfig) -> Result<Vec<String>, Box<dyn std::error::Error>> {
+        let file_path = self.id_path(SID_REQUESTS_FILE, sessions_config);
+        let data = fs::read_to_string(file_path)?;
+        Ok(data.split("\n").map(|s| s.to_string()).collect())
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/user_role.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_role.rs.html new file mode 100644 index 0000000..3692fda --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/user_role.rs.html @@ -0,0 +1,146 @@ +user_role.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+
use serde::{Deserialize,Serialize,Deserializer};
+
+// #[derive(Error, Debug)]
+// pub enum AuthError {
+//     #[error("error")]
+//     SomeError(),
+//     #[error("no authorization header found")]
+//     NoAuthHeaderFoundError,
+//     #[error("wrong authorization header format")]
+//     InvalidAuthHeaderFormatError,
+//     #[error("no user found for this token")]
+//     InvalidTokenError,
+//     #[error("error during authorization")]
+//     AuthorizationError,
+//     #[error("user is not unauthorized")]
+//     UnauthorizedError,
+//     #[error("no user found with this name")]
+//     UserNotFoundError,
+// }
+
+#[derive(Eq, PartialEq, Clone, Serialize, Debug, Deserialize)]
+pub enum UserRole {
+  SuperUser,
+  Developer,
+  User,
+  Anonymous,
+}
+impl Default for UserRole {
+    fn default() -> Self {
+       UserRole::Anonymous
+    }
+}
+impl std::fmt::Display for UserRole {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            UserRole::SuperUser => write!(f,"superuser"),
+            UserRole::Developer => write!(f,"developer"),
+            UserRole::User => write!(f,"user"),
+            UserRole::Anonymous => write!(f,"anonymous"),
+        }
+    }
+}
+impl UserRole {
+    #[allow(dead_code)]
+    pub fn from_str(value: &str) -> UserRole {
+        match value {
+            "superuser" | "SuperUser" | "superUser" | "admin"  => UserRole::SuperUser,
+            "developer" |  "Developer" => UserRole::Developer,
+            "user" | "User" => UserRole::User,
+            "anonymous" | "Anonymous" => UserRole::Anonymous,
+            _ => UserRole::default(),
+        }
+    }
+}
+#[allow(dead_code)]
+pub fn deserialize_user_role<'de, D>(deserializer: D) -> Result<UserRole, D::Error>
+where D: Deserializer<'de> {
+    let buf = String::deserialize(deserializer)?;
+    Ok(UserRole::from_str(&buf))
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/userdata.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/userdata.rs.html new file mode 100644 index 0000000..2388485 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/userdata.rs.html @@ -0,0 +1,218 @@ +userdata.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+
use std::collections::HashMap;
+use serde::{Deserialize,Serialize};
+
+// use crate::defs::AppDBs;
+
+fn default_empty() -> String {
+  "".to_string()
+}
+fn default_items() -> HashMap<String,String> {
+  HashMap::new()
+}
+fn default_expire() -> u64 {
+   300
+}
+fn default_send_email() -> bool {
+  false  
+}
+fn default_isadmin() -> bool {
+  false  
+}
+fn default_otp_empty() -> String {
+  String::from("")
+}
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct UserData {
+    #[serde(default = "default_empty")]
+    pub id: String, 
+    #[serde(default = "default_empty")]
+    pub name: String, 
+    #[serde(default = "default_empty")]
+    pub fullname: String, 
+    #[serde(default = "default_empty")]
+    pub description: String, 
+    #[serde(default = "default_empty")]
+    pub email: String, 
+    #[serde(default = "default_empty")]
+    pub password: String, 
+    #[serde(default = "default_otp_empty")]
+    pub otp_code: String,
+    #[serde(default = "default_otp_empty")]
+    pub otp_url: String,
+    #[serde(default = "default_otp_empty")]
+    pub otp_auth: String,
+    #[serde(default = "default_empty")]
+    pub roles: String, 
+    #[serde(default = "default_items")]
+    pub items: HashMap<String,String>,
+}
+// impl UserData {
+//     pub fn from_id(id: String, _app_dbs: &AppDBs) -> Self {
+//       Self { 
+//           id,
+//           name: String::from(""),
+//           fullname: String::from(""),
+//           description: String::from(""),
+//           email: String::from(""),
+//           password: String::from(""),
+//           roles: String::from(""),
+//           items: Vec::new()
+//       }
+//     }
+// //     pub fn contents_to_json(&self) -> Vec<String> {
+// //         self.items.clone().into_iter().map(|item| item.to_json()).collect()
+// //     }
+//}
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct UserLogin {
+    #[serde(default = "default_empty")]
+    pub name: String, 
+    #[serde(default = "default_empty")]
+    pub password: String, 
+    #[serde(default = "default_empty")]
+    pub otp_auth: String, 
+}
+
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct UserItem {
+    #[serde(default = "default_empty")]
+    pub name: String, 
+    #[serde(default = "default_empty")]
+    pub value: String, 
+}
+
+#[derive(Default,Deserialize,Serialize,Debug,Clone)]
+pub struct UserInvitation {
+    #[serde(default = "default_empty")]
+    pub email: String, 
+    #[serde(default = "default_empty")]
+    pub roles: String, 
+    #[serde(default = "default_expire")]
+    pub expire: u64, 
+    #[serde(default = "default_send_email")]
+    pub send_email: bool,
+    #[serde(default = "default_isadmin")]
+    pub isadmin: bool,
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/usernotifydata.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/usernotifydata.rs.html new file mode 100644 index 0000000..9d6ab2b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/usernotifydata.rs.html @@ -0,0 +1,159 @@ +usernotifydata.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+
use std::collections::HashMap;
+use serde_json::json;
+
+use crate::defs::Config;
+use pasetoken_lib::ConfigPaSeToken;
+
+use crate::defs::{
+    CLAIM_UID,
+    CLAIM_AUTH,
+    CLAIM_APP_KEY,
+};
+
+#[derive(Debug, Default)]
+pub struct UserNotifyData {
+    pub key: String,
+    pub id: String,
+    pub auth: String,
+}
+
+impl UserNotifyData {
+    pub fn data_claim(&self,_config: &Config) -> HashMap<String,String> { 
+        HashMap::from([
+            (String::from(CLAIM_UID), self.id.to_owned()),
+            (String::from(CLAIM_AUTH), self.auth.to_owned()),
+            (String::from(CLAIM_APP_KEY), self.key.to_owned()),
+        ])
+    }
+    pub fn token(&self, server_config: &Config, paseto_config: &ConfigPaSeToken, expire: bool) -> String {
+        paseto_config.generate_token("", &self.data_claim(server_config), expire).unwrap_or_else(|e|{
+            eprintln!("Error generating token: {}", e);
+            String::from("")
+        })
+    }
+    pub fn from_token(token: &str,paseto_config: &ConfigPaSeToken) -> (String,Self) {
+        match paseto_config.pasetoken() {
+            Ok(paseto) => {
+                match paseto.trusted(token, false) {
+                    Ok(trusted_token) => {
+                        // dbg!(&trusted_token.payload_claims());
+                        if let Some(claims) = trusted_token.payload_claims() {
+                            // dbg!(&claims);
+                            let uid = claims.get_claim(CLAIM_UID).unwrap_or(&json!("")).to_string().replace("\"","");
+                            (
+                                uid.to_owned(),
+                                Self {
+                                    key: claims.get_claim(CLAIM_APP_KEY).unwrap_or(&json!("")).to_string().replace("\"",""),
+                                    id: uid,
+                                    auth: claims.get_claim(CLAIM_AUTH).unwrap_or(&json!("")).to_string().replace("\"",""),
+                                }
+                            )
+                        } else {
+                            (String::from(""), Self::default())
+                        }
+                    },
+                    Err(e) => {
+                        println!("Token not trusted: {}",e);
+                        (String::from(""), Self::default())
+                    },
+                }
+            },
+            Err(e) => {
+                println!("Error collecting notify data: {}",e);
+                (String::from(""), Self::default())
+            }
+        }
+    }
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/userstatus.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/userstatus.rs.html new file mode 100644 index 0000000..0dc7137 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/userstatus.rs.html @@ -0,0 +1,469 @@ +userstatus.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+
use serde::{Deserialize,Serialize,Deserializer};
+//use sqlx::{sqlite::SqlitePool, Row, Sqlite};
+// use sqlx::{
+//     FromRow,
+//     decode::Decode,
+//     any::{AnyRow, AnyValueRef},
+//     database::{
+//         Database,
+//         HasValueRef,
+//     },
+//     Row,
+// //    Error, 
+// };
+// use std::error::Error;
+// use std::str::FromStr;
+
+//use super::User;
+
+// #[derive(sqlx::FromRow)][derive(sqlx::Type)]
+//#[derive(sqlx::Type)]
+//#[sqlx(type_name = "userstatus_type")]
+// #[derive(sqlx::FromRow)]
+//#[sqlx(display_fromstr)]
+#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize, Deserialize)]
+pub enum UserStatus {
+    Created,
+    Active,
+    Pending,
+    Lock,
+    Unknown,
+}
+impl UserStatus {
+    #[allow(dead_code)]
+    pub fn from_str(status: &str) -> Self {
+        match status {
+            "created"|"Created" => UserStatus::Created,
+            "active"|"Active" => UserStatus::Active,
+            "pending"|"Pending" => UserStatus::Pending,
+            "lock"|"Lock" => UserStatus::Lock,
+            _ => UserStatus::Unknown,
+        }
+    }
+}
+impl std::fmt::Display for UserStatus {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            UserStatus::Created => write!(f,"Created"),
+            UserStatus::Active => write!(f,"Active"),
+            UserStatus::Pending => write!(f,"Pending"),
+            UserStatus::Lock => write!(f,"Lock"),
+            UserStatus::Unknown => write!(f,"Unknown"),
+        }
+    }
+}
+
+impl Default for UserStatus {
+    fn default() -> Self {
+       UserStatus::Unknown
+    }
+}
+#[allow(dead_code)]
+pub fn deserialize_user_status<'de, D>(deserializer: D) -> Result<UserStatus, D::Error>
+where D: Deserializer<'de> {
+    let buf = String::deserialize(deserializer)?;
+    Ok(UserStatus::from_str(&buf))
+}
+// impl sqlx::Type<sqlx::Any> for UserStatus {
+//     fn type_info() -> sqlx::any::AnyTypeInfo {
+//         //let res: sqlx::any::AnyTypeInfo = String::type_info();
+// let res = <str as sqlx::Type<sqlx::Any>>::type_info();
+//        //  let res = sqlx::any::AnyTypeInfo::default(); //  String::type_info();
+//         res 
+//         // String::type_info()
+//     }
+
+//     // fn compatible(ty: &<sqlx::Any>::AnyTypeInfo) -> bool {
+//     //     *ty == Self::type_info()
+//     // }
+// }
+/* 
+impl sqlx::Type<sqlx::Sqlite> for UserStatus {
+    fn type_info() -> sqlx::sqlite::SqliteTypeInfo {
+        let t = String::type_info();
+        t
+    }
+}
+impl sqlx::Type<sqlx::Mssql> for UserStatus {
+    fn type_info() -> sqlx::mssql::MssqlTypeInfo {
+        String::type_info()
+    }
+}
+impl sqlx::Type<sqlx::MySql> for UserStatus {
+    fn type_info() -> sqlx::mysql::MySqlTypeInfo {
+        String::type_info()
+    }
+}
+impl sqlx::Type<sqlx::Postgres> for UserStatus {
+    fn type_info() -> sqlx::postgres::PgTypeInfo {
+        String::type_info()
+    }
+}
+
+impl<'q> sqlx::Encode<'q, sqlx::Any> for UserStatus {
+    fn encode_by_ref(
+        &self,
+        args: &mut sqlx::any::AnyArgumentBuffer<'q>,
+    ) -> sqlx::encode::IsNull {
+        self.encode_by_ref(args)
+    }
+}
+*/
+
+
+/*
+impl<'r> sqlx::Decode<'r, sqlx::Any> for UserStatus {
+    fn decode(
+       //  value: <DB as HasValueRef<'r>>::AnyValueRef,
+        value: sqlx::any::AnyValueRef<'r>,
+    ) -> Result<Self, sqlx::error::BoxDynError> {
+        //let string = value.     try_decode()?;
+        //let string = <&str as Decode<AnyValueRef>>::decode(value)?;
+        let v = value.to_owned();
+        let string = value.parse()?;
+        let value = UserStatus::from_str(&string);
+        Ok(value)
+    }
+}
+
+
+impl<'r, DB: Database> Decode<'r, DB> for UserStatus
+where
+    // we want to delegate some of the work to string decoding so let's make sure strings
+    // are supported by the database
+    &'r str: Decode<'r, DB>
+{
+    fn decode(
+        value: <DB as HasValueRef<'r>>::ValueRef,
+    ) -> Result<UserStatus, Box<dyn Error + 'static + Send + Sync>> {
+        // the interface of ValueRef is largely unstable at the moment
+        // so this is not directly implementable
+        // however, you can delegate to a type that matches the format of the type you want
+        // to decode (such as a UTF-8 string)
+        let val = <&str as Decode<DB>>::decode(value)?;
+        // now you can parse this into your type (assuming there is a `FromStr`)
+        //Ok(value.parse()?)
+        Ok(UserStatus::from_str(&val))
+    }
+}
+*/
+
+/* 
+impl<'r> Decode<'r, sqlx::Any> for UserStatus {
+    fn decode(
+        value: sqlx::any::AnyValueRef<'r>,
+    ) -> Result<Self, sqlx::error::BoxDynError> {
+        //let mut decoder = <dyn sqlx::any::AnyDecode>::new(value)?;
+        //let string = decoder.try_decode::<String>()?;
+        //let username = decoder.try_decode::<String>()?;
+        //let photo = decoder.try_decode::<Option<String>>()?;
+        let string = <&str as Decode<sqlx::Any>>::decode(value)?;
+        let value = UserStatus::from_str(&string);
+        Ok(value)
+    }
+}
+impl<'r> Decode<'r, sqlx::Sqlite> for UserStatus {
+    fn decode(
+        value: sqlx::sqlite::SqliteValueRef<'r>,
+    ) -> Result<Self, sqlx::error::BoxDynError> {
+        let string = <&str as Decode<sqlx::Sqlite>>::decode(value)?;
+        let value = UserStatus::from_str(string);
+        Ok(value)
+    }
+}
+// impl<'r> Decode<'r, sqlx::Mssql> for UserStatus {
+//     fn decode(
+//         value: sqlx::mssql::MssqlValueRef<'r>,
+//     ) -> Result<UserStatus, Box<dyn Error + 'static + Send + Sync>> { 
+//     //) -> Result<Self, sqlx::error::BoxDynError> {
+//         let string = <&str as Decode<sqlx::Mssql>>::decode(value)?;
+//         let value = UserStatus::from_str(string);
+//         Ok(value)
+//     }
+// }
+impl<'r> Decode<'r, sqlx::MySql> for UserStatus {
+    fn decode(
+        value: sqlx::mysql::MySqlValueRef<'r>,
+    ) -> Result<Self, sqlx::error::BoxDynError> {
+        let string = <&str as Decode<sqlx::MySql>>::decode(value)?;
+        let value = UserStatus::from_str(string);
+        Ok(value)
+    }
+}
+impl<'r> Decode<'r, sqlx::Postgres> for UserStatus {
+    fn decode(
+        value: sqlx::postgres::PgValueRef<'r>,
+    ) -> Result<Self, sqlx::error::BoxDynError> {
+        //let mut decoder = sqlx::postgres::types::PgRecordDecoder::new(value)?;
+        ////let username = decoder.try_decode::<String>()?;
+        //let string = decoder.try_decode::<String>()?;
+        let string = <&str as Decode<sqlx::Postgres>>::decode(value)?;
+        let value = UserStatus::from_str(string);
+        Ok(value)
+    }
+}
+
+impl FromRow<'_, AnyRow> for UserStatus {
+    fn from_row(row: &AnyRow) -> sqlx::Result<Self> {
+        let v: String = row.try_get("status")?;
+        Ok(
+           UserStatus::from_str(&v)
+        )
+    }
+}
+impl FromStr for UserStatus {
+    type Err = ();
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        Ok(UserStatus::from_str(s))
+    }
+}
+
+*/
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/defs/userstore.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/defs/userstore.rs.html new file mode 100644 index 0000000..e8d12e7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/defs/userstore.rs.html @@ -0,0 +1,96 @@ +userstore.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
use sqlx::AnyPool;
+use std::env;
+
+use crate::USERS_FILESTORE;
+
+#[derive(Clone)]
+pub enum UserStore {
+    File(String),
+    Sql(AnyPool),
+   // SqlLite(SqlitePool),
+    // None
+}
+impl UserStore {
+    #[allow(dead_code)]
+    pub async fn from_str(store: &str) -> Self {
+        match store {
+            "fs"|"file"|"FS"|"FILE" => {
+                println!("From File: {}",USERS_FILESTORE);
+                UserStore::File(String::from(USERS_FILESTORE))
+            }
+            "db"|"DB"|_ => {
+                let db_url = env::var("DATABASE_URL").unwrap_or_else(|e|{
+                    eprintln!("Error env DATABASE_URL: {}",e);
+                    std::process::exit(2)
+                });
+                let pool = AnyPool::connect(&db_url).await.unwrap_or_else(|e|{
+                    eprintln!("Error pool DATABASE_URL: {}",e);
+                    std::process::exit(2)
+                });
+                println!("From DB: {}",&db_url);
+                UserStore::Sql(pool)
+            },
+        }
+    }
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/handlers.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/handlers.rs.html new file mode 100644 index 0000000..a095b3e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/handlers.rs.html @@ -0,0 +1,55 @@ +handlers.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
mod users_handlers;
+mod other_handlers;
+mod pages_handlers;
+mod admin_handlers;
+
+pub(crate) use users_handlers::users_router_handlers;
+pub(crate) use admin_handlers::admin_router_handlers;
+pub(crate) use pages_handlers::pages_router_handlers;
+
+pub(crate) use other_handlers::{
+    rewrite_request_uri,
+    add_session_cookie,
+    get_auth_state,
+    handle_404,
+};
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/handlers/admin_handlers.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/handlers/admin_handlers.rs.html new file mode 100644 index 0000000..a90a91d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/handlers/admin_handlers.rs.html @@ -0,0 +1,1043 @@ +admin_handlers.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+
use std::sync::Arc;
+//use std::{sync::Arc, os::unix::fs::chroot};
+//use urlencoding::{encode,decode};
+use axum::{
+    http::{
+        StatusCode,
+        Uri,
+        header::HeaderMap,
+    },
+    Json,
+    routing::{get,post},
+    Extension,
+    response::{IntoResponse,Response,Redirect},
+    Router,
+};
+//use tower_cookies::{Cookie, Cookies};
+use tower_cookies::Cookies;
+
+use crate::{
+//    SESSION_COOKIE_NAME,
+//    DEFAULT_ROLES,
+    route,
+    defs::{
+        AppDBs,
+        User,
+//        UserData,
+//        UserLogin,
+        UserItem,
+        UserStatus,
+//        UserInvitation,
+//        AuthState,
+//        SessionStoreDB,
+        ReqHandler,
+        ReqHeaderMap,
+//        MailMessage,
+//        TotpMode,
+    },
+//    login_password::{generate_hash,verify_password},
+    handlers::{
+        add_session_cookie,
+        get_auth_state,
+    },
+//    tools::str_date_from_timestamp,
+};
+pub fn admin_router_handlers() -> Router {
+    async fn users_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if !auth_state.is_admin() {
+            return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "user_handler"
+        );
+        let usrs = match User::list(&app_dbs.user_store, true, false, "").await {
+            Ok(data) => data,
+            Err(e) => {
+                println!("Error list users: {}",e);
+                Vec::new()
+            },
+        };
+        req_handler.context.insert("usrs", &usrs);
+        req_handler.context.insert("total_usrs", &usrs.len());
+        req_handler.context.insert("with_menu", "1");
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("users") {
+            req_handler.render_template(&tpl,"Users")
+        } else {
+            String::from("Users")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+     async fn user_get_handler(
+        header: HeaderMap,
+        //uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        // let req_handler = ReqHandler::new(
+        //     ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+        //     &app_dbs,
+        //     &uri,
+        //     &auth_state,
+        //     "update_user_handler"
+        // ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"application/json; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let mut user_sel = User::select(&user_item.name, &user_item.value, true,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        user_sel.password = String::from("");
+        user_sel.otp_base32 = String::from("");
+        let result = serde_json::to_string(&user_sel).unwrap_or_else(|e|{
+            println!("Error to convert user items to json: {}",e);
+            String::from("")
+        });
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn user_save_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        //_auth_state: AuthState,
+        Json(new_user): Json<User>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"text/plain; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let mut user_sel = User::select("id", &format!("{}",&new_user.id), false,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        user_sel.from_user(new_user);
+        let user_data = user_sel.session_data();
+        if user_sel.update(&app_dbs.user_store).await.is_err() {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let session_token = req_handler.new_token();
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        if app_dbs.config.verbose > 1 { 
+            println!("session cookie: {}", &session_cookie)
+        };
+        let result = String::from("Ok");
+        (
+            res_headers,
+            result 
+        ).into_response()
+    }
+     async fn user_delete_handler(
+        header: HeaderMap,
+        //uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        // let req_handler = ReqHandler::new(
+        //     ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+        //     &app_dbs,
+        //     &uri,
+        //     &auth_state,
+        //     "update_user_handler"
+        // ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"application/json; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let user_sel = User::select(&user_item.name, &user_item.value, true,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        let result = match User::delete(user_sel.id,&app_dbs.user_store).await {
+            Ok(val) => if val {
+                format!("Ok")
+            } else {
+                format!("Error user not deleted")
+            },
+            Err(e) => {
+                println!("Error delete user: {}", e);
+                format!("Error on delete user")
+            }
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn user_as_admin_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"application/json; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let mut user_sel = User::select(&user_item.name, &user_item.value, true,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        let result = if user_sel.isadmin {
+            format!("User already admin")
+        } else {
+            user_sel.isadmin = true;
+            let user_data = user_sel.session_data();
+            if user_sel.update(&app_dbs.user_store).await.is_err() {
+                return (
+                    StatusCode::BAD_REQUEST,
+                    req_handler.req_header.header,
+                    "Error"
+                ).into_response();
+            }
+            let session_token = req_handler.new_token();
+            let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+            if app_dbs.config.verbose > 1 { 
+                println!("session cookie: {}", &session_cookie)
+            };
+            String::from("Ok")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn user_disable_totp_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"application/json; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let mut user_sel = User::select(&user_item.name, &user_item.value, true,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        let result = if user_sel.otp_enabled && !user_sel.otp_base32.is_empty() {
+            user_sel.disable_totp();
+            let user_data = user_sel.session_data();
+            if user_sel.update(&app_dbs.user_store).await.is_err() {
+                return (
+                    StatusCode::BAD_REQUEST,
+                    req_handler.req_header.header,
+                    "Error"
+                ).into_response();
+            }
+            let session_token = req_handler.new_token();
+            let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+            if app_dbs.config.verbose > 1 { 
+                println!("session cookie: {}", &session_cookie)
+            };
+            String::from("Ok")
+        } else {
+            format!("User does not have TOTP enabled")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn user_passwd_reset_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        dbg!(&user_item);
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+           ).into_response();
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        res_headers.append(axum::http::header::CONTENT_TYPE,"application/json; charset=utf-8".parse().unwrap());
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        if !auth_state.is_admin() {
+            return (
+                    StatusCode::UNAUTHORIZED,
+                    res_headers,
+                    "Error"
+           ).into_response();
+        }
+        let mut user_sel = User::select(&user_item.name, &user_item.value, true,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error"
+            ).into_response();
+        }
+        dbg!(&user_item);
+        let result = if user_sel.status != UserStatus::Active {
+            return (
+                StatusCode::BAD_REQUEST,
+                res_headers,
+                "Error User not active !!"
+            ).into_response()
+        } else {
+            user_sel.status = UserStatus::Pending;
+            // TODO send email notification and redirect in login to completed pending task
+            let user_data = user_sel.session_data();
+            if user_sel.update(&app_dbs.user_store).await.is_err() {
+                return (
+                    StatusCode::BAD_REQUEST,
+                    req_handler.req_header.header,
+                    "Error"
+                ).into_response();
+            }
+            let session_token = req_handler.new_token();
+            let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+            if app_dbs.config.verbose > 1 { 
+                println!("session cookie: {}", &session_cookie)
+            };
+            String::from("Ok")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    route("/users", get(users_handler))
+        .route("/userget", post(user_get_handler))
+        .route("/usersave", post(user_save_handler))
+        .route("/userdelete", post(user_delete_handler))
+        .route("/userdisabletotp", post(user_disable_totp_handler))
+        .route("/userasadmin", post(user_as_admin_handler))
+        .route("/passwdreset", post(user_passwd_reset_handler))
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/handlers/other_handlers.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/handlers/other_handlers.rs.html new file mode 100644 index 0000000..4e69d9a --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/handlers/other_handlers.rs.html @@ -0,0 +1,362 @@ +other_handlers.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+
use std::sync::Arc;
+use casbin::CoreApi;
+use axum::{
+    extract::Request,
+    http::{
+        StatusCode,
+    },
+    Extension,
+    response::{IntoResponse,Response,Redirect},
+    middleware::Next, 
+};
+use tower_cookies::{Cookie, Cookies};
+
+use crate::{
+    USER_AGENT,
+    SESSION_COOKIE_NAME,
+    defs::{
+        AppDBs,
+        ServPath,
+        AuthState,
+        SessionStoreDB,
+    },
+};
+
+/* // OLD get_cookie from Request 
+pub fn get_cookie(req: &Request) -> Option<u128> {
+    req
+        .headers()
+        .get_all("Cookie")
+        .iter()
+        .filter_map(|cookie| {
+            cookie
+                .to_str()
+                .ok()
+                .and_then(|cookie| cookie.parse::<Cookie>().ok())
+        })
+        .find_map(|cookie| {
+            (cookie.name() == SESSION_COOKIE_NAME).then(move || cookie.value().to_owned())
+        })
+        .and_then(|cookie_value| cookie_value.parse::<u128>().ok())
+}
+*/
+
+pub async fn add_session_cookie(make: bool, cookies: &Cookies, session_token: &str, user_data: &str, expire: u64, app_dbs: &AppDBs, cookie_path: &str) -> String {
+    if make {
+        cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+    }
+    let result_store = SessionStoreDB::store_session_data(&session_token,&user_data, expire, &app_dbs).await;
+    if result_store.is_empty() {
+        eprintln!("Unable to store session {}", &app_dbs.config.session_store_uri);
+    } else {
+        let cookie = Cookie::build(SESSION_COOKIE_NAME, result_store.to_owned())
+        //  .domain(domain)
+            .path(format!("{}",cookie_path))
+            .secure(true)
+            .http_only(true)
+            .finish();
+        if make {
+            cookies.add(cookie);
+        }
+    }
+    result_store
+}
+pub async fn get_auth_state(update: bool, cookies: &Cookies, app_dbs: &AppDBs) -> AuthState {
+    if let Some(s_cookie) = cookies.get(SESSION_COOKIE_NAME) {
+        let session_cookie = s_cookie.to_string().replace(&format!("{}=",SESSION_COOKIE_NAME),"");
+        let mut auth_state = AuthState::from_cookie(session_cookie.to_string(), app_dbs).await;
+        if update {
+            let _ = auth_state.expire_in(app_dbs.config.session_expire, &app_dbs).await;
+        }
+        auth_state
+    } else {
+        // eprintln!("get_auth_state: No SESSION COOKIE found ");
+        AuthState::default()
+    }
+}
+
+pub async fn rewrite_request_uri(
+    Extension(app_dbs): Extension<Arc<AppDBs>>,
+    Extension(cookies): Extension<Cookies>,
+    req: Request, next: Next,
+) -> Result<impl IntoResponse, Response> {
+    // TODO Trace acccess to log or user session file !!!
+    let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+    let uri_path = req.uri().path().to_owned();
+    if uri_path == "/" {
+        return Ok(next.run(req).await);
+    }
+    // For long path is better than:
+    // let arr_root_path: Vec<String> = uri_path.split("/").map(|s| s.to_string()).collect();
+    // let root_path = arr_root_path[1].to_owned();
+    let mut root_path = String::from("/");
+    for it in uri_path.split("/") {
+        if ! it.is_empty() {  
+            root_path = format!("/{}",it.to_owned());
+            break;
+        }
+    }
+    let serv_paths: Vec<ServPath> = app_dbs.config.serv_paths.clone().into_iter().filter(
+        |it| it.is_restricted && it.url_path == root_path
+    ).collect();
+    // Only on First one
+    if serv_paths.len() > 0 {
+        let serv_path = serv_paths[0].to_owned();
+        let name = auth_state.user_name();
+        if name.is_empty() {
+            let uri_path = req.uri().path().to_string();
+            if uri_path.ends_with(".html") {
+                eprintln!("rewrite_request_uri: No user found in session for {}", &uri_path);
+                let new_uri = format!("{}?o={}",&serv_path.not_auth.as_str(),req.uri().path().to_string());
+                return Err(
+                    Redirect::temporary( &new_uri).into_response()
+                );
+            } else {
+                return Ok(next.run(req).await);
+            } 
+        }
+        let arr_roles: Vec<String> = auth_state.user_roles().split(",").map(|s| s.replace(" ", "").to_string()).collect();
+        let req_method = req.method().to_string();
+        let target_path = serv_path.url_path.to_owned();
+        let enforcer = app_dbs.enforcer.clone();
+        for role in arr_roles {
+            let mut lock = enforcer.write().await;
+            let result = lock.enforce_mut(
+                vec![role,target_path.to_owned(), req_method.to_owned()]
+            ).unwrap_or_else(|e|{
+                println!("Error enforce: {}",e);
+                false
+            });
+            drop(lock); 
+            if result { return Ok(next.run(req).await); }
+        }
+        // try with email
+        let mut lock = enforcer.write().await;
+        let result = lock.enforce_mut(
+           vec![
+                name,
+                target_path.to_owned(),
+                req_method.to_owned()
+            ]
+        ).unwrap_or_else(|e|{
+            println!("Error enforce: {}",e);
+            false
+        });
+        drop(lock); 
+        if result { return Ok(next.run(req).await); }
+        let new_uri = format!("{}",serv_path.not_auth);
+        let agent = if let Some(user_agent) = req.headers().get(USER_AGENT) {
+           user_agent.to_str().unwrap_or("").to_owned()
+        } else {
+            String::from("")
+        };
+        if agent.contains("curl") {
+            return Ok(
+                format!("Got to {}",&new_uri).into_response()
+            );
+        } else {
+            return Err(
+                Redirect::temporary(&new_uri).into_response()
+            );
+        }
+    } 
+    Ok(next.run(req).await)
+}
+pub async fn handle_404(_req: Request) -> (StatusCode, &'static str) {
+    (StatusCode::NOT_FOUND, "Not found")
+}
+
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/handlers/pages_handlers.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/handlers/pages_handlers.rs.html new file mode 100644 index 0000000..8b460d8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/handlers/pages_handlers.rs.html @@ -0,0 +1,233 @@ +pages_handlers.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+
use std::sync::Arc;
+use axum::{
+    //extract::{self,Request,Query},
+    http::{
+//        StatusCode,
+        Uri,
+        header::HeaderMap,// HeaderValue},
+    },
+//    Json,
+    routing::get,
+    Extension,
+    response::{IntoResponse,Response},
+//    http::Request, handler::HandlerWithoutStateExt, http::StatusCode, routing::get, Router,    
+    Router,
+};
+use tower_cookies::Cookies;
+
+use crate::{
+    route,
+    defs::{
+        AppDBs,
+        ReqHandler,
+        ReqHeaderMap,
+    },
+    handlers::get_auth_state,
+};
+
+pub fn pages_router_handlers() -> Router {
+    async fn page_handler(
+        //req: Request,
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        // Extension(random): Extension<Random>,
+        Extension(cookies): Extension<Cookies>,
+        axum::extract::Path(name): axum::extract::Path<String>,
+        //auth_state: AuthState,
+    ) -> Response {
+        // if let Some(cookie_value) = get_cookie(&req) {
+        //     println!("cookie_value: {}",&cookie_value.to_string());
+        //     // TODO check value 
+        // }
+        //let  has_cookie: bool;
+        // dbg!(&auth_state.session);
+        // if auth_state.user.is_none() {
+        //     eprintln!("No user found in session");
+        // }
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        //    has_cookie=true;
+            // TODO check value 
+            // let sid: String = format!("{}",&auth_state.sid());
+            // println!("auth_sid: {}",&sid);
+            // println!("id: {}",&auth_state.id());
+            // println!("is_expired: {}",&auth_state.ses_expired());
+            // println!("is_destroyed: {}",&auth_state.ses_destroyed());
+            // println!("validate: {}",&auth_state.ses_validate());
+            // let _u = &auth_state.user;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        // if let Some(a) = auth_state {
+        //     println!("Auth State from root");
+        // }
+        // let uri_path = format!("{}",&uri.path().to_string());
+        // dbg!("uri: {}",&uri_path);
+        req_handler.prepare_response();
+        req_handler.context.insert("with_menu", "1");
+        let tpl_name = if name.contains(".html") {
+            name.replace(".html","")
+        } else {
+            name
+        };
+        let result = req_handler.render_template(&format!("pages/{}.html.j2",&tpl_name), &tpl_name);
+        // if !has_cookie {
+        //     let mut u128_pool = [0u8; 16];
+        //     match random.lock() {
+        //         Ok(mut r) => r.fill_bytes(&mut u128_pool),
+        //         Err(e) => println!("Error random: {}",e),
+        //     }
+        //     let session_token = u128::from_le_bytes(u128_pool).to_string();
+        //     let user_data = format!("{}|{}","jesus" ,"admin,dev");
+        //     let result_store = SessionStoreDB::store_session_data(&session_token,&user_data,&app_dbs).await;
+        //     println!("Rest store: {}",&result_store);
+        //     let cookie = Cookie::build(SESSION_COOKIE_NAME, session_token.to_owned())
+        //     //  .domain(domain)
+        //         .path("/")
+        //         .secure(true)
+        //         .http_only(true)
+        //         .finish();
+        //     cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+        //     cookies.add(cookie);
+        // }
+        (
+            req_handler.req_header.header,
+            result.to_owned()
+        ).into_response()
+    //     "Hello, World!"
+    }
+    route("/page/:name", get(page_handler))
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/handlers/users_handlers.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/handlers/users_handlers.rs.html new file mode 100644 index 0000000..5351421 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/handlers/users_handlers.rs.html @@ -0,0 +1,3114 @@ +users_handlers.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+
use std::sync::Arc;
+use urlencoding::{encode,decode};
+// use tokio::sync::RwLock;
+use axum::{
+    //extract::{self,Request,Query},
+    http::{
+        StatusCode,
+        Uri,
+        header::HeaderMap,// HeaderValue},
+    },
+    Json,
+    routing::{get,post},
+    Extension,
+    response::{IntoResponse,Response,Redirect},
+//    http::Request, handler::HandlerWithoutStateExt, http::StatusCode, routing::get, Router,    
+    Router,
+};
+// use rand_core::RngCore;
+use tower_cookies::{Cookie, Cookies};
+
+use crate::{
+    SESSION_COOKIE_NAME,
+    DEFAULT_ROLES,
+    route,
+    defs::{
+        AppDBs,
+        User,
+        // UserStore,
+//        UserId,
+        UserData,
+        UserLogin,
+        UserItem,
+        UserStatus,
+        UserInvitation,
+        AuthState,
+        SessionStoreDB,
+        ReqHandler,
+        ReqHeaderMap,
+        MailMessage,
+//        TotpAlgorithm,
+        TotpMode,
+//        Random,
+        // UserNotifyData,
+        // TOKEN_AUTH_VALUE,
+        // TOKEN_KEY_VALUE,
+    },
+    login_password::{generate_hash,verify_password},
+    handlers::{
+        add_session_cookie,
+        get_auth_state,
+    },
+};
+pub fn users_router_handlers() -> Router {
+    async fn main_handler(
+        //req: Request,
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        // Extension(random): Extension<Random>,
+        Extension(cookies): Extension<Cookies>,
+        //auth_state: AuthState,
+    ) -> Response {
+        // if let Some(cookie_value) = get_cookie(&req) {
+        //     println!("cookie_value: {}",&cookie_value.to_string());
+        //     // TODO check value 
+        // }
+        //let  has_cookie: bool;
+        // dbg!(&auth_state.session);
+        // if auth_state.user.is_none() {
+        //     eprintln!("No user found in session");
+        // }
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        //    has_cookie=true;
+            // TODO check value 
+            // let sid: String = format!("{}",&auth_state.sid());
+            // println!("auth_sid: {}",&sid);
+            // println!("id: {}",&auth_state.id());
+            // println!("is_expired: {}",&auth_state.ses_expired());
+            // println!("is_destroyed: {}",&auth_state.ses_destroyed());
+            // println!("validate: {}",&auth_state.ses_validate());
+            // let _u = &auth_state.user;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        // if let Some(a) = auth_state {
+        //     println!("Auth State from root");
+        // }
+        // let uri_path = format!("{}",&uri.path().to_string());
+        // dbg!("uri: {}",&uri_path);
+        req_handler.prepare_response();
+        req_handler.context.insert("with_menu", "1");
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("main") {
+            req_handler.render_template(&tpl,"main")
+        } else {
+            String::from("main")
+        };
+        // if !has_cookie {
+        //     let mut u128_pool = [0u8; 16];
+        //     match random.lock() {
+        //         Ok(mut r) => r.fill_bytes(&mut u128_pool),
+        //         Err(e) => println!("Error random: {}",e),
+        //     }
+        //     let session_token = u128::from_le_bytes(u128_pool).to_string();
+        //     let user_data = format!("{}|{}","jesus" ,"admin,dev");
+        //     let result_store = SessionStoreDB::store_session_data(&session_token,&user_data,&app_dbs).await;
+        //     println!("Rest store: {}",&result_store);
+        //     let cookie = Cookie::build(SESSION_COOKIE_NAME, session_token.to_owned())
+        //     //  .domain(domain)
+        //         .path("/")
+        //         .secure(true)
+        //         .http_only(true)
+        //         .finish();
+        //     cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+        //     cookies.add(cookie);
+        // }
+        (
+            req_handler.req_header.header,
+            result.to_owned()
+        ).into_response()
+    }
+    // async fn auto_handler(
+    //     //req: Request,
+    //     header: HeaderMap,
+    //     uri: Uri,
+    //     Extension(app_dbs): Extension<Arc<AppDBs>>,
+    //     // Extension(random): Extension<Random>,
+    //     Extension(cookies): Extension<Cookies>,
+    //     // _auth_state: AuthState,
+    // ) -> Response {
+    //     // if let Some(cookie_value) = get_cookie(&req) {
+    //     //     println!("cookie_value: {}",&cookie_value.to_string());
+    //     //     // TODO check value 
+    //     // }
+    //     let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+    //     let has_cookie: bool;
+    //     if let Some(cookie_value) = cookies.get(SESSION_COOKIE_NAME) {
+    //         println!("cookie_value: {}",&cookie_value.to_string());
+    //         //has_cookie=true;
+    //         has_cookie=false;
+    //         // TODO check value 
+    //     } else {
+    //         has_cookie=false;
+    //     }
+    //     // if let Some(a) = auth_state {
+    //     //     println!("Auth State from root");
+    //     // }
+    //     let uri_path = format!("{}",&uri.path().to_string());
+    //     let file =  "hello.html";
+    //     let result = app_dbs.tera.render(&file, &app_dbs.context).unwrap_or_else(|e|{
+    //         println!("Error render {}: {}",&file,e);
+    //         String::from("")
+    //     });
+    //     /*
+    //     if !has_cookie {
+    //         let mut u128_pool = [0u8; 16];
+    //         match random.lock() {
+    //             Ok(mut r) => r.fill_bytes(&mut u128_pool),
+    //             Err(e) => println!("Error random: {}",e),
+    //         }
+    //         let session_token = u128::from_le_bytes(u128_pool).to_string();
+    //         let user_data = format!("{}|{}","jesus" ,"admin,dev");
+    //         let result_store = SessionStoreDB::store_session_data(&session_token,&user_data,&app_dbs).await;
+    //         println!("Rest store: {}",&result_store);
+    //         let cookie = Cookie::build(SESSION_COOKIE_NAME, result_store)
+    //         //  .domain(domain)
+    //             .path("/")
+    //             .secure(true)
+    //             .http_only(true)
+    //             .finish();
+    //         cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+    //         cookies.add(cookie);
+    //     }
+    //    */
+    //     dbg!("uri: {}",&uri_path);
+    //     (
+    //         header,
+    //         result.to_owned()
+    //     ).into_response()
+    // //     "Hello, World!"
+    // }
+
+    async fn signup_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        // auth_state: AuthState,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        if !auth_state.is_admin() {
+           let total_users = User::count(&app_dbs.user_store).await.unwrap_or_else(|e|{ 
+                println!("Count error: {}",e);
+                0
+            });
+            if ! app_dbs.config.signup_mode.contains("open") && total_users != 0 {
+                println!("Config signup mode not open: {}", app_dbs.config.signup_mode);
+                return Redirect::temporary( &format!("/")).into_response();
+            }
+            let total_users = User::count(&app_dbs.user_store).await.unwrap_or_else(|e|{ 
+                println!("Count error: {}",e);
+                -1
+            });
+            // Fake to insert firt time admin user ...
+            if total_users < 1  {
+                let isadmin=true;
+                req_handler.context.insert("isadmin", &isadmin);
+            }
+        }
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        req_handler.context.insert("password_score", &app_dbs.config.password_score);
+        req_handler.context.insert("totp_mode", &format!("{}",&app_dbs.config.totp_mode));
+        // req_handler.context.insert("with_menu", "1");
+        if app_dbs.config.totp_mode != TotpMode::No {
+            match req_handler.otp_generate() {
+                Ok(totp) => {
+                    req_handler.context.insert("otp_code", &totp.get_secret_base32());
+                    req_handler.context.insert("otp_url", &totp.get_url());
+                    req_handler.context.insert("otp_qr", &totp.get_qr().unwrap_or_default());
+                    req_handler.context.insert("totp_digits", &app_dbs.config.totp_digits);
+                    req_handler.context.insert("totp_algorithm",&format!("{}",&app_dbs.config.totp_algorithm));
+                },
+                Err(e) => {
+                    println!("Error TOTP generartor: {}",e);
+                }
+            }
+        }
+        req_handler.context.insert("admin_fields", &app_dbs.config.admin_fields);
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("signup") {
+            req_handler.render_template(&tpl,"signup")
+        } else {
+            String::from("signup")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    
+    async fn post_signup_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        // Extension(random): Extension<Random>,
+        Extension(cookies): Extension<Cookies>,
+        // auth_state: AuthState,
+        Json(user_data): Json<UserData>,
+        // Extension(_cookies): Extension<Cookies>,
+    ) -> Response {
+        dbg!(&user_data);
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        if user_data.password.is_empty() {
+            // User already exists
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        if User::password_score(&user_data.password) < app_dbs.config.password_score {
+                return (
+                    StatusCode::UNAUTHORIZED,
+                    req_handler.req_header.header,
+                    "Error"
+                ).into_response();
+        }
+        let new_hash = generate_hash(&user_data.password);
+        // println!("password: {}", &new_hash);
+        // // if  user_data.password.is_empty() {
+        // //     return Err(error_page(&SignupError::MissingDetails));
+        // // }
+        // match verify_password(&user_data.password, &new_hash) {
+        //     Ok(_) => { 
+        //         println!("Is valid!");
+        //     },
+        //     Err(e) => {
+        //         println!("NOT valid {}",e);
+        //         //return Err(error_page(&SignupError::PasswordsDoNotMatch))
+        //     }
+        // }
+        let otp_enabled: bool;
+        let otp_verified: bool;
+        let otp_base32: String;
+        let otp_auth_url: String;
+        let otp_defs: String;
+        if app_dbs.config.totp_mode != TotpMode::No && !user_data.otp_auth.is_empty() {
+            match req_handler.otp_check(&user_data.otp_code,&user_data.otp_auth, "") {
+                Ok(val) => {
+                    if val {
+                        otp_enabled = true;
+                    } else {
+                        // otp_enabled = false;
+                        return (
+                            StatusCode::UNAUTHORIZED,
+                            req_handler.req_header.header,
+                            "Error"
+                        ).into_response();
+                    }
+                },
+                Err(e) => {
+                    println!("TOTP check: {}", e);
+                    return (
+                        StatusCode::UNAUTHORIZED,
+                        req_handler.req_header.header,
+                        "Error"
+                    ).into_response();
+                }
+            } 
+        } else {
+            otp_enabled = false;
+        }
+        if otp_enabled  {
+            otp_verified= true;
+            otp_base32 = user_data.otp_code.to_owned();
+            otp_auth_url = user_data.otp_url.to_owned();
+            otp_defs = format!("{},{}",
+                &app_dbs.config.totp_digits,
+                format!("{}",&app_dbs.config.totp_algorithm),
+            );
+        } else {
+            otp_verified = false;
+            otp_base32 = String::from("");
+            otp_auth_url = String::from("");
+            otp_defs = String::from("");
+        }
+        let roles = if ! user_data.roles.is_empty() {
+            user_data.roles.to_owned()
+        } else {
+            DEFAULT_ROLES.to_owned()
+        };
+        let isadmin = if user_data.id == "A" {
+            true
+        } else { 
+            false
+        };
+        let mut new_items = user_data.items.to_owned();
+        new_items.remove("invite_key");
+        new_items.remove("invite_id");
+        let user = User{
+            id: 0,
+            name: user_data.name.to_owned(),
+            fullname: user_data.name.to_owned(),
+            email:   user_data.email.to_owned(),
+            description: user_data.description.to_owned(),
+            password: new_hash,
+            otp_enabled,
+            otp_verified,
+            otp_base32,
+            otp_auth_url,
+            otp_defs,
+            created: chrono::Utc::now().timestamp().to_string(),
+            lastaccess: String::from(""),
+            status: UserStatus::Created,
+            items: User::json_items(new_items),
+            isadmin,
+            roles,
+        };
+        let usr_sel = User::select("name", &user_data.name, false, &app_dbs.user_store).await.unwrap_or_default();
+        if usr_sel.name == user_data.name {
+            // User already exists
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let user_data =  match user.add(&app_dbs.user_store).await {
+            Ok(id) => {
+                println!("user {} created -> {}", &user_data.name, id);
+                format!("{}|{}|{}",id, &user_data.name, &user_data.roles)
+            },
+            Err(e) => {
+                println!("user {} error -> {:#}", &user_data.name, e);
+                return (
+                    StatusCode::NOT_FOUND,
+                    req_handler.req_header.header,
+                    "Error"
+                ).into_response();
+            }
+        };
+        // let mut u128_pool = [0u8; 16];
+        // match random.lock() {
+        //    Ok(mut r) => r.fill_bytes(&mut u128_pool),
+        //    Err(e) => println!("Error random: {}",e),
+        // }
+        // let session_token = u128::from_le_bytes(u128_pool).to_string();
+        // TODO 
+        let session_token = req_handler.new_token();
+        println!("session: {}", &session_token.to_string());
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        println!("session cookie: {}", &session_cookie);
+        (
+            req_handler.req_header.header,
+            "Ok"
+         ).into_response()
+    }
+    async fn login_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        // auth_state: AuthState,
+    ) -> Response {
+        SessionStoreDB::cleanup_data(&app_dbs).await;
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let total_users = User::count(&app_dbs.user_store).await.unwrap_or_else(|e|{ 
+            println!("Count error: {}",e);
+            -1
+        });
+        if total_users < 1 {
+          return Redirect::temporary( &format!("/signup")).into_response();
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        // req_handler.context.insert("with_menu", "1");
+        req_handler.context.insert("use_mail", &app_dbs.config.use_mail);
+        req_handler.context.insert("totp_mode", &format!("{}",&app_dbs.config.totp_mode));
+        if app_dbs.config.totp_mode != TotpMode::No {
+            req_handler.context.insert("with_totp", "1");
+            req_handler.context.insert("totp_digits", &app_dbs.config.totp_digits);
+        }
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("login") {
+            req_handler.render_template(&tpl,"login")
+        } else {
+            String::from("login")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn post_login_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_login): Json<UserLogin>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        if user_login.name.is_empty() || user_login.password.is_empty() {
+        //     return Err(error_page(&SignupError::MissingDetails));
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let field = if user_login.name.contains("@") {
+            "email"
+        } else {
+            "name"
+        };
+        let mut user_sel = User::select(&field, &user_login.name, false, &app_dbs.user_store).await.unwrap_or_else(|e|{
+            println!("Error select: {}", e);
+            User::default()
+        });
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error data"
+            ).into_response();
+        }
+        if user_sel.status != UserStatus::Active && user_sel.status != UserStatus::Created {
+            return (
+                StatusCode::UNAUTHORIZED,
+                req_handler.req_header.header,
+                "Error status"
+            ).into_response();
+        }
+        if verify_password(&user_login.password, &user_sel.password).is_err() {
+            println!("password NOT valid");
+            // TODO
+            //return Err(error_page(&SignupError::PasswordsDoNotMatch))
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error data"
+            ).into_response();
+        }
+        let result=format!("{}:{}","OK",&user_sel.otp_verified);
+        if app_dbs.config.totp_mode != TotpMode::No {
+            if user_login.otp_auth.is_empty() 
+                && (app_dbs.config.totp_mode == TotpMode::Mandatory || user_sel.otp_enabled)
+            {
+                return (
+                    req_handler.req_header.header,
+                    result 
+                ).into_response();
+            } else if user_sel.otp_enabled && user_sel.otp_verified 
+                && !user_sel.otp_base32.is_empty() && !user_sel.otp_defs.is_empty() 
+            {
+                match req_handler.otp_check(&user_sel.otp_base32,&user_login.otp_auth, &user_sel.otp_defs) {
+                    Ok(val) => {
+                        if !val {
+                            return (
+                                StatusCode::UNAUTHORIZED,
+                                req_handler.req_header.header,
+                                "Error"
+                            ).into_response();
+                        }
+                    },
+                    Err(e) => {
+                        println!("TOTP check: {}", e);
+                        return (
+                            StatusCode::UNAUTHORIZED,
+                            req_handler.req_header.header,
+                            "Error"
+                        ).into_response();
+                    }
+                } 
+            } 
+        }
+        user_sel.lastaccess = chrono::Utc::now().timestamp().to_string();
+        if user_sel.status != UserStatus::Active { user_sel.status = UserStatus::Active }
+        let user_data = user_sel.session_data();
+        if user_sel.update(&app_dbs.user_store).await.is_err() {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let session_token = req_handler.new_token();
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        if app_dbs.config.verbose > 1 { 
+            println!("session cookie: {}", &session_cookie)
+        };
+        (
+            req_handler.req_header.header,
+            result 
+        ).into_response()
+    }
+
+    async fn logout_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+       //  _auth_state: AuthState,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let id = auth_state.id();
+        let res = auth_state.destroy(); 
+        cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+        if app_dbs.config.verbose > 1 { println!("Session: {} destroyed: {}",&id,&res); }
+        let auth_state = AuthState::default();
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        // these is to use user_items like color_theme 
+        // let user_items = User::hash_items(&auth_state.user_items());
+        // req_handler.context.insert("usr_items", &user_items);
+        req_handler.context.insert("with_menu", "1");
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("logout") {
+            req_handler.render_template(&tpl,"logout")
+        } else {
+            String::from("logout")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn check_item_handler(
+        header: HeaderMap,
+        _uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        //Extension(cookies): Extension<Cookies>,
+        //_auth_state: AuthState,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        // let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let result = if user_item.name == "password" {
+            User::estimate_password(&user_item.value)
+        } else  {
+            let user_sel = User::select(&user_item.name, &user_item.value, false,&app_dbs.user_store).await.unwrap_or_default();
+            if !user_sel.name.is_empty() {
+                // User not exists
+                return (
+                    StatusCode::BAD_REQUEST,
+                    header,
+                    "Error"
+                ).into_response();
+            }
+            String::from("OK")
+        };
+        (
+            header,
+            result.to_owned()
+        ).into_response()
+    }
+    // async fn edit_user_handler(
+    //     header: HeaderMap,
+    //     uri: Uri,
+    //     Extension(app_dbs): Extension<Arc<AppDBs>>,
+    //     Extension(cookies): Extension<Cookies>,
+    //     //_auth_state: AuthState,
+    // ) -> Response {
+    //     let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+    //     let mut req_handler = ReqHandler::new(
+    //         ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+    //         &app_dbs,
+    //         &uri,
+    //         &auth_state,
+    //         "root_handler"
+    //     ); 
+    //     let uri_path = format!("{}",&uri.path().to_string());
+    //     let file =  "hello.html";
+    //     let result = app_dbs.tera.render(&file, &app_dbs.context).unwrap_or_else(|e|{
+    //         println!("Error render {}: {}",&file,e);
+    //         String::from("")
+    //     });
+    //     req_handler.context.insert("with_menu", "1");
+    //     dbg!("uri: {}",&uri_path);
+    //     // let mut new_header = header.to_owned();
+    //     //new_header.append("Set-Cookie", "session_token=_; Max-Age=0".parse().unwrap());
+    //     // cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+    //     (
+    //         req_handler.req_header.header,
+    //         result.to_owned()
+    //     ).into_response()
+    // //     "Hello, World!"
+    // }
+    async fn user_settings_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            // User not exists
+            return Redirect::temporary( &format!("/")).into_response();
+        }
+        let user_sel = User::select("id", &user_id, true, &app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return Redirect::temporary( &format!("/")).into_response();
+        }
+        req_handler.context.insert("with_menu", "1");
+        req_handler.context.insert("user", &user_sel);
+        req_handler.context.insert("admin_fields", &app_dbs.config.admin_fields);
+        req_handler.context.insert("totp_mode", &format!("{}",&app_dbs.config.totp_mode));
+        // let user_items = User::hash_items(&user_sel.items);
+        // req_handler.context.insert("usr_items", &user_items);
+        req_handler.context.insert("no_edit", "true");
+        req_handler.context.insert("edit_target", "main");
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("user_settings") {
+            req_handler.render_template(&tpl,"user setting")
+        } else {
+            String::from("user settings")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+  async fn user_settings_edit_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        axum::extract::Path(data): axum::extract::Path<String>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "update_user_handler"
+        ); 
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        if data != "main" && data != "password" && data != "totp" {
+            return Redirect::temporary( &format!("/")).into_response();
+        }
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            // User not exists
+            return Redirect::temporary( &format!("/")).into_response();
+        }
+        let user_sel = User::select("id", &user_id, true, &app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            // User not exists
+            return Redirect::temporary( &format!("/")).into_response();
+        }
+        req_handler.context.insert("with_menu", "1");
+        req_handler.context.insert("user", &user_sel);
+        req_handler.context.insert("edit_target", &data);
+        req_handler.context.insert("admin_fields", &app_dbs.config.admin_fields);
+        req_handler.context.insert("totp_mode", &format!("{}",&app_dbs.config.totp_mode));
+        if data == "totp" && app_dbs.config.totp_mode != TotpMode::No {
+            if !user_sel.otp_base32.is_empty() {
+                match req_handler.otp_make(&user_sel.otp_base32, &user_sel.otp_defs) {
+                    Ok(totp) => {
+                        req_handler.context.insert("otp_code", &user_sel.otp_base32);
+                        req_handler.context.insert("otp_url", &user_sel.otp_auth_url);
+                        req_handler.context.insert("otp_qr", &totp.get_qr().unwrap_or_default());
+                    },
+                    Err(e) => {
+                        println!("User settings error totp: {}",e);
+                    }
+                }
+            } else {
+                match req_handler.otp_generate() {
+                    Ok(totp) => {
+                        req_handler.context.insert("otp_code", &totp.get_secret_base32());
+                        req_handler.context.insert("otp_url", &totp.get_url());
+                        req_handler.context.insert("otp_qr", &totp.get_qr().unwrap_or_default());
+                    },
+                    Err(e) => {
+                        println!("Error TOTP generartor: {}",e);
+                    }
+                }
+            }
+            req_handler.context.insert("totp_digits", &app_dbs.config.totp_digits);
+            req_handler.context.insert("totp_algorithm",&format!("{}",&app_dbs.config.totp_algorithm));
+        }
+        // req_handler.context.insert("no_edit", "true");
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("user_settings") {
+            req_handler.render_template(&tpl,"user setting")
+        } else {
+            String::from("user settings")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn post_user_settings_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        //_auth_state: AuthState,
+        Json(user_data): Json<UserData>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        }
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        let mut user_sel = User::select("id", &user_id, false,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        if !user_data.password.is_empty() {
+            if User::password_score(&user_data.password) < app_dbs.config.password_score {
+                return (
+                    StatusCode::UNAUTHORIZED,
+                    header,
+                    "Error"
+                ).into_response();
+            }
+            user_sel.password = generate_hash(&user_data.password);
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        let otp_enabled: bool;
+        if app_dbs.config.totp_mode != TotpMode::No && !user_data.otp_auth.is_empty() {
+            match req_handler.otp_check(&user_data.otp_code,&user_data.otp_auth, "") {
+                Ok(val) => {
+                    if val {
+                        otp_enabled = true;
+                    } else {
+                        // otp_enabled = fasle;
+                        return (
+                            StatusCode::UNAUTHORIZED,
+                            req_handler.req_header.header,
+                            "Error"
+                        ).into_response();
+                    }
+                },
+                Err(e) => {
+                    println!("TOTP check: {}", e);
+                    return (
+                        StatusCode::UNAUTHORIZED,
+                        req_handler.req_header.header,
+                        "Error"
+                    ).into_response();
+                }
+            } 
+        } else {
+            otp_enabled = false;
+        }
+        if otp_enabled  {
+            user_sel.otp_enabled= true;
+            user_sel.otp_verified= true;
+            user_sel.otp_base32 = user_data.otp_code.to_owned();
+            user_sel.otp_auth_url = user_data.otp_url.to_owned();
+            user_sel.otp_defs = format!("{},{}",
+                &app_dbs.config.totp_digits,
+                format!("{}",&app_dbs.config.totp_algorithm),
+            );
+        } else {
+            user_sel.otp_enabled= false;
+            user_sel.otp_verified = false;
+            user_sel.otp_base32 = String::from("");
+            user_sel.otp_auth_url = String::from("");
+            user_sel.otp_defs = String::from("");
+        }
+        user_sel.from_data(user_data);
+        let user_data = user_sel.session_data();
+        if user_sel.update(&app_dbs.user_store).await.is_err() {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let session_token = auth_state.id();
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        if app_dbs.config.verbose > 1 { 
+            println!("session cookie: {}", &session_cookie)
+        };
+        let result =String::from("OK");
+        (
+            req_handler.req_header.header,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn post_reset_password_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+    ) -> Response {
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "post_reset_password_handler"
+        );
+        if ! app_dbs.config.use_mail {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error no service"
+            ).into_response();
+        }
+        if user_item.name.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error"
+            ).into_response();
+        }
+        let field = if user_item.name.contains("@") {
+            "email"
+        } else {
+            "name"
+        };
+        let mut user_sel = User::select(&field, &user_item.name, false, &app_dbs.user_store).await.unwrap_or_else(|e|{
+            println!("Error select: {}", e);
+            User::default()
+        });
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error data"
+            ).into_response();
+        }
+        if user_sel.status != UserStatus::Active && user_sel.status != UserStatus::Created {
+            return (
+                StatusCode::UNAUTHORIZED,
+                req_handler.req_header.header,
+                "Error status"
+            ).into_response();
+        }
+        if app_dbs.config.totp_mode != TotpMode::No {
+            if user_sel.otp_base32.is_empty() 
+                && (app_dbs.config.totp_mode == TotpMode::Mandatory || user_sel.otp_enabled)
+            {
+                return (
+                    StatusCode::UNAUTHORIZED,
+                    req_handler.req_header.header,
+                   "Error data"
+                ).into_response();
+            } else if user_sel.otp_enabled && user_sel.otp_verified 
+                && !user_sel.otp_base32.is_empty() && !user_sel.otp_defs.is_empty() 
+            {
+                match req_handler.otp_check(&user_sel.otp_base32,&user_item.value, &user_sel.otp_defs) {
+                    Ok(val) => {
+                        if !val {
+                            return (
+                                StatusCode::UNAUTHORIZED,
+                                req_handler.req_header.header,
+                                "Error"
+                            ).into_response();
+                        }
+                    },
+                    Err(e) => {
+                        println!("TOTP check: {}", e);
+                        return (
+                            StatusCode::UNAUTHORIZED,
+                            req_handler.req_header.header,
+                            "Error"
+                        ).into_response();
+                    }
+                } 
+            } 
+        } 
+        let session_token = req_handler.new_token();
+        user_sel.status = UserStatus::Pending;
+        let user_data = user_sel.session_data();
+        let session_cookie = add_session_cookie(false,&cookies, &session_token, &user_data, app_dbs.config.session_expire, &app_dbs, "invitation").await;
+        let session_encoded_key = encode(session_cookie.as_str());
+        let body=format!("This is a user password reset request for docserver service");
+        let subject = format!("DocServer password reset");
+        let reset_url= format!(
+            "{}://{}/reset",
+            &app_dbs.config.protocol,
+            &app_dbs.config.hostport,
+        );
+        let reset_expiration = format!("{} minutes",(&app_dbs.config.session_expire/60));
+        req_handler.context.insert("reset_url", &reset_url);
+        req_handler.context.insert("reset_expiration", &reset_expiration);
+        req_handler.context.insert("email_body",&body);
+        req_handler.context.insert("reset_key",&session_encoded_key);
+        req_handler.context.insert("email_subject",&subject);
+        let mail_content= if let Some(tpl) = app_dbs.config.tpls.get("reset_password_mail_txt") {
+            req_handler.render_template(tpl, "reset password")
+        } else {
+            format!("{}\n{}\n{}/{}\n",&subject,&body,&reset_url,&session_cookie)
+        };
+        let mail_html_content = if let Some(tpl) = app_dbs.config.tpls.get("reset_password_mail_html") {
+            req_handler.render_template(tpl, "invite")
+        } else {
+            format!("{}\n{}\n{}/{}\n",&subject,&body,&reset_url,&session_cookie)
+        }; 
+        let mail_check = MailMessage::check(&app_dbs);
+        if ! mail_check.is_empty() {
+            (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error service"
+            ).into_response()
+        } else {
+            match MailMessage::new(
+                &app_dbs.config.mail_from,
+                &user_sel.email,
+            &app_dbs.config.mail_reply_to,
+            ) {
+                Ok(mail_message) => {
+                    match mail_message.send_html_message(
+                        &subject,
+                        &mail_content,
+                        &mail_html_content,
+                        &app_dbs
+                    ).await {
+                        Ok(_) => 
+                            (
+                                StatusCode::OK,
+                                format!("Mail sent to {}",&user_sel.name)
+                            ).into_response()
+                        ,
+                        Err(e) => { 
+                            println!("Error mail message send: {}",e);
+                            (
+                                StatusCode::INTERNAL_SERVER_ERROR,
+                                req_handler.req_header.header,
+                                "Error service"
+                            ).into_response()
+                        }
+                    }
+                },
+                Err(e) => {
+                    println!("Error mail message creation: {}",e);
+                    (
+                        StatusCode::BAD_REQUEST,
+                        req_handler.req_header.header,
+                        "Error service"
+                    ).into_response()
+                }
+            }
+        }
+        //let result=format!("{}","OK");
+        // if ! auth_state.user_roles().contains("dev") {
+        //    return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        // //    return (
+        // //         StatusCode::UNAUTHORIZED,
+        // //         header,
+        // //         "Error authorization"
+        // //     ).into_response(); 
+        // }
+        // (
+        //     //status,
+        //     req_handler.req_header.header,
+        //     result,
+        // ).into_response()
+    }
+    async fn reset_password_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        // Query(req_params): Query<ReqParams>,
+        axum::extract::Path(data): axum::extract::Path<String>,
+        //_auth_state: AuthState,
+    ) -> Response {
+        // dbg!(&user_item);
+        let session_cookie = decode(&data).unwrap_or_default().to_string();
+        let auth_state = AuthState::from_cookie(session_cookie.to_owned(), &app_dbs).await;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        ); 
+        let user_id = auth_state.user_id();
+        let user_sel = User::select("id", &user_id, false, &app_dbs.user_store).await.unwrap_or_else(|e|{
+            println!("Error select: {}", e);
+            User::default()
+        });
+        if user_sel.name.is_empty() {
+            // User not exists
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error data"
+            ).into_response();
+        }
+        dbg!(&user_sel);
+        if user_sel.status != UserStatus::Active {
+            return (
+                StatusCode::BAD_REQUEST,
+                req_handler.req_header.header,
+                "Error status" 
+            ).into_response();
+        }
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        req_handler.context.insert("with_menu", "1");
+        req_handler.context.insert("user", &user_sel);
+        req_handler.context.insert("edit_target", "password");
+        req_handler.context.insert("edit_reset", "password");
+        req_handler.context.remove("web_menu_items");
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("user_settings") {
+            req_handler.render_template(&tpl,"user setting")
+        } else {
+            String::from("user settings")
+        };
+        let user_data = user_sel.session_data();
+        let session_token = req_handler.new_token();
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        if app_dbs.config.verbose > 1 { 
+            println!("session cookie: {}", &session_cookie)
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn post_user_password_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        //_auth_state: AuthState,
+        Json(user_data): Json<UserData>,
+    ) -> Response {
+        if user_data.password.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if auth_state.session.is_none() {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        }
+        let user_id = auth_state.user_id();
+        if user_id.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        let mut user_sel = User::select("id", &user_id, false,&app_dbs.user_store).await.unwrap_or_default();
+        if user_sel.name.is_empty() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        if User::password_score(&user_data.password) < app_dbs.config.password_score {
+            return (
+                StatusCode::UNAUTHORIZED,
+                header,
+                "Error"
+            ).into_response();
+        }
+        user_sel.password = generate_hash(&user_data.password);
+        let user_data = user_sel.session_data();
+        if user_sel.update(&app_dbs.user_store).await.is_err() {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error"
+            ).into_response();
+        }
+        let session_token = auth_state.id();
+        let session_cookie = add_session_cookie(true,&cookies, &session_token, &user_data, 0, &app_dbs, "/").await;
+        if app_dbs.config.verbose > 1 { 
+            println!("session cookie: {}", &session_cookie)
+        };
+        let result =String::from("OK");
+        (
+            header,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn invite_signup_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        axum::extract::Path(data): axum::extract::Path<String>,
+        // auth_state: AuthState,
+    ) -> Response {
+        if ! app_dbs.config.signup_mode.contains("invitation") {
+            println!("Config signup mode not invitation: {}",
+               app_dbs.config.signup_mode
+            );
+           return Redirect::temporary( &format!("/")).into_response();
+        }
+        // println!("root_handler: {}",&session_cookie);
+        let session_cookie = decode(&data).unwrap_or_default().to_string();
+        let auth_state = AuthState::from_cookie(session_cookie.to_owned(), &app_dbs).await;
+        if auth_state.session.is_none() {
+            // TODO make it prettier 
+            return (
+                StatusCode::NOT_FOUND,
+                header,
+                "No valid invitation found" 
+            ).into_response();
+        }
+        dbg!(&auth_state);
+        let user_data = auth_state.user_data();
+        dbg!(&user_data);
+        let mut usr = User::default();
+        usr.roles = auth_state.user_roles();
+        usr.email = auth_state.user_email();
+        let usr_id = auth_state.user_id();
+        let invite_id = if usr_id == "0" {
+            usr_id
+        } else {
+          usr.email.to_owned()
+        };
+        dbg!(&usr);
+        // let _uri_path = format!("{}",&uri.path().to_string());
+        // let file =  "hello.html";
+        // let result = app_dbs.tera.render(&file, &app_dbs.context).unwrap_or_else(|e|{
+        //     println!("Error render {}: {}",&file,e);
+        //     String::from("")
+        // });
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "root_handler"
+        );
+        let mut res_headers = HeaderMap::new();
+        if req_handler.req_header.is_browser() {
+            res_headers.append(axum::http::header::CONTENT_TYPE,"text/html; charset=utf-8".parse().unwrap());
+        }
+        req_handler.context.insert("user", &usr);
+        req_handler.context.insert("isadmin", "");
+        req_handler.context.insert("totp_mode", &format!("{}",&app_dbs.config.totp_mode));
+        req_handler.context.insert("invite_key", &data);
+        req_handler.context.insert("invite_id", &invite_id);
+        req_handler.context.insert("admin_fields", &app_dbs.config.admin_fields);
+        let result = if let Some(tpl) = app_dbs.config.tpls.get("signup") {
+            req_handler.render_template(&tpl,"signup")
+        } else {
+            String::from("signup")
+        };
+        (
+            res_headers,
+            result.to_owned()
+        ).into_response()
+    }
+    async fn post_invite_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        //_auth_state: AuthState,
+        Json(user_invite): Json<UserInvitation>,
+        //axum::extract::Path(data): axum::extract::Path<String>,
+    ) -> Response {
+        //dbg!(&user_item);
+        if ! app_dbs.config.signup_mode.contains("invitation") {
+            println!("Config signup mode not invitation: {}",
+               app_dbs.config.signup_mode
+            );
+           return Redirect::temporary( &format!("/")).into_response();
+        }
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if ! auth_state.user_roles().contains("dev") {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        //    return (
+        //         StatusCode::UNAUTHORIZED,
+        //         header,
+        //         "Error authorization"
+        //     ).into_response(); 
+        }
+        if ! user_invite.email.contains("@") {
+            return (
+                StatusCode::BAD_REQUEST,
+                header,
+                "Error invitation data"
+            ).into_response(); 
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "invite_handler"
+        );
+        let session_token = req_handler.new_token();
+        let mut usr = User::default();
+        usr.email = user_invite.email.to_owned();
+        usr.roles = user_invite.roles.to_owned();
+        usr.isadmin = user_invite.isadmin;
+        usr.status = UserStatus::Pending;
+        let user_data = usr.session_data();
+        let session_cookie = add_session_cookie(false,&cookies, &session_token, &user_data, user_invite.expire, &app_dbs, "invitation").await;
+        let session_encoded_key = encode(session_cookie.as_str());
+        let body=format!("This is an invitation to docserver service");
+        let subject = format!("DocServer Invitation");
+        let signup_url= format!(
+            "{}://{}/signup",
+            &app_dbs.config.protocol,
+            &app_dbs.config.hostport,
+        );
+        let invite_expiration = format!("{} minutes",
+            (&app_dbs.config.session_expire/60)
+        );
+        req_handler.context.insert("signup_url", &signup_url);
+        req_handler.context.insert("invite_expiration", &invite_expiration);
+        req_handler.context.insert("email_body",&body);
+        req_handler.context.insert("invite_key",&session_encoded_key);
+        req_handler.context.insert("email_subject",&subject);
+        let (status, result) = if app_dbs.config.use_mail && user_invite.send_email {
+            let mail_content= if let Some(tpl) = app_dbs.config.tpls.get("invite_mail_txt") {
+                req_handler.render_template(tpl, "invite")
+            } else {
+                format!("{}\n{}\n{}/signup/{}\n",&subject,&body,&signup_url,&session_cookie)
+            };
+            let mail_html_content = if let Some(tpl) = app_dbs.config.tpls.get("invite_mail_html") {
+                req_handler.render_template(tpl, "invite")
+            } else {
+                format!("{}\n{}\n{}/signup/{}\n",&subject,&body,&signup_url,&session_cookie)
+            }; 
+            let mail_check = MailMessage::check(&app_dbs);
+            if ! mail_check.is_empty() {
+                (
+                   StatusCode::BAD_REQUEST,
+                    mail_check
+                )
+            } else {
+                //"jesus.perezlorenzo@gmail.com",
+                // "jesus@librecloud.online",
+                match MailMessage::new(
+                    &app_dbs.config.mail_from,
+                    &user_invite.email,
+                &app_dbs.config.mail_reply_to,
+                ) {
+                    Ok(mail_message) => {
+                        //match mail_message.send_message(
+                        match mail_message.send_html_message(
+                            &subject,
+                            &mail_content,
+                            &mail_html_content,
+                            &app_dbs
+                        ).await {
+                            Ok(_) => 
+                                (StatusCode::OK, format!("Mail sent to {}",&user_invite.email))
+                            ,
+                            Err(e) => { 
+                                println!("Error mail message send: {}",e);
+                                (
+                                    StatusCode::INTERNAL_SERVER_ERROR,
+                                    String::from("Error")
+                                )
+                            }
+                        }
+                    },
+                    Err(e) => {
+                        println!("Error mail message creation: {}",e);
+                        (
+                            StatusCode::BAD_REQUEST,
+                            String::from("Error")
+                        )
+                    }
+                }
+            }
+        } else {
+            (StatusCode::OK, format!("No mail sent to {}",&user_invite.email))
+        };
+        req_handler.prepare_response();
+        req_handler.context.insert("email_result",&result);
+        let response = if let Some(tpl) = app_dbs.config.tpls.get("invite_output") {
+            req_handler.render_template(tpl, "invite")
+        } else {
+            format!("{}\n{}\n{}/signup/{}\n",&subject,&body,&signup_url,&session_cookie)
+        };
+        (
+            status,
+            req_handler.req_header.header,
+            response,
+        ).into_response()
+    }
+    async fn invite_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        //axum::extract::Path(data): axum::extract::Path<String>,
+    ) -> Response {
+        //dbg!(&user_item);
+        if ! app_dbs.config.signup_mode.contains("invitation") {
+            println!("Config signup mode not invitation: {}",
+               app_dbs.config.signup_mode
+            );
+           return Redirect::temporary( &format!("/")).into_response();
+        }
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        dbg!(&auth_state);
+        if ! auth_state.user_roles().contains("dev") {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        //    return (
+        //         StatusCode::UNAUTHORIZED,
+        //         header,
+        //         "Error authorization"
+        //     ).into_response(); 
+        }
+        let mut req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "invite_handler"
+        );
+        let title = format!("DocServer Invitation");
+        let invite_url= format!(
+            "{}://{}/invite",
+            &app_dbs.config.protocol,
+            &app_dbs.config.hostport,
+        );
+        let invite_expire = format!("{} minutes",
+            (&app_dbs.config.invite_expire/60)
+        );
+        req_handler.context.insert("target_url", &invite_url);
+        req_handler.context.insert("invite_expire", &invite_expire);
+        if app_dbs.config.use_mail {
+            req_handler.context.insert("use_mail", &app_dbs.config.use_mail);
+        }
+        req_handler.prepare_response();
+        req_handler.context.insert("with_menu", "1");
+        let response = if let Some(tpl) = app_dbs.config.tpls.get("invite_create") {
+            req_handler.render_template(tpl, "invite create")
+        } else {
+            format!("{} invite",&title)
+        };
+        (
+            req_handler.req_header.header,
+            response,
+        ).into_response()
+        // let uri_path = format!("{}",&uri.path().to_string());
+        // let file =  "hello.html";
+        // let result = app_dbs.tera.render(&file, &app_dbs.context).unwrap_or_else(|e|{
+        //     println!("Error render {}: {}",&file,e);
+        //     String::from("")
+        // });
+        //dbg!("uri: {}",&uri_path);
+        // let mut new_header = header.to_owned();
+        //new_header.append("Set-Cookie", "session_token=_; Max-Age=0".parse().unwrap());
+        // cookies.remove(Cookie::new(SESSION_COOKIE_NAME, ""));
+        // (
+        //     header,
+        //     result.to_owned()
+        // ).into_response()
+    //     "Hello, World!"
+    }
+    async fn update_user_item_handler(
+        header: HeaderMap,
+        uri: Uri,
+        Extension(app_dbs): Extension<Arc<AppDBs>>,
+        Extension(cookies): Extension<Cookies>,
+        Json(user_item): Json<UserItem>,
+        //_auth_state: AuthState,
+        //axum::extract::Path(data): axum::extract::Path<String>,
+    ) -> Response {
+        dbg!(&user_item);
+        let auth_state = get_auth_state(true, &cookies, &app_dbs).await;
+        if ! auth_state.user_roles().contains("dev") {
+           return Redirect::temporary( &format!("/login?o={}",uri.path().to_string())).into_response();
+        //    return (
+        //         StatusCode::UNAUTHORIZED,
+        //         header,
+        //         "Error authorization"
+        //     ).into_response(); 
+        }
+        let req_handler = ReqHandler::new(
+            ReqHeaderMap::new(header, &format!("{}",&uri.path().to_string())),
+            &app_dbs,
+            &uri,
+            &auth_state,
+            "invite_handler"
+        );
+
+        let result="";
+        (
+            //status,
+            req_handler.req_header.header,
+            result,
+        ).into_response()
+    }
+    route("/", get(main_handler))
+    //   .route("/auto", get(auto_handler))
+
+        .route("/login", get(login_handler))
+        .route("/login", post(post_login_handler))
+
+        .route("/signup", get(signup_handler))
+        .route("/signup", post(post_signup_handler))
+        .route("/signup/:data", get(invite_signup_handler))
+
+        .route("/logout", get(logout_handler)) 
+
+        .route("/check", post(check_item_handler)) 
+
+        .route("/invite", get(invite_handler)) 
+        .route("/invite", post(post_invite_handler)) 
+
+        .route("/reset/:data", get(reset_password_handler)) 
+        .route("/reset", post(post_reset_password_handler)) 
+        .route("/resetup", post(post_user_password_handler)) 
+
+        .route("/settings", get(user_settings_handler)) 
+        .route("/settings/:item", get(user_settings_edit_handler)) 
+//         .route("/update", post(update_user_handler)) 
+        .route("/settings", post(post_user_settings_handler)) 
+        .route("/update_item", post(update_user_item_handler))
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/login_password.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/login_password.rs.html new file mode 100644 index 0000000..bc2dba4 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/login_password.rs.html @@ -0,0 +1,176 @@ +login_password.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+
// #![no_std]
+// #![doc = include_str!("../README.md")]
+// #![doc(
+//     html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg",
+//     html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/8f1a9894/logo.svg"
+// )]
+// #![warn(
+//     clippy::checked_conversions,
+//     clippy::integer_arithmetic,
+//     clippy::panic,
+//     clippy::panic_in_result_fn,
+//     clippy::unwrap_used,
+//     missing_docs,
+//     rust_2018_idioms,
+//     unused_lifetimes,
+//     unused_qualifications
+// )]
+
+extern crate alloc;
+#[cfg(feature = "std")]
+extern crate std;
+
+use alloc::string::{String, ToString};
+use core::fmt;
+use password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString};
+use rand_core::OsRng;
+
+// #[cfg(not(any(feature = "argon2", feature = "pbkdf2", feature = "scrypt")))]
+// compile_error!(
+//     "please enable at least one password hash crate feature, e.g. argon2, pbkdf2, scrypt"
+// );
+
+use argon2::Argon2;
+
+/// Opaque error type.
+#[derive(Clone, Copy, Debug)]
+pub struct VerifyError;
+
+impl fmt::Display for VerifyError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.write_str("password verification error")
+    }
+}
+
+// #[cfg(feature = "std")]
+// #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
+// impl std::error::Error for VerifyError {}
+
+/// Generate a password hash for the given password.
+pub fn generate_hash(password: impl AsRef<[u8]>) -> String {
+    let salt = SaltString::generate(OsRng);
+    generate_phc_hash(password.as_ref(), &salt)
+        .map(|hash| hash.to_string())
+        .expect("password hashing error")
+}
+
+/// Generate a PHC hash using the preferred algorithm.
+#[allow(unreachable_code)]
+fn generate_phc_hash<'a>(
+    password: &[u8],
+    salt: &'a SaltString,
+) -> password_hash::Result<PasswordHash<'a>> {
+    return Argon2::default().hash_password(password, salt);
+}
+
+/// Verify the provided password against the provided password hash.
+pub fn verify_password(password: impl AsRef<[u8]>, hash: &str) -> Result<(), VerifyError> {
+    let hash = PasswordHash::new(hash).map_err(|_| VerifyError)?;
+    let algs: &[&dyn PasswordVerifier] = &[
+        &Argon2::default(),
+    ];
+    hash.verify_password(algs, password)
+        .map_err(|_| VerifyError)
+}
+
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/main.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/main.rs.html new file mode 100644 index 0000000..a437148 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/main.rs.html @@ -0,0 +1,1110 @@ +main.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+

+//! Run 
+//! ```not_rust
+//! cargo run -p example-static-file-server
+//! ```
+
+// use axum_auth::AuthBasic;
+
+#![cfg_attr(docsrs, feature(doc_cfg))]
+#![doc(html_logo_url = "../images/docserver.svg")]
+#[doc = include_str!("../README.md")]
+// #![doc(html_no_source)]
+
+
+
+// TODO tasks https://docs.rs/async-sqlx-session/latest/async_sqlx_session/struct.SqliteSessionStore.html
+
+use rand_core::{SeedableRng,OsRng, RngCore};
+use rand_chacha::ChaCha8Rng;
+
+use axum::{
+    extract::Host,
+    handler::HandlerWithoutStateExt,
+    routing::MethodRouter,
+    http::{
+        StatusCode,
+        Uri,
+        header::HeaderValue,
+        Method,
+    },
+    BoxError,
+    Extension,
+    response::Redirect,
+//    http::Request, handler::HandlerWithoutStateExt, http::StatusCode, routing::get, Router,    
+    Router,
+};
+use tower::ServiceBuilder;
+use axum_server::tls_rustls::RustlsConfig;
+use std::{
+    net::SocketAddr, 
+    path::PathBuf,
+    sync::{Arc, Mutex},
+    path::Path, 
+};
+// use std::net::SocketAddr;
+// use tower::ServiceExt;
+use tower_http::{
+    services::{ServeDir,ServeFile},
+    trace::TraceLayer,
+    cors::CorsLayer,
+};
+use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
+use once_cell::sync::Lazy;
+// use once_cell::sync::{Lazy,OnceCell};
+// use async_session::{Session, SessionStore, MemoryStore};
+
+use tera::Context;
+use async_sqlx_session::SqliteSessionStore;
+use sqlx::AnyPool;
+
+mod tera_tpls;
+mod defs;
+mod login_password;
+mod handlers;
+mod tools;
+
+use defs::{
+    AppDBs,
+    SessionStoreDB,
+    UserStore,
+    FileStore,
+    Config,
+    parse_args,
+//    User,
+};
+use tera_tpls::init_tera;
+use tower_cookies::CookieManagerLayer;
+use handlers::{
+    handle_404,
+    rewrite_request_uri,
+    admin_router_handlers,
+    users_router_handlers,
+    pages_router_handlers,
+};
+use crate::tools::get_socket_addr;
+
+pub const USER_AGENT: &str = "user-agent";
+pub const SESSION_COOKIE_NAME: &str = "doc_session";
+pub const CFG_FILE_EXTENSION: &str  = ".toml";
+pub const FILE_SCHEME: &str = "file:///"; 
+
+pub const PKG_NAME: &str = env!("CARGO_PKG_NAME");
+// static WEBSERVER: AtomicUsize = AtomicUsize::new(0);
+pub const PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
+// const PKG_VERSION: Option&<&'static str> = option_env!("CARGO_PKG_VERSION");
+// const PKG_DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION");
+// const COOKIE_NAME: &str = "lc_authz";
+// const COOKIE_SEP: &str = ":tk:";
+const GIT_VERSION: &str = ""; //git_version::git_version!();
+static GIT_VERSION_NAME: Lazy<String> = Lazy::new(|| {
+    format!("v{} [build: {}]",PKG_VERSION,GIT_VERSION)
+});
+static PKG_FULLNAME: Lazy<String> = Lazy::new(|| {
+    format!("{}: TII CL Rust",PKG_NAME)
+});
+
+pub const USERS_TABLENAME: &str = "users";
+pub const USERS_FILESTORE: &str = "users";
+pub const DEFAULT_ROLES: &str = "user";
+
+
+#[derive(Clone, Copy)]
+struct Ports {
+    http: u16,
+    https: u16,
+}
+
+pub fn route(path: &str, method_router: MethodRouter) -> Router {
+    Router::new().route(path, method_router)
+}
+
+#[tokio::main]
+async fn main() {
+    let config_path = parse_args();
+    if config_path.is_empty() {
+        eprintln!("No config-file found");
+        std::process::exit(2)
+    }
+    //	pretty_env_logger::init();
+    let config = {
+        let mut server_cfg: Config = Config::load_from_file(&config_path, "server-config").unwrap_or_else(|e|{
+            eprintln!("Settings error: {}",e);
+            std::process::exit(2)
+        });
+        server_cfg.load_items();
+        //config.fix_root_path::<ServerConfig>(String::new());
+        server_cfg
+    };
+    if config.verbose > 1 { dbg!("{:?}",&config); }
+    tracing_subscriber::registry()
+        .with(
+            tracing_subscriber::EnvFilter::try_from_default_env()
+                .unwrap_or_else(|_| "example_static_file_server=debug,tower_http=debug".into()),
+        )
+        .with(tracing_subscriber::fmt::layer())
+        .init();
+
+    // you can convert handler function to service
+
+    // let store = FileStore {
+    //     sess_path: "store".to_owned(),
+    //     ses_file: "data".to_owned(),
+    //     // sess_path: sessions_config.session_store_uri.replace(FILE_SCHEME,"").to_owned(),
+    //     // ses_file: sessions_config.session_store_file.to_owned(),
+    // };
+    // let session_store = SessionStoreDB::connect_file_store(store);
+    // let session_store = SessionStoreDB::connect_memory_store();
+    let session_store = if config.session_store_uri.starts_with(FILE_SCHEME) {
+        let store = FileStore {
+            sess_path: config.session_store_uri.replace(FILE_SCHEME,"").to_owned(),
+            ses_file: config.session_store_file.to_owned(),
+        };
+        if let Err(e) = store.check_paths() {
+            eprintln!("Error creation File Store: {}",e);
+            std::process::exit(2)
+        }
+        SessionStoreDB::connect_file_store(store)
+    } else if config.session_store_uri.starts_with("sqlite:") {
+        let store = SqliteSessionStore::new(&config.session_store_uri).await.unwrap_or_else(|e|{
+            eprintln!("Error session database {}: {}",
+                config.session_store_uri,e
+            );
+            std::process::exit(2)
+        });
+        let _ = store.migrate().await;
+        let _ = store.cleanup().await;
+        SessionStoreDB::connect_sqlite_store(store)
+    } else if config.session_store_uri.starts_with("memory") {
+        SessionStoreDB::connect_memory_store()
+    } else {
+        SessionStoreDB::None
+    }; 
+    let user_store = if config.users_store_uri.starts_with(FILE_SCHEME) {
+        let users_store_uri = config.users_store_uri.replace(FILE_SCHEME,"").to_owned();
+        if ! Path::new(&users_store_uri).exists() {
+            if let Err(e) = std::fs::File::create(Path::new(&users_store_uri)) {
+                eprintln!("Error creation Users store {}: {}",
+                    &users_store_uri,e);
+                std::process::exit(2)
+            }
+        }
+        UserStore::File(users_store_uri)
+    // } else if config.users_store_uri.starts_with("sqlite:") {
+    } else if config.users_store_uri.contains("sql") {
+        //let m = Migrator::new(Path::new("./migrations")).await?;
+        //}
+        let pool = AnyPool::connect(&config.users_store_uri).await.unwrap_or_else(|e|{
+            eprintln!("Error pool database {}: {}",
+                config.users_store_uri,e
+            );
+            std::process::exit(2)
+        });
+        // let pool = SqlitePool::connect(&config.users_store_uri).await.unwrap_or_else(|e|{
+        //     eprintln!("Error pool database {}: {}",
+        //         config.users_store_uri,e
+        //     );
+        //     std::process::exit(2)
+        // });
+        UserStore::Sql(pool)
+    } else {
+        eprintln!("User store {}: Not defined",&config.users_store_uri);
+        std::process::exit(2)
+    };
+    #[cfg(feature = "casbin")]
+    let enforcer = if !config.authz_model_path.is_empty() && ! config.authz_policy_path.is_empty() {
+        AppDBs::create_enforcer(
+        Box::leak(config.authz_model_path.to_owned().into_boxed_str()),
+        Box::leak(config.authz_policy_path.to_owned().into_boxed_str())
+        ).await
+    } else {
+        eprintln!("Error auth enforcer {} + {}",
+            config.authz_model_path, config.authz_policy_path
+        );
+        std::process::exit(2);
+    };
+
+    let ports = Ports {
+        http: 7878,
+        https: 8800,
+    };
+    // optional: spawn a second server to redirect http requests to this server
+    if config.protocol.contains("http") {
+        tokio::spawn(redirect_http_to_https(ports));
+    }
+
+    let mut origins: Vec<HeaderValue> = Vec::new();
+    for itm in config.allow_origin.to_owned() {
+        match HeaderValue::from_str(itm.as_str()) {
+            Ok(val) => origins.push(val),
+            Err(e) =>  println!("error {} with {} header for allow_origin",e,itm),
+        }
+    }	
+
+    let mut context = Context::new();
+    context.insert("server_name","DOC Server");
+    context.insert("pkg_name",&PKG_NAME);
+    context.insert("pkg_version",&PKG_VERSION);
+    context.insert("git_version",&GIT_VERSION);
+    context.insert("git_version_name",GIT_VERSION_NAME.as_str());
+    context.insert("pkg_fullname",PKG_FULLNAME.as_str());
+
+    // let app = Router::new().route("/", get(handler));
+    #[cfg(feature = "authstore")]
+    let app_dbs = Arc::new(
+        AppDBs::new(&config, session_store, user_store,
+            init_tera(&config.templates_path), context
+        )
+    );
+    #[cfg(feature = "casbin")]
+    let app_dbs = Arc::new(
+        AppDBs::new(&config, session_store, user_store, enforcer,
+            init_tera(&config.templates_path), context
+        )
+    );
+    let middleware = 
+        axum::middleware::from_fn_with_state(app_dbs.clone(),rewrite_request_uri);
+    // apply the layer around the whole `Router`
+    // this way the middleware will run before `Router` receives the request
+
+    let mut web_router = Router::new();
+
+    // Parse serv_paths to add static paths as service 
+    for item in &config.serv_paths {
+        // Try to check src_path ...
+        let src_path: String;
+        if Path::new(&item.src_path).exists() {
+            src_path = format!("{}",item.src_path); 
+        } else {
+            src_path = if item.src_path.starts_with("/") {
+                format!("{}",item.src_path)
+            } else {
+                format!("{}/{}",&config.root_path,item.src_path)
+            };
+            if ! Path::new(&src_path).exists() {
+                eprintln!("File path {}: not found", &src_path);
+                continue;
+            } 
+        }    
+        // Add ServeDir with not_found page ...
+        if item.not_found.is_empty() {
+            web_router = web_router.nest_service(
+                &item.url_path,
+                ServeDir::new(&src_path).not_found_service(handle_404.into_service())
+            );
+            println!("Added path {} => {}", &src_path,&item.url_path);
+        } else {
+            web_router = web_router.nest_service(
+                &item.url_path,
+                ServeDir::new(&src_path).not_found_service(ServeFile::new(&item.not_found))
+            );
+            println!("Added path {} => {} ({})", &src_path,&item.url_path,&item.not_found);
+        }
+    }
+    web_router = web_router
+        .merge(users_router_handlers())
+        .merge(admin_router_handlers())
+        .merge(pages_router_handlers())
+        .layer(ServiceBuilder::new().layer(middleware))
+        .layer(CookieManagerLayer::new())
+        .layer(Extension(app_dbs))
+        .fallback_service(handle_404.into_service())
+        ;
+
+    if config.use_random {
+        let mut key = [0u8; 16];
+        let mut os_rng = OsRng{};
+        os_rng.fill_bytes(&mut key);
+        let random = ChaCha8Rng::seed_from_u64(OsRng.next_u64());
+        web_router = web_router
+            .layer(Extension(Arc::new(Mutex::new(random))))
+    }
+   
+
+    // if !config.html_path.is_empty() && !config.html_url.is_empty() {
+    //     MAIN_URL.set(config.server.html_url.to_owned()).unwrap_or_default();
+    //     println!("SpaRoutert local path {} to {}",&config.server.html_path,&config.server.html_url);
+    //     web_router = web_router.merge(
+    //     )
+    //     .fallback(fallback);
+    // }
+
+    if config.verbose > 2 { dbg!("{:?}",&origins); }
+    if config.allow_origin.len() > 0 {
+         web_router = web_router.layer(CorsLayer::new()
+            .allow_origin(origins)
+            .allow_methods(vec![Method::GET, Method::POST])
+            .allow_headers(tower_http::cors::Any)
+        );
+    }
+    let addr = get_socket_addr(&config.bind,config.port);
+    tracing::debug!("listening on {}", addr);
+    println!("listening on {}", addr);
+    if config.protocol.as_str() == "http" {
+    // let app_with_middleware = middleware.layer(app);
+    // run https server
+        //let addr = SocketAddr::from(([127, 0, 0, 1], ports.http));
+        //tracing::debug!("listening on {}", addr);
+        let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+        axum::serve(listener, web_router.layer(TraceLayer::new_for_http()))
+          .await
+          .unwrap();
+    } else {
+        // configure certificate and private key used by https
+        // let tls_config = RustlsConfig::from_pem_file(
+        //     PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+        //         .join("self_signed_certs")
+        //         .join("cert.pem"),
+        //     PathBuf::from(env!("CARGO_MANIFEST_DIR"))
+        //         .join("self_signed_certs")
+        //         .join("key.pem"),
+        // )
+        let tls_config = RustlsConfig::from_pem_file(
+            PathBuf::from(&config.cert_file),
+            PathBuf::from(&config.key_file)
+        )
+        .await
+        .unwrap_or_else(|e|{
+            eprintln!("Error TLS config: {}",e);
+            std::process::exit(2)
+        });
+        //let addr = SocketAddr::from(([127, 0, 0, 1], ports.https));
+        //tracing::debug!("listening on {}", addr);
+        //let app_with_middleware = middleware.layer(app);
+        // apply the layer around the whole `Router`middleware.layer(app);
+        axum_server::bind_rustls(addr, tls_config)
+          .serve(web_router.into_make_service())
+          .await
+          .unwrap();
+    }
+/*
+    // let port = 3002;
+
+    // tokio::join!(
+    //     serve(using_serve_dir(), 3001),
+    //     serve(using_serve_dir_with_assets_fallback(), 3002),
+    //     serve(using_serve_dir_only_from_root_via_fallback(), 3003),
+    //     serve(using_serve_dir_with_handler_as_service(), 3004),
+    //     serve(two_serve_dirs(), 3005),
+    //     serve(calling_serve_dir_from_a_handler(), 3006),
+    // );
+
+    //let addr = SocketAddr::from(([127, 0, 0, 1], port));
+    let addr = SocketAddr::from(([192,168,1,4], port));
+    let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+    tracing::debug!("listening on {}", listener.local_addr().unwrap());
+
+        // let _ = axum::Server::bind(&addr)
+        //     .serve(
+        //         // router.layer(TraceLayer::new_for_http())
+        //         //router.into_make_service_with_connect_info::<SocketAddr>()
+        //         router.into_make_service()
+        //     )
+        //     .await
+        //     .expect("server failed");
+ 
+    // axum_server::bind(addr)
+    //     .serve(router.into_make_service())
+    //     .await
+    //     .unwrap();
+     axum::serve(listener, router.layer(TraceLayer::new_for_http()))
+         .await
+        .unwrap();
+    // let _ = axum::Server::bind(&addr)
+    //     .serve(
+    //             app.layer(TraceLayer::new_for_http()).into_make_service()
+    //            //    web_router.into_make_service_with_connect_info::<SocketAddr>()
+    //             // web_router.into_make_service()
+    //     )
+    //     .await
+    //     .unwrap();
+*/
+}
+
+async fn redirect_http_to_https(ports: Ports) {
+    fn make_https(host: String, uri: Uri, ports: Ports) -> Result<Uri, BoxError> {
+        let mut parts = uri.into_parts();
+
+        parts.scheme = Some(axum::http::uri::Scheme::HTTPS);
+
+        if parts.path_and_query.is_none() {
+            parts.path_and_query = Some("/".parse().unwrap());
+        }
+
+        let https_host = host.replace(&ports.http.to_string(), &ports.https.to_string());
+        parts.authority = Some(https_host.parse()?);
+
+        Ok(Uri::from_parts(parts)?)
+    }
+
+    let redirect = move |Host(host): Host, uri: Uri| async move {
+        match make_https(host, uri, ports) {
+            Ok(uri) => Ok(Redirect::permanent(&uri.to_string())),
+            Err(error) => {
+                tracing::warn!(%error, "failed to convert URI to HTTPS");
+                Err(StatusCode::BAD_REQUEST)
+            }
+        }
+    };
+
+    let addr = SocketAddr::from(([127, 0, 0, 1], ports.http));
+    let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+    tracing::debug!("listening on {}", listener.local_addr().unwrap());
+    axum::serve(listener, redirect.into_make_service())
+        .await
+        .unwrap();
+}
+
+/*
+fn using_serve_dir() -> Router {
+    // serve the file in the "assets" directory under `/assets`
+    Router::new().nest_service("/assets", ServeDir::new("assets"))
+}
+
+fn using_serve_dir_with_assets_fallback() -> Router {
+    // `ServeDir` allows setting a fallback if an asset is not found
+    // so with this `GET /assets/doesnt-exist.jpg` will return `index.html`
+    // rather than a 404
+    let serve_dir = ServeDir::new("assets").not_found_service(ServeFile::new("assets/index.html"));
+
+    Router::new()
+        .route("/foo", get(|| async { "Hi from /foo" }))
+        .nest_service("/assets", serve_dir.clone())
+        .fallback_service(serve_dir)
+}
+
+fn using_serve_dir_only_from_root_via_fallback() -> Router {
+    // you can also serve the assets directly from the root (not nested under `/assets`)
+    // by only setting a `ServeDir` as the fallback
+    let serve_dir = ServeDir::new("assets").not_found_service(ServeFile::new("assets/index.html"));
+
+    Router::new()
+        .route("/foo", get(|| async { "Hi from /foo" }))
+        .fallback_service(serve_dir)
+}
+
+fn using_serve_dir_with_handler_as_service() -> Router {
+    async fn handle_404() -> (StatusCode, &'static str) {
+        (StatusCode::NOT_FOUND, "Not found")
+    }
+
+    // you can convert handler function to service
+    let service = handle_404.into_service();
+
+    let serve_dir = ServeDir::new("assets").not_found_service(service);
+
+    Router::new()
+        .route("/foo", get(|| async { "Hi from /foo" }))
+        .fallback_service(serve_dir)
+}
+
+fn two_serve_dirs() -> Router {
+    // you can also have two `ServeDir`s nested at different paths
+    let serve_dir_from_assets = ServeDir::new("assets");
+    let serve_dir_from_dist = ServeDir::new("dist");
+
+    Router::new()
+        .nest_service("/assets", serve_dir_from_assets)
+        .nest_service("/dist", serve_dir_from_dist)
+}
+
+#[allow(clippy::let_and_return)]
+fn calling_serve_dir_from_a_handler() -> Router {
+    // via `tower::Service::call`, or more conveniently `tower::ServiceExt::oneshot` you can
+    // call `ServeDir` yourself from a handler
+    Router::new().nest_service(
+        "/foo",
+        get(|request: Request<_>| async {
+            let service = ServeDir::new("assets");
+            let result = service.oneshot(request).await;
+            result
+        }),
+    )
+}
+
+async fn serve(app: Router, port: u16) {
+    let addr = SocketAddr::from(([127, 0, 0, 1], port));
+    let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+    tracing::debug!("listening on {}", listener.local_addr().unwrap());
+    axum::serve(listener, app.layer(TraceLayer::new_for_http()))
+        .await
+        .unwrap();
+    // let _ = axum::Server::bind(&addr)
+    //     .serve(
+    //             app.layer(TraceLayer::new_for_http()).into_make_service()
+    //            //    web_router.into_make_service_with_connect_info::<SocketAddr>()
+    //             // web_router.into_make_service()
+    //     )
+    //     .await
+    //     .unwrap();
+}
+*/
+
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/tera_tpls.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/tera_tpls.rs.html new file mode 100644 index 0000000..40ade8d --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/tera_tpls.rs.html @@ -0,0 +1,77 @@ +tera_tpls.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+
use std::collections::HashMap;
+use tera::{Tera, try_get_value};
+use serde_json::value::{to_value, Value};
+
+pub fn do_nothing_filter(value: &Value, _: &HashMap<String, Value>) -> tera::Result<Value> {
+    let s = try_get_value!("do_nothing_filter", "value", String, value);
+    Ok(to_value(&s).unwrap())
+}
+
+pub fn init_tera(path: &str) -> Tera {
+    let tpl_path = format!("{}/**/*",&path);
+    let mut tera = match Tera::new(&tpl_path) {
+        Ok(t) => { 
+            println!("Templates loaded from: {}",&tpl_path);
+            log::info!("Templates loaded from: {}",&tpl_path);
+            t
+        },
+        Err(e) => {
+            println!("Tempates from {} parsing error(s): {}",&tpl_path, e);
+            ::std::process::exit(1);
+        }
+    };
+    tera.autoescape_on(vec![]);
+    tera.register_filter("do_nothing", do_nothing_filter);
+    tera
+}
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/src/docserver/tools.rs.html b/resources/sitehome_model/srcdocserver/src/docserver/tools.rs.html new file mode 100644 index 0000000..46fb9e6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/src/docserver/tools.rs.html @@ -0,0 +1,142 @@ +tools.rs - source
+ + + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+
use std::net::{IpAddr, Ipv4Addr, SocketAddr, ToSocketAddrs};
+use chrono::{DateTime,Utc,NaiveDateTime};
+//use std::time::{UNIX_EPOCH, Duration};
+
+pub fn get_socket_addr(bind: &str, port: u16) -> SocketAddr {
+  let url = format!("{}:{}",&bind,&port);
+  match url.to_socket_addrs() {
+    Ok(addrs_op) => if let Some(addr) = addrs_op.to_owned().next() {
+         addr 
+       } else {
+         SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port.to_owned())
+       }
+    Err(e) => { 
+       eprintln!("Evironment load error: {} {}", e, url);
+       SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port.to_owned())
+    }
+  }
+}
+pub fn generate_uuid(alphabet: String) -> String {
+    if alphabet.is_empty() {
+        return String::from("");
+    }
+    let mut code = String::new();
+    for _ in 0..32 {
+        // 16 is the length of the above Hex alphabet
+        let number = rand::random::<f32>() * (16 as f32);
+        let number = number.round() as usize;
+        if let Some(character) = alphabet.chars().nth(number) {
+            code.push(character)
+        }
+    }
+    code.insert(20, '-');
+    code.insert(16, '-');
+    code.insert(12, '-');
+    code.insert(8, '-');
+
+    code
+}
+#[allow(dead_code)]
+pub fn path_timestamp(filepath: &str) -> u32 {
+    let arr_path = filepath.split("-").collect::<Vec<&str>>();
+    if let Some(timestamp)  = arr_path.last() {
+        timestamp.split(".").collect::<Vec<&str>>()[0].parse().unwrap_or_default()
+    } else { 
+        0
+    }
+}
+
+pub fn str_date_from_timestamp(timestamp: &str) -> String {
+  if timestamp.is_empty() { return String::from(""); }
+  let val: i64 = timestamp.parse().unwrap_or_default();
+  let dt = NaiveDateTime::from_timestamp_opt(val, 0).unwrap_or_default();
+  let datetime = DateTime::<Utc>::from_utc(dt, Utc);
+  //  let val = u64::try_from(timestamp.to_owned()).unwrap_or_default();
+  //  let str_timestamp = UNIX_EPOCH + Duration::from_millis(val);
+  //  let datetime = DateTime::<Utc>::from(str_timestamp);
+   datetime.format("%Y-%m-%d %H:%M:%S").to_string()
+}
+
+ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/COPYRIGHT-23e9bde6c69aea69.txt b/resources/sitehome_model/srcdocserver/static.files/COPYRIGHT-23e9bde6c69aea69.txt new file mode 100644 index 0000000..1447df7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/COPYRIGHT-23e9bde6c69aea69.txt @@ -0,0 +1,50 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/resources/sitehome_model/srcdocserver/static.files/FiraSans-LICENSE-db4b642586e02d97.txt b/resources/sitehome_model/srcdocserver/static.files/FiraSans-LICENSE-db4b642586e02d97.txt new file mode 100644 index 0000000..d7e9c14 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/FiraSans-LICENSE-db4b642586e02d97.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/resources/sitehome_model/srcdocserver/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 b/resources/sitehome_model/srcdocserver/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 new file mode 100644 index 0000000..7a1e5fc Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 b/resources/sitehome_model/srcdocserver/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 new file mode 100644 index 0000000..e766e06 Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt b/resources/sitehome_model/srcdocserver/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt new file mode 100644 index 0000000..16fe87b --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/resources/sitehome_model/srcdocserver/static.files/LICENSE-MIT-65090b722b3f6c56.txt b/resources/sitehome_model/srcdocserver/static.files/LICENSE-MIT-65090b722b3f6c56.txt new file mode 100644 index 0000000..31aa793 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/LICENSE-MIT-65090b722b3f6c56.txt @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 new file mode 100644 index 0000000..1866ad4 Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt b/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt new file mode 100644 index 0000000..4b3edc2 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 new file mode 100644 index 0000000..462c34e Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt new file mode 100644 index 0000000..0d2941e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 new file mode 100644 index 0000000..10b558e Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 new file mode 100644 index 0000000..5ec64ee Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 new file mode 100644 index 0000000..181a07f Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 new file mode 100644 index 0000000..2ae08a7 Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md new file mode 100644 index 0000000..175fa4f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md @@ -0,0 +1,98 @@ + + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 new file mode 100644 index 0000000..0263fc3 Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 differ diff --git a/resources/sitehome_model/srcdocserver/static.files/ayu-614652228113ac93.css b/resources/sitehome_model/srcdocserver/static.files/ayu-614652228113ac93.css new file mode 100644 index 0000000..8fd09c9 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/ayu-614652228113ac93.css @@ -0,0 +1 @@ + :root{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--test-arrow-color:#788797;--test-arrow-background-color:rgba(57,175,215,0.09);--test-arrow-hover-color:#c5c5c5;--test-arrow-hover-background-color:rgba(57,175,215,0.368);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--source-sidebar-background-selected:#14191f;--source-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:rgb(91,59,1);--scrape-example-code-line-highlight-focus:rgb(124,75,15);--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);}h1,h2,h3,h4,h1 a,.sidebar h2 a,.sidebar h3 a,#source-sidebar>.title{color:#fff;}h4{border:none;}.docblock code{color:#ffb454;}.docblock a>code{color:#39AFD7 !important;}.code-header,.docblock pre>code,pre,pre>code,.item-info code,.rustdoc.source .example-wrap{color:#e6e1cf;}.sidebar .current,.sidebar a:hover,#source-sidebar div.files>a:hover,details.dir-entry summary:hover,#source-sidebar div.files>a:focus,details.dir-entry summary:focus,#source-sidebar div.files>a.selected{color:#ffb44c;}.sidebar-elems .location{color:#ff7733;}.src-line-numbers .line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}.search-results a:hover,.search-results a:focus{color:#fff !important;background-color:#3c3c3c;}.search-results a{color:#0096cf;}.search-results a div.desc{color:#c5c5c5;}.result-name .primitive>i,.result-name .keyword>i{color:#788797;}#search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}#search-tabs>button:not(.selected){border:none;background-color:transparent !important;}#search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#settings-menu>a img{filter:invert(100);} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/clipboard-7571035ce49a181d.svg b/resources/sitehome_model/srcdocserver/static.files/clipboard-7571035ce49a181d.svg new file mode 100644 index 0000000..8adbd99 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/clipboard-7571035ce49a181d.svg @@ -0,0 +1 @@ + diff --git a/resources/sitehome_model/srcdocserver/static.files/dark-1097f8e92a01e3cf.css b/resources/sitehome_model/srcdocserver/static.files/dark-1097f8e92a01e3cf.css new file mode 100644 index 0000000..1e5e7d1 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/dark-1097f8e92a01e3cf.css @@ -0,0 +1 @@ +:root{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--source-sidebar-background-selected:#333;--source-sidebar-background-hover:#444;--table-alt-row-background-color:#2A2A2A;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:rgb(91,59,1);--scrape-example-code-line-highlight-focus:rgb(124,75,15);--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/favicon-16x16-8b506e7a72182f1c.png b/resources/sitehome_model/srcdocserver/static.files/favicon-16x16-8b506e7a72182f1c.png new file mode 100644 index 0000000..ea4b45c Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/favicon-16x16-8b506e7a72182f1c.png differ diff --git a/resources/sitehome_model/srcdocserver/static.files/favicon-2c020d218678b618.svg b/resources/sitehome_model/srcdocserver/static.files/favicon-2c020d218678b618.svg new file mode 100644 index 0000000..8b34b51 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/favicon-2c020d218678b618.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/resources/sitehome_model/srcdocserver/static.files/favicon-32x32-422f7d1d52889060.png b/resources/sitehome_model/srcdocserver/static.files/favicon-32x32-422f7d1d52889060.png new file mode 100644 index 0000000..69b8613 Binary files /dev/null and b/resources/sitehome_model/srcdocserver/static.files/favicon-32x32-422f7d1d52889060.png differ diff --git a/resources/sitehome_model/srcdocserver/static.files/light-0f8c037637f9eb3e.css b/resources/sitehome_model/srcdocserver/static.files/light-0f8c037637f9eb3e.css new file mode 100644 index 0000000..21c3a85 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/light-0f8c037637f9eb3e.css @@ -0,0 +1 @@ +:root{--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#F5F5F5;--sidebar-background-color-hover:#E0E0E0;--code-block-background-color:#F5F5F5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#ffffff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--source-sidebar-background-selected:#fff;--source-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#F5F5F5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/main-f61008743c98d196.js b/resources/sitehome_model/srcdocserver/static.files/main-f61008743c98d196.js new file mode 100644 index 0000000..18fb938 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/main-f61008743c98d196.js @@ -0,0 +1,7 @@ +"use strict";function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden")}function showMain(){removeClass(document.getElementById(MAIN_ID),"hidden")}function elemIsInParent(elem,parent){while(elem&&elem!==document.body){if(elem===parent){return true}elem=elem.parentElement}return false}function blurHandler(event,parentElem,hideCallback){if(!elemIsInParent(document.activeElement,parentElem)&&!elemIsInParent(event.relatedTarget,parentElem)){hideCallback()}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileLocationTitle=document.querySelector(".mobile-topbar h2");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileLocationTitle&&locationTitle){mobileLocationTitle.innerHTML=locationTitle.innerHTML}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape"}return String.fromCharCode(c)}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID)}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling)}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID))}return el}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden")}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden")}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild)}if(elemToDisplay===null){addClass(el,"hidden");showMain();return}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden")}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function loadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="stylesheet";document.getElementsByTagName("head")[0].appendChild(link)}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link)}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url){const script=document.createElement("script");script.src=url;document.head.append(script)}getSettingsButton().onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadCss(getVar("static-root-path")+getVar("settings-css"));loadScript(getVar("static-root-path")+getVar("settings-js"));preLoadCss(getVar("static-root-path")+getVar("theme-light-css"));preLoadCss(getVar("static-root-path")+getVar("theme-dark-css"));preLoadCss(getVar("static-root-path")+getVar("theme-ayu-css"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css")}}},0)};window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el)}return el},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},isDisplayed:()=>searchState.outputElement().parentElement.id===ALTERNATIVE_DISPLAY_ID,focus:()=>{searchState.input.focus()},defocus:()=>{searchState.input.blur()},showResults:search=>{if(search===null||typeof search==="undefined"){search=searchState.outputElement()}switchDisplayedElement(search);searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:()=>{switchDisplayedElement(null);document.title=searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},setup:()=>{const search_input=searchState.input;if(!searchState.input){return}let searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"));loadScript(resourcePath("search-index",".js"))}}search_input.addEventListener("focus",()=>{search_input.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});if(search_input.value!==""){loadSearch()}const params=searchState.getQueryStringParams();if(params.search!==undefined){searchState.setLoadingSearch();loadSearch()}},setLoadingSearch:()=>{const search=searchState.outputElement();search.innerHTML="

"+searchState.loadingText+"

";searchState.showResults(search)},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash)}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId)}}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function handleEscape(ev){searchState.clearInputTimeout();switchDisplayedElement(null);if(browserSupportsHistoryApi()){history.replaceState(null,window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}ev.preventDefault();searchState.defocus();window.hideAllModals(true)}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":ev.preventDefault();searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs();break;case"?":showHelp();break;default:break}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return}const sidebar=document.getElementsByClassName("sidebar-elems")[0];function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return}const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=name+"/index.html"}else{path=shortty+"."+name+".html"}const current_page=document.location.href.split("/").pop();const link=document.createElement("a");link.href=path;if(path===current_page){link.className="current"}link.textContent=name;const li=document.createElement("li");li.appendChild(link);ul.appendChild(li)}sidebar.appendChild(h3);sidebar.appendChild(ul)}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("union","unions","Unions");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Definitions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("traitalias","trait-aliases","Trait Aliases")}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return}aliases.split(",").forEach(alias=>{inlined_types.add(alias)})})}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=script?script.getAttribute("data-ignore-extern-crates"):"";for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.indexOf(lib)!==-1){continue}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop}inlined_types.add(struct_type)}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}function addSidebarCrates(){if(!window.ALL_CRATES){return}const sidebarElems=document.getElementsByClassName("sidebar-elems")[0];if(!sidebarElems){return}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";if(window.rootPath!=="./"&&crate===window.currentCrate){link.className="current"}link.textContent=crate;const li=document.createElement("li");li.appendChild(link);ul.appendChild(li)}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul)}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true}});innerToggle.title="collapse all docs";innerToggle.children[0].innerText="\u2212"}function collapseAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(e.parentNode.id!=="implementations-list"||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false}});innerToggle.title="expand all docs";innerToggle.children[0].innerText="+"}function toggleAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return}if(hasClass(innerToggle,"will-expand")){expandAllDocs()}else{collapseAllDocs()}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open})}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false)}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false}})}());window.rustdoc_add_line_numbers_to_examples=()=>{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");if(line_numbers.length>0){return}const count=x.textContent.split("\n").length;const elems=[];for(let i=0;i{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");for(const node of line_numbers){parent.removeChild(node)}})};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples()}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown")}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown")}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar)}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar()})});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(e.target.tagName!=="SUMMARY"&&e.target.tagName!=="A"){e.preventDefault()}})});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText)}else{throw new Error("showTooltip() called with notable without any notable traits!")}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){return}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
"}else if(e.getAttribute("title")!==undefined){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(e.getAttribute("title")));wrapper.appendChild(titleContent)}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";const body=document.getElementsByTagName("body")[0];body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px"}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px")}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;wrapper.onpointerleave=function(ev){if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&!elemIsInParent(event.relatedTarget,e)){hideTooltip(true)}}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!elemIsInParent(document.activeElement,window.CURRENT_TOOLTIP_ELEMENT)&&!elemIsInParent(event.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT)&&!elemIsInParent(document.activeElement,window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE)&&!elemIsInParent(event.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE)){setTimeout(()=>hideTooltip(false),0)}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus()}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false}const body=document.getElementsByTagName("body")[0];body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=function(){this.TOOLTIP_FORCE_VISIBLE=this.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!this.TOOLTIP_FORCE_VISIBLE){hideTooltip(true)}else{showTooltip(this);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler}return false};e.onpointerenter=function(ev){if(ev.pointerType!=="mouse"){return}showTooltip(this)};e.onpointerleave=function(ev){if(ev.pointerType!=="mouse"){return}if(!this.TOOLTIP_FORCE_VISIBLE&&!elemIsInParent(ev.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT)){hideTooltip(true)}}});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar()}else{hideSidebar()}})}function helpBlurHandler(event){blurHandler(event,getHelpButton(),window.hidePopoverMenus)}function buildHelpMenu(){const book_info=document.createElement("span");book_info.className="top";book_info.innerHTML="You can find more information in \ + the rustdoc book.";const shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover"}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block"}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler}return container}window.hideAllModals=function(switchFocus){hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus)};window.hidePopoverMenus=function(){onEachLazy(document.querySelectorAll(".search-form .popover"),elem=>{elem.style.display="none"})};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu()}return menu}function showHelp(){getHelpButton().querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display=""}}if(isHelpPage){showHelp();document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault()})}else{document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp()}else{window.hidePopoverMenus()}})}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){let reset_button_timeout=null;const but=document.getElementById("copy-path");if(!but){return}but.onclick=()=>{const parent=but.parentElement;const path=[];onEach(parent.childNodes,child=>{if(child.tagName==="A"){path.push(child.textContent)}});const el=document.createElement("textarea");el.value=path.join("::");el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);but.children[0].style.display="none";let tmp;if(but.childNodes.length<2){tmp=document.createTextNode("✓");but.appendChild(tmp)}else{onEachLazy(but.childNodes,e=>{if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent="✓"}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent="";reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/normalize-76eba96aa4d2e634.css b/resources/sitehome_model/srcdocserver/static.files/normalize-76eba96aa4d2e634.css new file mode 100644 index 0000000..469959f --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/normalize-76eba96aa4d2e634.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/noscript-13285aec31fa243e.css b/resources/sitehome_model/srcdocserver/static.files/noscript-13285aec31fa243e.css new file mode 100644 index 0000000..c32e0cb --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/noscript-13285aec31fa243e.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path{display:none;}nav.sub{display:none;}.source .sidebar{display:none;}.notable-traits{display:none;} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/rust-logo-151179464ae7ed46.svg b/resources/sitehome_model/srcdocserver/static.files/rust-logo-151179464ae7ed46.svg new file mode 100644 index 0000000..62424d8 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/rust-logo-151179464ae7ed46.svg @@ -0,0 +1,61 @@ + + + diff --git a/resources/sitehome_model/srcdocserver/static.files/rustdoc-ba5701c5741a7b69.css b/resources/sitehome_model/srcdocserver/static.files/rustdoc-ba5701c5741a7b69.css new file mode 100644 index 0000000..55584a7 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/rustdoc-ba5701c5741a7b69.css @@ -0,0 +1,8 @@ + :root{--nav-sub-mobile-padding:8px;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-018c141bf0843ffd.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-8f9a781e4970d388.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-46f98efaafac5295.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;flex-grow:1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{display:flex;flex-wrap:wrap;padding-bottom:6px;margin-bottom:15px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-name>a,.out-of-band,span.since,a.srclink,#help-button>a,summary.hideme,.scraped-example-list,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.stab,.result-name .primitive>i,.result-name .keyword>i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p{margin:0 0 .75em 0;}p:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.source main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.source .content pre{padding:20px;}.rustdoc.source .example-wrap pre.src-line-numbers{padding:20px 0 20px 4px;}img{max-width:100%;}.sub-logo-container,.logo-container{line-height:0;display:block;}.sub-logo-container{margin-right:32px;}.sub-logo-container>img{height:60px;width:60px;object-fit:contain;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 200px;overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;}.rustdoc.source .sidebar{flex-basis:50px;border-right:1px solid;overflow-x:hidden;overflow-y:hidden;z-index:1;}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar-toggle,#source-sidebar{background-color:var(--sidebar-background-color);}#src-sidebar-toggle>button:hover,#src-sidebar-toggle>button:focus{background-color:var(--sidebar-background-color-hover);}.source .sidebar>*:not(#src-sidebar-toggle){visibility:hidden;}.source-sidebar-expanded .source .sidebar{overflow-y:auto;flex-basis:300px;}.source-sidebar-expanded .source .sidebar>*:not(#src-sidebar-toggle){visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.sidebar .logo-container{margin-top:10px;margin-bottom:10px;text-align:center;}.version{overflow-wrap:break-word;}.logo-container>img{height:100px;width:100px;}ul.block,.block li{padding:0;margin:0;list-style:none;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-left:-0.25rem;}.sidebar h2{overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>h2{padding-left:24px;}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.rustdoc:not(.source) .example-wrap pre{overflow:auto hidden;}.rustdoc .example-wrap pre.example-line-numbers,.rustdoc .example-wrap pre.src-line-numbers{flex-grow:0;min-width:fit-content;overflow:initial;text-align:right;-webkit-user-select:none;user-select:none;padding:14px 8px;color:var(--src-line-numbers-span-color);}.rustdoc .example-wrap pre.src-line-numbers{padding:14px 0;}.src-line-numbers a,.src-line-numbers span{color:var(--src-line-numbers-span-color);padding:0 8px;}.src-line-numbers :target{background-color:transparent;border-right:none;padding:0 8px;}.src-line-numbers .line-highlighted{background-color:var(--src-line-number-highlighted-background-color);}.search-loading{text-align:center;}.docblock-short{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.docblock-short code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:24px;position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.out-of-band{flex-grow:0;font-size:1.125rem;}.docblock code,.docblock-short code,pre,.rustdoc.source .example-wrap{background-color:var(--code-block-background-color);}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}.method .where,.fn .where,.where.fmt-newline{display:block;white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:24px;}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 25px 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;}.source nav.sub{margin:0 0 15px 0;}.small-section-header{display:block;position:relative;}.small-section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-15px;padding-right:8px;}h2.small-section-header>.anchor{padding-right:6px;}.main-heading a:hover,.example-wrap .rust a:hover,.all-items a:hover,.docblock a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.docblock-short a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block a.current{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{display:table;padding:0;margin:0;}.item-table>li{display:table-row;}.item-table>li>div{display:table-cell;}.item-table>li>.item-name{padding-right:1.25rem;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}#crate-search-div{position:relative;min-width:5em;}#crate-search{min-width:115px;padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}@-moz-document url-prefix(){#crate-search{padding-left:0px;padding-right:19px;}}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;}.search-results>a{display:flex;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);gap:1em;}.search-results>a>div{flex:1;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name span.alias{color:var(--search-results-alias-color);}.search-results .result-name span.grey{color:var(--search-results-grey-color);}.popover{position:absolute;top:100%;right:0;z-index:2;margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}#help.popover{max-width:600px;--popover-arrow-offset:48px;}#help dt{float:left;clear:left;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side>div{width:50%;float:left;padding:0 20px 20px 17px;}.item-info .stab{min-height:36px;display:flex;padding:3px;margin-bottom:5px;}.item-name .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;align-items:center;white-space:pre-wrap;border-radius:3px;display:inline-flex;vertical-align:text-bottom;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji{font-size:1.25rem;margin-right:0.3rem;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.source .example-wrap pre.rust a{background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}a.test-arrow{visibility:hidden;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:1.375rem;top:5px;right:5px;z-index:1;color:var(--test-arrow-color);background-color:var(--test-arrow-background-color);}a.test-arrow:hover{color:var(--test-arrow-hover-color);background-color:var(--test-arrow-hover-background-color);}.example-wrap:hover .test-arrow{visibility:visible;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}#src-sidebar-toggle{position:sticky;top:0;left:0;font-size:1.25rem;border-bottom:1px solid;display:flex;height:40px;justify-content:stretch;align-items:stretch;z-index:10;}#source-sidebar{width:100%;overflow:auto;}#source-sidebar>.title{font-size:1.5rem;text-align:center;border-bottom:1px solid var(--border-color);margin-bottom:6px;}#source-sidebar div.files>a:hover,details.dir-entry summary:hover,#source-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--source-sidebar-background-hover);}#source-sidebar div.files>a.selected{background-color:var(--source-sidebar-background-selected);}#src-sidebar-toggle>button{font-size:inherit;font-weight:bold;background:none;color:inherit;text-align:center;border:none;outline:none;flex:1 1;-webkit-appearance:none;opacity:1;}#settings-menu,#help-button{margin-left:4px;display:flex;}#settings-menu>a,#help-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:2px;color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus{border-color:var(--settings-button-border-focus);}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:34px;margin-left:10px;padding:0;padding-left:2px;border:0;width:33px;}#copy-path>img{filter:var(--copy-path-img-filter);}#copy-path:hover>img{filter:var(--copy-path-img-hover-filter);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,') no-repeat top left;content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,') no-repeat top left;}details.toggle[open] >summary::after{content:"Collapse";}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}@media (max-width:700px){*[id]{scroll-margin-top:45px;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.main-heading{flex-direction:column;}.out-of-band{text-align:left;margin-left:initial;padding:initial;}.out-of-band .since::before{content:"Since ";}.sidebar .logo-container,.sidebar .location{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);width:200px;}.source main,.rustdoc.source .sidebar{top:0;padding:0;height:100vh;border:0;}.sidebar.shown,.source-sidebar-expanded .source .sidebar,.rustdoc:not(.source) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;}.mobile-topbar h2 a{display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.sidebar-menu-toggle{width:45px;font-size:32px;border:none;color:var(--main-color);}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#search-tabs .count{display:block;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#src-sidebar-toggle{position:fixed;left:1px;top:100px;width:30px;font-size:1.5rem;padding:0;z-index:10;border-top-right-radius:3px;border-bottom-right-radius:3px;border:1px solid;border-left:0;}.source-sidebar-expanded #src-sidebar-toggle{left:unset;top:unset;width:unset;border-top-right-radius:unset;border-bottom-right-radius:unset;position:sticky;border:0;border-bottom:1px solid;}#copy-path,#help-button{display:none;}.item-table,.item-row,.item-table>li,.item-table>li>div,.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table>li>div.desc{padding-left:2em;}.source-sidebar-expanded .source .sidebar{max-width:100vw;width:100vw;}details.toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>details.toggle:not(.top-doc)>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}.impl-items>.item-info{margin-left:34px;}.source nav.sub{margin:0;padding:var(--nav-sub-mobile-padding);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}}@media print{nav.sidebar,nav.sub,.out-of-band,a.srclink,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}.docblock{margin-left:0;}main{padding:10px;}}@media (max-width:464px){.docblock{margin-left:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}.sub-logo-container>img{height:35px;width:35px;margin-bottom:var(--nav-sub-mobile-padding);}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example{position:relative;}.scraped-example .code-wrapper{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;width:100%;}.scraped-example:not(.expanded) .code-wrapper{max-height:calc(1.5em * 5 + 10px);}.scraped-example:not(.expanded) .code-wrapper pre{overflow-y:hidden;padding-bottom:0;max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper,.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper pre{max-height:calc(1.5em * 10 + 10px);}.scraped-example .code-wrapper .next,.scraped-example .code-wrapper .prev,.scraped-example .code-wrapper .expand{color:var(--main-color);position:absolute;top:0.25em;z-index:1;padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.scraped-example .code-wrapper .prev{right:2.25em;}.scraped-example .code-wrapper .next{right:1.25em;}.scraped-example .code-wrapper .expand{right:0.25em;}.scraped-example:not(.expanded) .code-wrapper::before,.scraped-example:not(.expanded) .code-wrapper::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .code-wrapper::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .code-wrapper::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example .code-wrapper .example-wrap{width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded) .code-wrapper .example-wrap{overflow-x:hidden;}.scraped-example .example-wrap .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .example-wrap .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/scrape-examples-ef1e698c1d417c0c.js b/resources/sitehome_model/srcdocserver/static.files/scrape-examples-ef1e698c1d417c0c.js new file mode 100644 index 0000000..ba830e3 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/scrape-examples-ef1e698c1d417c0c.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelector(".src-line-numbers");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines.children[line].offsetTop}else{const wrapper=elt.querySelector(".code-wrapper");const halfHeight=wrapper.offsetHeight/2;const offsetTop=lines.children[loc[0]].offsetTop;const lastLine=lines.children[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight}lines.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset)}function updateScrapedExample(example,isHidden){const locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");if(locs.length>1){const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title};example.querySelector(".prev").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length})});example.querySelector(".next").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length})})}const expandButton=example.querySelector(".expand");if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");scrollToLoc(example,locs[0][0],isHidden)}else{addClass(example,"expanded")}})}scrollToLoc(example,locs[0][0],isHidden)}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>updateScrapedExample(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false})});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>updateScrapedExample(el,true))})},{once:true})})})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/search-e077946657036a58.js b/resources/sitehome_model/srcdocserver/static.files/search-e077946657036a58.js new file mode 100644 index 0000000..3b21179 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/search-e077946657036a58.js @@ -0,0 +1 @@ +"use strict";(function(){const itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias",];const TY_PRIMITIVE=itemTypes.indexOf("primitive");const TY_KEYWORD=itemTypes.indexOf("keyword");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";function hasOwnPropertyRustdoc(obj,property){return Object.prototype.hasOwnProperty.call(obj,property)}function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true}else{removeClass(elem,"selected")}iter+=1});iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true}else{removeClass(elem,"active")}iter+=1});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb}else if(nb!==0){printTab(0)}}const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1)}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1)}if(b.length===0){return minDist}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1)}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1)},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit)}function initSearch(rawSearchIndex){const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;let searchIndex;let currentResults;const ALIASES=new Map();function isWhitespace(c){return" \t\n\r".indexOf(c)!==-1}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1}function isEndCharacter(c){return",>-".indexOf(c)!==-1}function isStopCharacter(c){return isWhitespace(c)||isEndCharacter(c)}function isErrorCharacter(c){return"()".indexOf(c)!==-1}function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename]}return index}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"]}else if(query.literalSearch){throw["Cannot have more than one literal search element"]}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"]}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""]}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"]}else if(start===end){throw["Cannot have empty string element"]}parserState.pos+=1;query.literalSearch=true}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::"}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->"}function isIdentCharacter(c){return(c==="_"||(c>="0"&&c<="9")||(c>="a"&&c<="z")||(c>="A"&&c<="Z"))}function isSeparatorCharacter(c){return c===","||isWhitespaceCharacter(c)}function isWhitespaceCharacter(c){return c===" "||c==="\t"}function createQueryElement(query,parserState,name,generics,isInGenerics){if(name==="*"||(name.length===0&&generics.length===0)){return}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["You cannot have more than one element if you use quotes"]}const pathSegments=name.split("::");if(pathSegments.length>1){for(let i=0,len=pathSegments.length;i=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}if(start>=end&&generics.length===0){return}elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics))}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let start=parserState.pos;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;while(parserState.pos"){extra="<"}else if(endChar===""){extra="->"}else{extra=endChar}throw["Unexpected ",c," after ",extra]}if(!foundStopChar){if(endChar!==""){throw["Expected ",",",", "," "," or ",endChar,", found ",c,]}throw["Expected ",","," or "," ",", found ",c,]}const posBefore=parserState.pos;start=parserState.pos;getNextElem(query,parserState,elems,endChar===">");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ","<"]}if(posBefore===parserState.pos){parserState.pos+=1}foundStopChar=false}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ","<"]}parserState.pos+=1;parserState.typeFilter=oldTypeFilter}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery;for(let pos=start;pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}throw["Unexpected ",c]}else if(c===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"]}if(query.elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["You cannot use quotes on type filter"]}const typeFilterElem=query.elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;foundStopChar=true;continue}if(!foundStopChar){if(parserState.typeFilter!==null){throw["Expected ",",",", "," "," or ","->",", found ",c,]}throw["Expected ",",",", "," ",", ",":"," or ","->",", found ",c,]}const before=query.elems.length;start=parserState.pos;getNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1}foundStopChar=false}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter)"]}while(parserState.pos"]}break}else{parserState.pos+=1}}}function newParsedQuery(userQuery){return{original:userQuery,userQuery:userQuery.toLowerCase(),elems:[],returned:[],foundElems:0,literalSearch:false,error:null,}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates)}return getNakedUrl()+extra+window.location.hash}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&hasOwnPropertyRustdoc(rawSearchIndex,elem.value)){return elem.value}return null}function parseQuery(userQuery){function convertTypeFilterOnElem(elem){if(elem.typeFilter!==null){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant"}elem.typeFilter=itemTypeFromName(typeFilter)}else{elem.typeFilter=NO_TYPE_FILTER}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2)}}userQuery=userQuery.trim();const parserState={length:userQuery.length,pos:0,totalElems:0,genericsElems:0,typeFilter:null,userQuery:userQuery.toLowerCase(),};let query=newParsedQuery(userQuery);try{parseInput(query,parserState);for(const elem of query.elems){convertTypeFilterOnElem(elem)}for(const elem of query.returned){convertTypeFilterOnElem(elem)}}catch(err){query=newParsedQuery(userQuery);query.error=err;return query}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1}query.foundElems=query.elems.length+query.returned.length;return query}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,}}function execQuery(parsedQuery,searchWords,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();function transformResults(results){const duplicates=new Set();const out=[];for(const result of results){if(result.id>-1){const obj=searchIndex[result.id];obj.dist=result.dist;const res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}duplicates.add(obj.fullPath);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}function sortResults(results,isType,preferredCrate){if(results.size===0){return[]}const userQuery=parsedQuery.userQuery;const result_list=[];for(const result of results.values()){result.word=searchWords[result.id];result.item=searchIndex[result.id]||{};result_list.push(result)}result_list.sort((aaa,bbb)=>{let a,b;a=(aaa.word!==userQuery);b=(bbb.word!==userQuery);if(a!==b){return a-b}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.path_dist;b=bbb.path_dist;if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}a=(aaa.dist);b=(bbb.dist);if(a!==b){return a-b}a=aaa.item.deprecated;b=bbb.item.deprecated;if(a!==b){return a-b}a=(aaa.item.crate!==preferredCrate);b=(bbb.item.crate!==preferredCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});let nameSplit=null;if(parsedQuery.elems.length===1){const hasPath=typeof parsedQuery.elems[0].path==="undefined";nameSplit=hasPath?null:parsedQuery.elems[0].path}for(const result of result_list){if(result.dontValidate){continue}const name=result.item.name.toLowerCase(),path=result.item.path.toLowerCase(),parent=result.item.parent;if(!isType&&!validateResult(name,path,nameSplit,parent)){result.id=-1}}return transformResults(result_list)}function checkGenerics(row,elem,defaultDistance,maxEditDistance){if(row.generics.length===0){return elem.generics.length===0?defaultDistance:maxEditDistance+1}else if(row.generics.length>0&&row.generics[0].name===null){return checkGenerics(row.generics[0],elem,defaultDistance,maxEditDistance)}if(elem.generics.length>0&&row.generics.length>=elem.generics.length){const elems=new Map();for(const entry of row.generics){if(entry.name===""){if(checkGenerics(entry,elem,maxEditDistance+1,maxEditDistance)!==0){return maxEditDistance+1}continue}let currentEntryElems;if(elems.has(entry.name)){currentEntryElems=elems.get(entry.name)}else{currentEntryElems=[];elems.set(entry.name,currentEntryElems)}currentEntryElems.push(entry)}const handleGeneric=generic=>{if(!elems.has(generic.name)){return false}const matchElems=elems.get(generic.name);const matchIdx=matchElems.findIndex(tmp_elem=>{if(checkGenerics(tmp_elem,generic,0,maxEditDistance)!==0){return false}return typePassesFilter(generic.typeFilter,tmp_elem.ty)});if(matchIdx===-1){return false}matchElems.splice(matchIdx,1);if(matchElems.length===0){elems.delete(generic.name)}return true};for(const generic of elem.generics){if(generic.typeFilter!==-1&&!handleGeneric(generic)){return maxEditDistance+1}}for(const generic of elem.generics){if(generic.typeFilter===-1&&!handleGeneric(generic)){return maxEditDistance+1}}return 0}return maxEditDistance+1}function checkIfInGenerics(row,elem,maxEditDistance){let dist=maxEditDistance+1;for(const entry of row.generics){dist=Math.min(checkType(entry,elem,true,maxEditDistance),dist);if(dist===0){break}}return dist}function checkType(row,elem,literalSearch,maxEditDistance){if(row.name===null){if(row.generics.length>0){return checkIfInGenerics(row,elem,maxEditDistance)}return maxEditDistance+1}let dist;if(typePassesFilter(elem.typeFilter,row.ty)){dist=editDistance(row.name,elem.name,maxEditDistance)}else{dist=maxEditDistance+1}if(literalSearch){if(dist!==0){if(elem.generics.length===0){const checkGeneric=row.generics.length>0;if(checkGeneric&&row.generics.findIndex(tmp_elem=>tmp_elem.name===elem.name&&typePassesFilter(elem.typeFilter,tmp_elem.ty))!==-1){return 0}}return maxEditDistance+1}else if(elem.generics.length>0){return checkGenerics(row,elem,maxEditDistance+1,maxEditDistance)}return 0}else if(row.generics.length>0){if(elem.generics.length===0){if(dist===0){return 0}dist=Math.min(dist,checkIfInGenerics(row,elem,maxEditDistance));return dist}else if(dist>maxEditDistance){return checkIfInGenerics(row,elem,maxEditDistance)}else{const tmp_dist=checkGenerics(row,elem,dist,maxEditDistance);if(tmp_dist>maxEditDistance){return maxEditDistance+1}return(tmp_dist+dist)/2}}else if(elem.generics.length>0){return maxEditDistance+1}return dist}function findArg(row,elem,maxEditDistance,skipPositions){let dist=maxEditDistance+1;let position=-1;if(row&&row.type&&row.type.inputs&&row.type.inputs.length>0){let i=0;for(const input of row.type.inputs){if(skipPositions.indexOf(i)!==-1){i+=1;continue}const typeDist=checkType(input,elem,parsedQuery.literalSearch,maxEditDistance);if(typeDist===0){return{dist:0,position:i}}if(typeDist0){const ret=row.type.output;let i=0;for(const ret_ty of ret){if(skipPositions.indexOf(i)!==-1){i+=1;continue}const typeDist=checkType(ret_ty,elem,parsedQuery.literalSearch,maxEditDistance);if(typeDist===0){return{dist:0,position:i}}if(typeDistlength){return maxEditDistance+1}for(let i=0;ilength){break}let dist_total=0;let aborted=false;for(let x=0;xmaxEditDistance){aborted=true;break}dist_total+=dist}if(!aborted){ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}}return ret_dist}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,deprecated:item.deprecated,}}function handleAliases(ret,query,filterCrates,currentCrate){const lowerQuery=query.toLowerCase();const aliases=[];const crateAliases=[];if(filterCrates!==null){if(ALIASES.has(filterCrates)&&ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(createAliasFromItem(searchIndex[alias]))}}}else{for(const[crate,crateAliasesIndex]of ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(createAliasFromItem(searchIndex[alias]))}}}}const sortFunc=(aaa,bbb)=>{if(aaa.path{alias.alias=query;const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop()}};aliases.forEach(pushFunc);crateAliases.forEach(pushFunc)}function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){const inBounds=dist<=maxEditDistance||index!==-1;if(dist===0||(!parsedQuery.literalSearch&&inBounds)){if(results.has(fullId)){const result=results.get(fullId);if(result.dontValidate||result.dist<=dist){return}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,})}}function handleSingleArg(row,pos,elem,results_others,results_in_args,results_returned,maxEditDistance){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let dist,index=-1,path_dist=0;const fullId=row.id;const searchWord=searchWords[pos];const in_args=findArg(row,elem,maxEditDistance,[]);const returned=checkReturned(row,elem,maxEditDistance,[]);addIntoResults(results_in_args,fullId,pos,-1,in_args.dist,0,maxEditDistance);addIntoResults(results_returned,fullId,pos,-1,returned.dist,0,maxEditDistance);if(!typePassesFilter(elem.typeFilter,row.ty)){return}const row_index=row.normalizedName.indexOf(elem.pathLast);const word_index=searchWord.indexOf(elem.pathLast);if(row_index===-1){index=word_index}else if(word_index===-1){index=row_index}else if(word_index1){path_dist=checkPath(elem.pathWithoutLast,row,maxEditDistance);if(path_dist>maxEditDistance){return}}if(parsedQuery.literalSearch){if(searchWord===elem.name){addIntoResults(results_others,fullId,pos,index,0,path_dist)}return}dist=editDistance(searchWord,elem.pathLast,maxEditDistance);if(index===-1&&dist+path_dist>maxEditDistance){return}addIntoResults(results_others,fullId,pos,index,dist,path_dist,maxEditDistance)}function handleArgs(row,pos,results,maxEditDistance){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let totalDist=0;let nbDist=0;function checkArgs(elems,callback){const skipPositions=[];for(const elem of elems){const{dist,position}=callback(row,elem,maxEditDistance,skipPositions);if(dist<=1){nbDist+=1;totalDist+=dist;skipPositions.push(position)}else{return false}}return true}if(!checkArgs(parsedQuery.elems,findArg)){return}if(!checkArgs(parsedQuery.returned,checkReturned)){return}if(nbDist===0){return}const dist=Math.round(totalDist/nbDist);addIntoResults(results,row.id,pos,0,dist,0,maxEditDistance)}function innerRunQuery(){let elem,i,nSearchWords,in_returned,row;let queryLen=0;for(const elem of parsedQuery.elems){queryLen+=elem.name.length}for(const elem of parsedQuery.returned){queryLen+=elem.name.length}const maxEditDistance=Math.floor(queryLen/3);if(parsedQuery.foundElems===1){if(parsedQuery.elems.length===1){elem=parsedQuery.elems[0];for(i=0,nSearchWords=searchWords.length;i0){for(i=0,nSearchWords=searchWords.length;i-1||path.indexOf(key)>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(key)>-1)||editDistance(name,key,maxEditDistance)<=maxEditDistance)){return false}}return true}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus()}}function buildHrefAndPath(item){let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.path;if(type==="mod"){displayPath=path+"::";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="import"){displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/index.html#reexport."+name}else if(type==="primitive"||type==="keyword"){displayPath="";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=ROOT_PATH+name+"/index.html"}else if(item.parent!==undefined){const myparent=item.parent;let anchor="#"+type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=ROOT_PATH+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){let extraClass="";if(display===true){extraClass=" active"}const output=document.createElement("div");let length=0;if(array.length>0){output.className="search-results "+extraClass;array.forEach(item=>{const name=item.name;const type=itemTypes[item.ty];length+=1;let extra="";if(type==="primitive"){extra=" (primitive type)"}else if(type==="keyword"){extra=" (keyword)"}const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("div");resultName.className="result-name";if(item.is_alias){const alias=document.createElement("span");alias.className="alias";const bold=document.createElement("b");bold.innerText=item.alias;alias.appendChild(bold);alias.insertAdjacentHTML("beforeend"," - see ");resultName.appendChild(alias)}resultName.insertAdjacentHTML("beforeend",item.displayPath+""+name+extra+"");link.appendChild(resultName);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);link.appendChild(description);output.appendChild(link)})}else if(query.error===null){output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(searchState.currentTab===tabNb){return""}return""}function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}if(results.query===undefined){results.query=parseQuery(searchState.input.value)}currentResults=results.query.userQuery;const ret_others=addTab(results.others,results.query,true);const ret_in_args=addTab(results.in_args,results.query,false);const ret_returned=addTab(results.returned,results.query,false);let currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}let crates="";const crates_list=Object.keys(rawSearchIndex);if(crates_list.length>1){crates=" in 
"}let output=`

Results${crates}

`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value}`}else{error[index]=value}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",ret_others[1])+"
";currentTab=0}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,ret_others[1])+"
";currentTab=0}const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1}printTab(currentTab)}function search(e,forced){if(e){e.preventDefault()}const query=parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch()}return}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"]}searchState.title="Results for "+query.original+" - Rust";if(browserSupportsHistoryApi()){const newURL=buildUrl(query.original,filterCrates);if(!history.state&&!params.search){history.pushState(null,"",newURL)}else{history.replaceState(null,"",newURL)}}showResults(execQuery(query,searchWords,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function buildItemSearchTypeAll(types,lowercasePaths){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;return types.map(type=>{let pathIndex,generics;if(typeof type==="number"){pathIndex=type;generics=[]}else{pathIndex=type[PATH_INDEX_DATA];generics=buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths)}return{name:pathIndex===0?null:lowercasePaths[pathIndex-1].name,ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:generics,}})}function buildFunctionSearchType(functionSearchType,lowercasePaths){const INPUTS_DATA=0;const OUTPUT_DATA=1;if(functionSearchType===0){return null}let inputs,output;if(typeof functionSearchType[INPUTS_DATA]==="number"){const pathIndex=functionSearchType[INPUTS_DATA];inputs=[{name:pathIndex===0?null:lowercasePaths[pathIndex-1].name,ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:[],}]}else{inputs=buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],lowercasePaths)}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){const pathIndex=functionSearchType[OUTPUT_DATA];output=[{name:pathIndex===0?null:lowercasePaths[pathIndex-1].name,ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:[],}]}else{output=buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],lowercasePaths)}}else{output=[]}return{inputs,output,}}function buildIndex(rawSearchIndex){searchIndex=[];const searchWords=[];const charA="A".charCodeAt(0);let currentIndex=0;let id=0;for(const crate in rawSearchIndex){if(!hasOwnPropertyRustdoc(rawSearchIndex,crate)){continue}let crateSize=0;const crateCorpus=rawSearchIndex[crate];searchWords.push(crate);const crateRow={crate:crate,ty:1,name:crate,path:"",desc:crateCorpus.doc,parent:undefined,type:null,id:id,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),deprecated:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemDescs=crateCorpus.d;const itemParentIdxs=crateCorpus.i;const itemFunctionSearchTypes=crateCorpus.f;const deprecatedItems=new Set(crateCorpus.c);const paths=crateCorpus.p;const aliases=crateCorpus.a;const lowercasePaths=[];let len=paths.length;for(let i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:buildFunctionSearchType(itemFunctionSearchTypes[i],lowercasePaths),id:id,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),deprecated:deprecatedItems.has(i),};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){const currentCrateAliases=new Map();ALIASES.set(crate,currentCrateAliases);for(const alias_name in aliases){if(!hasOwnPropertyRustdoc(aliases,alias_name)){continue}let currentNameAliases;if(currentCrateAliases.has(alias_name)){currentNameAliases=currentCrateAliases.get(alias_name)}else{currentNameAliases=[];currentCrateAliases.set(alias_name,currentNameAliases)}for(const local_alias of aliases[alias_name]){currentNameAliases.push(local_alias+currentIndex)}}}currentIndex+=crateSize}return searchWords}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search()}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()))}document.title=searchState.title}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||""}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){if(browserSupportsHistoryApi()){history.replaceState(null,window.currentCrate+" - Rust",getNakedUrl()+window.location.hash)}searchState.hideResults()}else{searchState.timeout=setTimeout(search,500)}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return}searchState.clearInputTimeout();setTimeout(search,0)};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus()}else{searchState.focus()}e.preventDefault()}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus()}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault()}});searchState.input.addEventListener("focus",()=>{putBackSearch()});searchState.input.addEventListener("blur",()=>{searchState.input.placeholder=searchState.input.origPlaceholder});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){if(ev.target.value==="all crates"){const params=searchState.getQueryStringParams();const query=searchState.input.value.trim();if(!history.state&&!params.search){history.pushState(null,"",buildUrl(query,null))}else{history.replaceState(null,"",buildUrl(query,null))}}currentResults=null;search(undefined,true)}const searchWords=buildIndex(rawSearchIndex);if(typeof window!=="undefined"){registerSearchEvents();if(window.searchState.getQueryStringParams().search){search()}}if(typeof exports!=="undefined"){exports.initSearch=initSearch;exports.execQuery=execQuery;exports.parseQuery=parseQuery}return searchWords}if(typeof window!=="undefined"){window.initSearch=initSearch;if(window.searchIndex!==undefined){initSearch(window.searchIndex)}}else{initSearch({})}})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/settings-298e1ea74db45b39.js b/resources/sitehome_model/srcdocserver/static.files/settings-298e1ea74db45b39.js new file mode 100644 index 0000000..a426aef --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/settings-298e1ea74db45b39.js @@ -0,0 +1,17 @@ +"use strict";(function(){const isSettingsPage=window.location.pathname.endsWith("/settings.html");function changeSetting(settingName,value){if(settingName==="theme"){const useSystem=value==="system preference"?"true":"false";updateLocalStorage("use-system-theme",useSystem)}updateLocalStorage(settingName,value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":updateTheme();updateLightAndDark();break;case"line-numbers":if(value===true){window.rustdoc_add_line_numbers_to_examples()}else{window.rustdoc_remove_line_numbers_from_examples()}break}}function handleKey(ev){if(ev.ctrlKey||ev.altKey||ev.metaKey){return}switch(getVirtualKey(ev)){case"Enter":case"Return":case"Space":ev.target.checked=!ev.target.checked;ev.preventDefault();break}}function showLightAndDark(){removeClass(document.getElementById("preferred-light-theme"),"hidden");removeClass(document.getElementById("preferred-dark-theme"),"hidden")}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme"),"hidden");addClass(document.getElementById("preferred-dark-theme"),"hidden")}function updateLightAndDark(){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||(useSystem===null&&getSettingValue("theme")===null)){showLightAndDark()}else{hideLightAndDark()}}function setEvents(settingsElement){updateLightAndDark();onEachLazy(settingsElement.querySelectorAll("input[type=\"checkbox\"]"),toggle=>{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=function(){changeSetting(this.id,this.checked)};toggle.onkeyup=handleKey;toggle.onkeyrelease=handleKey});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference"}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value}elem.addEventListener("change",ev=>{changeSetting(ev.target.name,ev.target.value)})})}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `});output+=`\ +
+
`}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`}}return output}function buildSettingsPage(){const theme_names=getVar("themes").split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover"}el.innerHTML=innerHTML;if(isSettingsPage){document.getElementById(MAIN_ID).appendChild(el)}else{el.setAttribute("tabindex","-1");getSettingsButton().appendChild(el)}return el}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display=""}function settingsBlurHandler(event){blurHandler(event,getSettingsButton(),window.hidePopoverMenus)}if(isSettingsPage){getSettingsButton().onclick=function(event){event.preventDefault()}}else{const settingsButton=getSettingsButton();const settingsMenu=document.getElementById("settings");settingsButton.onclick=function(event){if(elemIsInParent(event.target,settingsMenu)){return}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals();if(shouldDisplaySettings){displaySettings()}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler});settingsMenu.onblur=settingsBlurHandler}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings()}removeClass(getSettingsButton(),"rotate")},0)})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/settings-7bfb4c59cc6bc502.css b/resources/sitehome_model/srcdocserver/static.files/settings-7bfb4c59cc6bc502.css new file mode 100644 index 0000000..79ad215 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/settings-7bfb4c59cc6bc502.css @@ -0,0 +1,3 @@ +.setting-line{margin:1.2em 0.6em;position:relative;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;color:inherit;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-check input:checked{content:url('data:image/svg+xml,\ + \ + ');}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;} \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/source-script-905937fbbdc8e9ea.js b/resources/sitehome_model/srcdocserver/static.files/source-script-905937fbbdc8e9ea.js new file mode 100644 index 0000000..fc50809 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/source-script-905937fbbdc8e9ea.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=document.getElementById("rustdoc-vars").attributes["data-root-path"].value;const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth"){addClass(document.documentElement,"source-sidebar-expanded");child.innerText="<";updateLocalStorage("source-sidebar-show","true")}else{removeClass(document.documentElement,"source-sidebar-expanded");child.innerText=">";updateLocalStorage("source-sidebar-show","false")}}function createSidebarToggle(){const sidebarToggle=document.createElement("div");sidebarToggle.id="src-sidebar-toggle";const inner=document.createElement("button");if(getCurrentValue("source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}inner.onclick=toggleSidebar;sidebarToggle.appendChild(inner);return sidebarToggle}function createSourceSidebar(){const container=document.querySelector("nav.sidebar");const sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);const sidebar=document.createElement("div");sidebar.id="source-sidebar";let hasFoundFile=false;const title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(key=>{sourcesIndex[key][NAME_OFFSET]=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",hasFoundFile)});container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}const lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSourceLines(match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to{onEachLazy(e.getElementsByTagName("a"),i_e=>{removeClass(i_e,"line-highlighted")})});for(let i=from;i<=to;++i){elem=document.getElementById(i);if(!elem){break}addClass(elem,"line-highlighted")}}const handleSourceHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSourceLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",()=>{const match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSourceLines(match)}});onEachLazy(document.getElementsByClassName("src-line-numbers"),el=>{el.addEventListener("click",handleSourceHighlight)});highlightSourceLines();window.createSourceSidebar=createSourceSidebar})() \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/storage-62ce34ea385b278a.js b/resources/sitehome_model/srcdocserver/static.files/storage-62ce34ea385b278a.js new file mode 100644 index 0000000..6f4ec2e --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/storage-62ce34ea385b278a.js @@ -0,0 +1 @@ +"use strict";const darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null})();function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def}}return current}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className)}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className)}}function onEach(arr,func,reversed){if(arr&&arr.length>0){if(reversed){for(let i=arr.length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(const elem of arr){if(func(elem)){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function updateLocalStorage(name,value){try{window.localStorage.setItem("rustdoc-"+name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name)}catch(e){return null}}const getVar=(function getVar(name){const el=document.getElementById("rustdoc-vars");return el?el.attributes["data-"+name].value:null});function switchTheme(newThemeName,saveTheme){if(saveTheme){updateLocalStorage("theme",newThemeName)}let newHref;if(newThemeName==="light"||newThemeName==="dark"||newThemeName==="ayu"){newHref=getVar("static-root-path")+getVar("theme-"+newThemeName+"-css")}else{newHref=getVar("root-path")+newThemeName+getVar("resource-suffix")+".css"}if(!window.currentTheme){document.write(``);window.currentTheme=document.getElementById("themeStyle")}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true)}else{switchTheme(getSettingValue("theme"),false)}}mql.addEventListener("change",updateTheme);return updateTheme})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme)}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"source-sidebar-expanded")}window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0)}}) \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/static.files/wheel-7b819b6101059cd0.svg b/resources/sitehome_model/srcdocserver/static.files/wheel-7b819b6101059cd0.svg new file mode 100644 index 0000000..83c07f6 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/static.files/wheel-7b819b6101059cd0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/sitehome_model/srcdocserver/theme.css b/resources/sitehome_model/srcdocserver/theme.css new file mode 100644 index 0000000..9ce9b21 --- /dev/null +++ b/resources/sitehome_model/srcdocserver/theme.css @@ -0,0 +1 @@ +.logo-container { padding-top: 10px; } diff --git a/resources/sitehome_model/srvc/model.conf b/resources/sitehome_model/srvc/model.conf new file mode 100644 index 0000000..4f86ba8 --- /dev/null +++ b/resources/sitehome_model/srvc/model.conf @@ -0,0 +1,11 @@ +[request_definition] +r = sub, obj, act + +[policy_definition] +p = sub, obj, act + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) \ No newline at end of file diff --git a/resources/sitehome_model/srvc/policy.csv b/resources/sitehome_model/srvc/policy.csv new file mode 100644 index 0000000..f1a5560 --- /dev/null +++ b/resources/sitehome_model/srvc/policy.csv @@ -0,0 +1,6 @@ +p, admin@test.com, *, POST +p, admin@test.com, *, GET +p, user@test.com, /, GET +p, dev, /docserver, GET +p, dev, /srcdocserver, GET +p, dev, /assets, GET diff --git a/resources/templates/home.html.j2 b/resources/templates/home.html.j2 new file mode 100644 index 0000000..9698c1c --- /dev/null +++ b/resources/templates/home.html.j2 @@ -0,0 +1,105 @@ +{% include "partials/header.html.j2" %} +
+
+

+ {{title | default(value='')}} +

+
+ {{subtitle | default(value='')}} +
+ +
+
+
+
+ + + Code + +

A Documentation Library

+

For production and developers.

+ Read more + + +
+
Don't miss out on the latest updates and news
+ +
+
+ +
+ + +
+
+
+
+ +
+
+
+ + + Tutorial + +

How to quickly deploy a static website

+

Static websites are now used to bootstrap lots of websites and are becoming the basis for a variety of tools that even influence both web designers and developers.

+ + Read more + + +
+
+
+ + + Design + +

Start with Flowbite Design System

+

Static websites are now used to bootstrap lots of websites and are becoming the basis for a variety of tools that even influence both web designers and developers.

+ Read more + + +
+
+ + + Code + +

Best react libraries around the web

+

Static websites are now used to bootstrap lots of websites and are becoming the basis for a variety of tools that even influence both web designers and developers.

+ Read more + + +
+
+
+
+ +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/invite_create.html.j2 b/resources/templates/invite_create.html.j2 new file mode 100644 index 0000000..4d84fdc --- /dev/null +++ b/resources/templates/invite_create.html.j2 @@ -0,0 +1,71 @@ +{% include "partials/header.html.j2" %} +
+
+
{{title | default (value="")}}
+
+ +
+ + +
+
+ + +
+
+ + + +

+
+
+ {% if use_mail %} +
+ + +
+ {% endif %} +
+ +
+
+
+
+
+
+
+ +
+
+ + +{% include "partials/footer.html.j2" %} \ No newline at end of file diff --git a/resources/templates/invite_mail.html.j2 b/resources/templates/invite_mail.html.j2 new file mode 100644 index 0000000..df61bbe --- /dev/null +++ b/resources/templates/invite_mail.html.j2 @@ -0,0 +1,32 @@ + + + + + {% if css_link %} + + {% endif %} + + + +
+
+
{{email_subject | default (value="")}}
+
{{email_body | default (value="")}}
+ + {% if invite_key and invite_key != "" %} +
Use this link:
+ + {% if invite_expiration %} +
Available for {{invite_expiration}}
+ {% endif %} + {% endif %} +
+
+ + \ No newline at end of file diff --git a/resources/templates/invite_mail.txt.j2 b/resources/templates/invite_mail.txt.j2 new file mode 100644 index 0000000..68be974 --- /dev/null +++ b/resources/templates/invite_mail.txt.j2 @@ -0,0 +1,13 @@ + +{{email_subject | default (value="")}} \r\n + +{{email_body | default (value="")}} \r\n + +{% if invite_key and invite_key != "" %} +Use this link: {{signup_url | default (value="/signup")}}/{{invite_key}} \r\n + +{% if invite_expiration %} +Available for {{invite_expiration}} \r\n +{% endif %} + +{% endif %} \ No newline at end of file diff --git a/resources/templates/invite_output.html.j2 b/resources/templates/invite_output.html.j2 new file mode 100644 index 0000000..420cd0c --- /dev/null +++ b/resources/templates/invite_output.html.j2 @@ -0,0 +1,38 @@ +{% if use_header %} + + + + + + + +{% include "partials/header.html.j2" %} +{% endif %} +
+
+
{{email_subject | default (value="")}}
+
{{email_body | default (value="")}}
+ + {% if invite_key and invite_key != "" %} +
Use this link:
+ + {% if invite_expiration %} +
Available for {{invite_expiration}}
+ {% endif %} + {% endif %} +
{{email_result | default (value="")}}
+
+
+{% if use_footer %} +{# + + +#} +{% include "partials/footer.html.j2" %} +{% endif %} \ No newline at end of file diff --git a/resources/templates/login.html.j2 b/resources/templates/login.html.j2 new file mode 100644 index 0000000..6382604 --- /dev/null +++ b/resources/templates/login.html.j2 @@ -0,0 +1,108 @@ +{% include "partials/header.html.j2" %} +{% if usr_roles is containing('new') %} + {% set logo= assets_url~"/images/logo_new.svg" %} +{% elif usr_roles is containing('dev') %} + {% set logo= assets_url~"/images/logo_dev.svg" %} +{% else %} + {% set logo= assets_url~"/images/logo.svg" %} +{% endif %} +
+ {% include "partials/mini_navbar.html.j2" %} +
+
+
+
+ {{ main_name | default(value= +
+
+ +
+ +
+
+
+ +
+ + + + + +
+
+
+ +
+ + {% if use_mail %} + + Forgot
Password? +
+ {% endif %} + {% if signup_mode == "open" %} + + SingUp + + {% endif %} +
+
+ + {% if with_totp %} + + {% endif %} +
+
+
+ + +{% include "partials/symbols.html.j2" %} +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/logout.html.j2 b/resources/templates/logout.html.j2 new file mode 100644 index 0000000..a9f8741 --- /dev/null +++ b/resources/templates/logout.html.j2 @@ -0,0 +1,26 @@ +{% include "partials/header.html.j2" %} +
+
+
{{site_org | default(value="")}}: {{site_name | default(value="")}}
+
Thank you for using this website !
+ +
+
+ +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/logs.html.j2 b/resources/templates/logs.html.j2 new file mode 100644 index 0000000..27151b6 --- /dev/null +++ b/resources/templates/logs.html.j2 @@ -0,0 +1,321 @@ +{% include "partials/header.html.j2" %} +
+
+ {%if user and user.name != "" %} +

+
Logs : + +
+

+ + {% else %} +

+
Logs
+

+ {% endif %} +
{{total_logs | default(value="") }} items
+
+
+
+
+
+ + + +
+ + {% if user and user.name != '' %} + + + + + + {% endif %} + + + New Signup + + + {% if signup_mode != "open" %} + + + Invite new User + + + {% endif %} + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + {% for it in logs %} + {% if loop.index % 2 == 0%} + {% set tr_css="bg-gray-100 dark:bg-gray-800" %} + {% else %} + {% set tr_css="bg-white dark:bg-gray-900" %} + {% endif %} + {% if user.isadmin == true %} + {% set text_isadmin = '1' %} + {% else %} + {% set text_isadmin = '0' %} + {% endif %} + {% set ip = it.content.req.ip | default(value="") %} + {% set agent = it.content.req.agent | default(value="") %} + {% set line_data = it.line_id~':'~it.content.origin~':'~it.content.context~':'~ip~':'~it.content.role~':'~agent %} + + + + + + + + + + {% endfor %} + +
+
+ + +
+
+
+ When / Who + + + +
+
+
+ Origin + + + +
+
+
+ Context + + + +
+
+
+ Request info + + + +
+
+
+ Roles + +
+
+
+ Request agent + + + +
+
+
+ + +
+ +
+ {% if user and user.name != '' %} +
+
+
{{it.content.when}}
+
line: {{it.line_id}}
+ {% if it.content.sid != '' %}
SID: {{it.content.sid}}
{% endif %} +
+ {% if it.content.id != '' %} ID: {{it.content.id}} {% endif %} + {% if user and user.name != '' %} {{user.name}}{% endif %} +
+
+
+ {% else %} +
+
{{it.content.when}}
+
line: {{it.line_id}}
+ {% if it.content.sid != '' %}
SID: {{it.content.sid}}
{% endif %} + {% if it.content.id != '' %} ID: {{it.content.id}} {% endif %} + {% endif %} +
+
+
+ {{it.content.origin}} + {{it.content.trigger}} +
+
+
+ {% set arr_info = it.content.info | split(pat=",") %} + {% if arr_info | length > 1 %} + + {% else %} +
{{it.content.info}}
+ {% endif %} +
{{it.content.context}}
+
+
+
+ {% if ip != "" %} + IP: {{ip | replace(from=":", to=" -> ")}} + {% endif %} + {% if it.content.req.ref and it.content.req.ref != "" %} + Ref: {{it.content.req.ref}} + {% endif %} + {% if it.content.req.auth and it.content.req.auth != "" %} + Auth: {{it.content.req.auth}} + {% endif %} + {% if it.content.req.int and it.content.req.int != "" %} + Int: {{it.content.req.int}} + {% endif %} +
+
+ {% set roles = it.content.role | split(pat=",") %} + {% for rol in roles %} + {% if rol != "" %} + + {{rol}} + + {% endif %} + {% endfor %} + + {% if agent != "" %} +
+ {% set arr_agent = agent | split(pat=")") %} + {% for agnt in arr_agent %} + {{agnt}}) + {% endfor %} +
+ {% endif %} +
+ + {% include "partials/modal_edit_user.html.j2" %} +
+
+ + + +{% include "partials/symbols.html.j2" %} +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/pages/terms-conditions.html.j2 b/resources/templates/pages/terms-conditions.html.j2 new file mode 100644 index 0000000..1bc9c4b --- /dev/null +++ b/resources/templates/pages/terms-conditions.html.j2 @@ -0,0 +1,17 @@ +{% include "partials/header.html.j2" %} +
+
+

Terms and Conditions

+

Here at Flowbite we focus on markets where technology, innovation, and capital can unlock long-term value and drive economic growth.

+ +
+
+{% include "partials/footer.html.j2" %} \ No newline at end of file diff --git a/resources/templates/partials/footer.html.j2 b/resources/templates/partials/footer.html.j2 new file mode 100644 index 0000000..ac87236 --- /dev/null +++ b/resources/templates/partials/footer.html.j2 @@ -0,0 +1,37 @@ +
+
+ + + {% if js_link %}{% endif %} + {% if other_js_link %}{% endif %} + {% if utils_js_link %}{% endif %} + {% if main_js_link %}{% endif %} + {# + + + #} +
+ + + diff --git a/resources/templates/partials/form-password.html.j2 b/resources/templates/partials/form-password.html.j2 new file mode 100644 index 0000000..8a7fe26 --- /dev/null +++ b/resources/templates/partials/form-password.html.j2 @@ -0,0 +1,61 @@ +
+ +
+ + + + + + +
+
+
Secure estimation
+
+
+
+
+ 0 +
+
+
+
+
+
+ + + + + + +
diff --git a/resources/templates/partials/form-totp.html.j2 b/resources/templates/partials/form-totp.html.j2 new file mode 100644 index 0000000..60d1328 --- /dev/null +++ b/resources/templates/partials/form-totp.html.j2 @@ -0,0 +1,133 @@ +{% if user and user.otp_base32 %} + {% set otp_code = user.otp_base32 %} +{% endif %} +{% if user and user.otp_url %} + {% set otp_url = user.otp_url %} +{% else %} + {% set otp_url = "" %} +{% endif %} +{% if user %} + {% set otp_verified = user.otp_verified %} +{% else %} + {% set otp_verified = false %} +{% endif %} + + +{% if totp_mode == "optional" and otp_verified != true %} + {#
+ + +
#} +
+ Use TOTP: + +
+{% else %} +
+ Reset TOTP: + +
+{% endif %} +
+
+
+
{{otp_code | default(value='')}}
+ +
+ +
+ + {% if otp_qr and otp_qr != "" %} +
+ {% endif %} +
+{% if user and user.otp_base32 != "" and user.otp_verified == true %} +
+

+ TOTP code {{totp_digits | default(value="")}} digits with {{totp_algorithm | default(value="")}} for verification +

+
+
+ + + + Enabled + + + + Verified + +
+{% else %} +
+ + + {# class="block py-2.5 px-0 w-27 text-sm text-gray-900 bg-transparent border-0 border-b-2 border-gray-300 appearance-none dark:text-white dark:border-gray-600 dark:focus:border-blue-500 focus:outline-none focus:ring-0 focus:border-blue-600 peer" + + #} +
+{% endif %} + + +
\ No newline at end of file diff --git a/resources/templates/partials/form-user.html.j2 b/resources/templates/partials/form-user.html.j2 new file mode 100644 index 0000000..e67926c --- /dev/null +++ b/resources/templates/partials/form-user.html.j2 @@ -0,0 +1,100 @@ +{%if usr_items and usr_items.theme %} + {% set theme = usr_items.theme %} +{% else %} + {% set theme = "" %} +{% endif %} +{% if user and user.isadmin and user.isadmin == "TRUE" or isadmin and isadmin == "TRUE" %} + {% set is_admin_user = 1 %} +{% else %} + {% set is_admin_user = 0 %} +{% endif %} +{%if not admin_fields %} + {% set admin_fields = "" %} +{% endif %} + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+{% if user and user.roles and user.roles != '' %} + {% set roles = user.roles %} +{% elif is_admin_user != 1 %} + {% set roles = 'admin,dev' %} +{% else %} + {% set roles = 'default' %} +{% endif %} +{% if no_edit %} + {% set css_roles = 'hidden'%} +{% elif is_admin_user != 1 and admin_fields is containing('roles') %} + {% set css_roles = 'hidden'%} +{% else %} + {% set css_roles = ''%} +{% endif %} +
+
Roles:
+
+
+
+ + +
+
separated with commas
+
+ + +
\ No newline at end of file diff --git a/resources/templates/partials/header.html.j2 b/resources/templates/partials/header.html.j2 new file mode 100644 index 0000000..203aea6 --- /dev/null +++ b/resources/templates/partials/header.html.j2 @@ -0,0 +1,29 @@ + + + + + + + + {% if css_link %} + + {% endif %} + {% if other_css_link %} + + {% endif %} + + {# + + #} + {# #} + + + +
+ {% if with_menu %} + {% include "partials/navbar.html.j2" %} + {% endif %} diff --git a/resources/templates/partials/loading.html.j2 b/resources/templates/partials/loading.html.j2 new file mode 100644 index 0000000..ed45933 --- /dev/null +++ b/resources/templates/partials/loading.html.j2 @@ -0,0 +1,56 @@ + \ No newline at end of file diff --git a/resources/templates/partials/mini_navbar.html.j2 b/resources/templates/partials/mini_navbar.html.j2 new file mode 100644 index 0000000..5fd1798 --- /dev/null +++ b/resources/templates/partials/mini_navbar.html.j2 @@ -0,0 +1,15 @@ + diff --git a/resources/templates/partials/modal_edit_user.html.j2 b/resources/templates/partials/modal_edit_user.html.j2 new file mode 100644 index 0000000..215ebe8 --- /dev/null +++ b/resources/templates/partials/modal_edit_user.html.j2 @@ -0,0 +1,147 @@ + \ No newline at end of file diff --git a/resources/templates/partials/navbar.html.j2 b/resources/templates/partials/navbar.html.j2 new file mode 100644 index 0000000..7d7c879 --- /dev/null +++ b/resources/templates/partials/navbar.html.j2 @@ -0,0 +1,173 @@ +{% if usr_roles is containing('new') %} + {% set logo= assets_url~"/images/logo_new.svg" %} +{% elif usr_roles is containing('dev') %} + {% set logo= assets_url~"/images/logo_dev.svg" %} +{% else %} + {% set logo= assets_url~"/images/logo.svg" %} +{% endif %} + diff --git a/resources/templates/partials/symbols.html.j2 b/resources/templates/partials/symbols.html.j2 new file mode 100644 index 0000000..3d47cbe --- /dev/null +++ b/resources/templates/partials/symbols.html.j2 @@ -0,0 +1,88 @@ + diff --git a/resources/templates/reset_password_mail.html.j2 b/resources/templates/reset_password_mail.html.j2 new file mode 100644 index 0000000..e3fe546 --- /dev/null +++ b/resources/templates/reset_password_mail.html.j2 @@ -0,0 +1,32 @@ + + + + + {% if css_link %} + + {% endif %} + + + +
+
+
{{email_subject | default (value="")}}
+
{{email_body | default (value="")}}
+ + {% if reset_key and reset_key != "" %} +
Use this link: + + {% if reset_expiration %} +
Available for {{reset_expiration}}
+ {% endif %} + {% endif %} +
+
+ + diff --git a/resources/templates/reset_password_mail.txt.j2 b/resources/templates/reset_password_mail.txt.j2 new file mode 100644 index 0000000..221b968 --- /dev/null +++ b/resources/templates/reset_password_mail.txt.j2 @@ -0,0 +1,13 @@ + +{{email_subject | default (value="")}} \r\n + +{{email_body | default (value="")}} \r\n + +{% if reset_key and reset_key != "" %} +Use this link: {{reset_url | default (value="/reset")}}/{{reset_key | urlencode_strict}} \r\n + +{% if reset_expiration %} +Available for {{reset_expiration}} \r\n +{% endif %} + +{% endif %} diff --git a/resources/templates/signup.html.j2 b/resources/templates/signup.html.j2 new file mode 100644 index 0000000..8dd521b --- /dev/null +++ b/resources/templates/signup.html.j2 @@ -0,0 +1,66 @@ +{% include "partials/header.html.j2" %} +{% if usr_roles is containing('new') %} + {% set logo= assets_url~"/images/logo_new.svg" %} +{% elif usr_roles is containing('dev') %} + {% set logo= assets_url~"/images/logo_dev.svg" %} +{% else %} + {% set logo= assets_url~"/images/logo.svg" %} +{% endif %} +
+{% if isadmin and isadmin == "TRUE" %} + {% include "partials/navbar.html.j2" %} +{% else %} + {% include "partials/mini_navbar.html.j2" %} +{% endif %} +
+
+
+
+ {{ main_name | default(value= +
+
Signup
+ {% include "partials/form-user.html.j2" %} + {% include "partials/form-password.html.j2" %} + {% include "partials/form-totp.html.j2" %} +
+
+ + +
+
+ + +
+
+
+
+
+ +{# #} + +{% include "partials/symbols.html.j2" %} +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/user_settings.html.j2 b/resources/templates/user_settings.html.j2 new file mode 100644 index 0000000..f87c150 --- /dev/null +++ b/resources/templates/user_settings.html.j2 @@ -0,0 +1,133 @@ +{% include "partials/header.html.j2" %} +{% if usr_roles is containing('new') %} + {% set logo= assets_url~"/images/logo_new.svg" %} +{% elif usr_roles is containing('dev') %} + {% set logo= assets_url~"/images/logo_dev.svg" %} +{% else %} + {% set logo= assets_url~"/images/logo.svg" %} +{% endif %} +
+
+
+
+ +
+ + Settings +
+ {% if edit_target and edit_target == "main" %} + {% include "partials/form-user.html.j2" %} + {% elif edit_target and edit_target == "totp" %} + {% include "partials/form-totp.html.j2" %} + {% elif edit_target and edit_target == "password" %} + {% include "partials/form-password.html.j2" %} + {% endif %} +
+
+ {% if no_edit %} + + {% else %} + {% if edit_reset and edit_reset == "password" %} + + {% else %} + + {% endif %} + + {% endif %} +
+ {% if no_edit %} +
+
+ or +
+
+ + {% if totp_mode != "no" %} + + {% endif %} +
+ {% endif %} +
+
+
+
+ +{% if no_edit %} + + +{% else %} + + +{% endif %} +{% include "partials/symbols.html.j2" %} +{% include "partials/footer.html.j2" %} diff --git a/resources/templates/users.html.j2 b/resources/templates/users.html.j2 new file mode 100644 index 0000000..f681e41 --- /dev/null +++ b/resources/templates/users.html.j2 @@ -0,0 +1,306 @@ +{% include "partials/header.html.j2" %} +
+
+

+
Users List
+

+
{{total_usrs | default(value="") }} items
+
+
+
+
+
+ + + +
+ + + + + + + + New Signup + + + {% if signup_mode != "open" %} + + + Invite new User + + + {% endif %} + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + {% for user in usrs %} + {% if loop.index % 2 == 0%} + {% set tr_css="bg-gray-100 dark:bg-gray-800" %} + {% else %} + {% set tr_css="bg-white dark:bg-gray-900" %} + {% endif %} + {% if user.isadmin == true %} + {% set text_isadmin = '1' %} + {% else %} + {% set text_isadmin = '0' %} + {% endif %} + + + + + + + + + + + {% endfor %} + +
+
+ + +
+
+
+ Name + + + +
+
+
+ Logs +
+
+
+ Roles +
+
+
+ Status + +
+
+
+ Is Admin +
+
+
+ TOTP +
+
+
+ Dates +
+
+
+ + +
+ +
+ {% set first = user.name | truncate(length=1, end="") | upper %} +
+ +
+ +
+
{{user.name}}
+
{{user.fullname}}
+
+
+ + + + + {% set roles = user.roles | split(pat=",") %} + {% for rol in roles %} + + {{rol}} + + {% endfor %} + + {% if user.status == "Active" %} + {% set status_color="green" %} + {% elif user.status == "Created" %} + {% set status_color="blue" %} + {% elif user.status == "Pending" %} + {% set status_color="orange" %} + {% elif user.status == "Lock" %} + {% set status_color="red" %} + {% else %} + {% set status_color="yellow" %} + {% endif %} +
+
{{user.status}} +
+
+
+ {% if user.isadmin == true %} admin {% endif %} +
+
+
+
+ {% if user.otp_enabled == 1 %} + + + Enabled + + {% endif %} + {% if user.otp_verified == 1 %} + + + Verified + + {% endif %} +
+ {% if user.otp_defs != "" %} +
defs: {{user.otp_defs}}
+ {% endif %} +
+ {# Edit user #} +
+
+
{{user.lastaccess}}
+
{{user.created}}
+
+
+ + {% include "partials/modal_edit_user.html.j2" %} +
+
+ + + +{% include "partials/symbols.html.j2" %} +{% include "partials/footer.html.j2" %}