diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1db73ab..0000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -site/ -#.gitignore -.idea/ -JavaUltimateToolsDocs.iml -CNAME diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100755 index 0000000..d063aca --- /dev/null +++ b/404.html @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + + +
+
+ +

404 - Not found

+ + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/AuthManager/index.html b/AuthSystem/AuthManager/index.html new file mode 100755 index 0000000..4f2e96a --- /dev/null +++ b/AuthSystem/AuthManager/index.html @@ -0,0 +1,2657 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Auth Manager - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Auth ManagerLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authc.AuthManager

+

The Auth Manager class contains all methods needed for controlling the Auth System. +This includes methods to manage user accounts, login sessions, user roles and user permissions.

+

SetupLink

+

The Auth Manager is a singleton class but a new instance still needs to be initialized upon first use. +When a new instance is created a "users" table is automatically created in the specified database. +The following code can be used to create a new instance: +
1
+2
+3
try(final var db = new Database("./mydb.db", DatabaseType.H2)) {
+    final var manager = AuthManager.getNewInstance(db);
+}
+
+

+

After the new instance has been created you can use the following to retrieve the instance again: +
1
+2
+3
try(final var db = new Database("./mydb.db", DatabaseType.H2)) {
+    final var manager = AuthManager.getInstance();
+}
+
+

+

An icon path and program name may also be optionally provided as parameters to change the +icon and program name for all login dialogs.

+

User Account MethodsLink

+

Create A New User (createUser)Link

+

To create a new user use the createUser method supplying the following parameters:

+
    +
  • Username - The username of the new account
  • +
  • Password - The password of the new account
  • +
  • User Role - The user role of the new account
  • +
+

The user role can be a text string or one of the +items from the UserRoleManager.SystemUserRoles enum.

+

The UserRoleManager.SystemUserRoles list contains:

+
    +
  • ADMIN
  • +
  • AUTHOR
  • +
  • EDITOR
  • +
  • BASIC
  • +
  • NONE
  • +
+
+

Note

+

The NONE user role can never have permissions assigned to it. +Using the NONE user role is a quick way to remove all permissions from a user.

+
+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+authManager.createUser("admin", "1234", UserRoleManager.SystemUserRoles.ADMIN);
+authManager.createUser("editor", "1234", UserRoleManager.SystemUserRoles.EDITOR);
+
+
+ +
+

Delete An Existing User (deleteUser)Link

+

To delete an existing user use the deleteUser method supplying the following parameter:

+
    +
  • Username - The username of the account to delete
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+authManager.deleteUser("admin");
+
+
+ +
+

Get Username Object (getUser)Link

+

Retrieves a readonly immutable UserAccount object. +To retrieve the object supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final UserAccount user = authManager.getUser("admin");
+
+
+ +
+

Check If User Exists (userExists)Link

+

Checks to see if the specified user account exists. +To check a user account, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.userExists("admin");
+if(result) MessageBox.show("Admin User Exists!");
+else MessageBox.show("Admin User Does Not Exist!");
+
+
+ +
+

Get Account Creation Date (getUserCreationDate)Link

+

Returns the date and time the user was initially created.

+

There is two methods to retrieving the user creation date. +The date can either be returned as a LocalDateTime object or as a formatted string.

+

LocalDateTime ObjectLink

+

To retrieve the user creation date, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+final LocalDateTime result = authManager.getUserCreationDate("admin");
+MessageBox.show("Account Was Created On " + result.format(formatter));
+
+
+ +
+

Formatted String ObjectLink

+

To retrieve the user creation date, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Format - The string that represents the format to return the date
  • +
+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final String result = authManager.getUserCreationDate("admin", "yyyy-MM-dd HH:mm");
+MessageBox.show("Account Was Created On " + result);
+
+
+ +
+

Get User Role (getUserRole)Link

+

Retrieves the UserRole object assigned to the specified user. +To retrieve the object, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final UserRole userRole = authManager.getUserRole("admin");
+
+
+ +
+

Set User Role (getUserRole)Link

+

Sets the user role assigned to the specified user. +To set the user role, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • User Role - The user role of the new account
  • +
+

The user role can be a text string or one of the +items from the UserRoleManager.SystemUserRoles enum.

+

The UserRoleManager.SystemUserRoles list contains:

+
    +
  • ADMIN
  • +
  • AUTHOR
  • +
  • EDITOR
  • +
  • BASIC
  • +
  • NONE
  • +
+
+

Note

+

The NONE user role can never have permissions assigned to it. +Using the NONE user role is a quick way to remove all permissions from a user.

+
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+userManager.setUserRole("admin", UserRoleManager.SystemUserRoles.ADMIN);
+
+
+ +
+

Set User Password (setPassword)Link

+

Sets the password assigned to the specified user. +To set the new password, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Password - The new password to set
  • +
+
+

Note

+

If you want to prevent a user from setting an empty password +or to check for password complexity requirements those checks need +to be implemented separately. This method allows empty passwords. +Even if the password is empty, the empty password is still encrypted +with a random secure salt just like any supplied password would be.

+
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+authManager.setPassword("admin", "newPass");
+
+
+ +
+

Check If Password Matches (checkPasswordMatches)Link

+

This method allows you to check if the supplied password matches +the user's stored password in the database. +To verify the password, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Password - The password to verify
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.checkPasswordMatches("admin", "1234");
+if(result) MessageBox.show("Password Matches!");
+else MessageBox.show("Password Does Not Match!");
+
+
+ +
+

Lock/Unlock A User (lockUser and unlockUser)Link

+

A locked user account prevents login and prevents any new sessions +to be opened for the user. Locking an user account may be needed for numerous reasons.

+

To lock and unlock an account, supply the following parameter:

+
    +
  • Username - The username of the account to lock/unlock
  • +
+
+

Example

+
1
+2
+3
+4
+5
final var authManager = AuthManager.getInstance();
+//Lock The Account
+authManager.lockUser("admin");
+//Unlock The Account
+authManager.unlockUser("admin");
+
+
+ +
+

Check If A User Is Locked (isUserLocked)Link

+

A locked user account prevents login and prevents any new sessions +to be opened for the user. Locking an user account may be needed for numerous reasons.

+

To check if an account is locked, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isUserLocked("admin");
+if(result) MessageBox.show("Admin Account Is Locked!");
+else MessageBox.show("Admin Account Is Unlocked!");
+
+
+ +
+

Set User Password Expiration Date (setPasswordExpirationDate)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To set a password expiration date, supply the following parameters:

+
    +
  • Username - The username of the account to update
  • +
  • Expiration Date - A LocalDateTime object representing the expiration date
  • +
+
+

Example

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
final var authManager = AuthManager.getInstance();
+//Sets the date to now
+authManager.setPasswordExpirationDate("admin", LocalDateTime.now());
+//Sets the date to 30 days from today
+authManager.setPasswordExpirationDate("admin", LocalDateTime.now().plusDays(30));
+//First Method To Set the date to January 1st, 2019 at 8am
+authManager.setPasswordExpirationDate("admin", LocalDateTime.of(2019, 1, 1, 8, 0));
+//Second Method To Set the date to January 1st of 2019 at 8am
+authManager.setPasswordExpirationDate("admin", LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0));
+//Third Method To Set the date to January 1st of 2019 at 8am
+final String str = "2019-01-01 08:00";
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+authManager.setPasswordExpirationDate("admin", LocalDateTime.parse(str, formatter));
+
+
+ +
+

Disable Password Expiration (disablePasswordExpiration)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To disable password expiration for a user, supply the following parameter:

+
    +
  • Username - The username of the account to update
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+authManager.disablePasswordExpiration("admin");
+
+
+ +
+

Check If User Password Is Expired (isPasswordExpired)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To check if a user's password is expired, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isPasswordExpired("admin");
+if(result) MessageBox.show("Admin Account Password Is Expired!");
+else MessageBox.show("Admin Account Password Is Not Expired!");
+
+
+ +
+

Check If User Password Has Expiration Date (isPasswordSetToExpire)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To check if a user's password has an expiration date, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isPasswordSetToExpire("admin");
+if(result) MessageBox.show("Admin Account Password Has An Expiration Date!");
+else MessageBox.show("Admin Account Password Does Not Have An Expiration Date!");
+
+
+ +
+

Get User Password Expiration Date (getPasswordExpirationDate)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

There is two methods to retrieving the password expiration date. +The date can either be returned as a LocalDateTime object or as a formatted string.

+
+

Note

+

If the expiration date has been disabled or was never enabled this method will +still return an expiration date. For logistical database reasons a date still +has to be set. So the date will be set to 1000 years after the user account +was created or 1000 years after the date when the password expiration date +was last disabled. This number can be updated if any bugs occur but it seems +like 1000 years is far enough in the future to not cause any problems.

+
+

LocalDateTime ObjectLink

+

To retrieve the password expiration date, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+final LocalDateTime result = authManager.getPasswordExpirationDate("admin");
+MessageBox.show("Admin Account Password Expires At " + result.format(formatter));
+
+
+ +
+

Formatted String ObjectLink

+

To retrieve the password expiration date, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Format - The string that represents the format to return the date
  • +
+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final String result = authManager.getPasswordExpirationDate("admin", "yyyy-MM-dd HH:mm");
+MessageBox.show("Admin Account Password Expires At " + result);
+
+
+ +
+

Single-Session MethodsLink

+

Get Logged-In Username (getLoggedInUsername)Link

+

Returns the username of the currently logged in user under the single session context.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final String currentUsername = authManager.getLoggedInUsername();
+
+
+ +
+

Is Any User Logged-In (isUserLoggedIn)Link

+

Checks if a user is currently logged in under the single-user context.

+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isUserLoggedIn();
+if(result) MessageBox.show("A user is logged-in!");
+else MessageBox.show("No user is logged-in!");
+
+
+ +
+

Is A Specific User Logged-In (isUserLoggedIn)Link

+

Checks if the specified user is currently logged in under the single-user context. +To check if a specific user is logged-in, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isUserLoggedIn("admin");
+if(result) MessageBox.show("Admin user is logged-in!");
+else MessageBox.show("Admin user is not logged-in!");
+
+
+ +
+

Get Currently Logged-In User Session (getSession)Link

+

Retrieves the current session for the specified username, under the single-user context.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final Session currentSession = authManager.getSession();
+
+
+ +
+

Get Specific User Session (getSession)Link

+

Retrieves the current session for the specified username, under the single-user context.

+

To retrieve a specific user session, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final Session session = authManager.getSession("admin");
+
+
+ +
+

Show Login Dialog (showLoginWindow)Link

+

Shows the login dialog window to log a user into the single-user context. +The method returns true if a user was logged in successfully. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.showLoginWindow(true);
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

Login A Specific User (loginUser)Link

+

Logs in a user, under the single-user context, with the specified username, +without checking for valid credentials.

+

To retrieve a specific user session, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Warning

+

This method does not validate credentials and should not be used except +in advanced use cases. A example case could be to login a user during unit testing. +The method showLoginWindow should be used instead. With this method +the user is immediately logged in as long as the user exists and other +checks pass (account unlocked, user role enabled and password not expired).

+
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.loginUser("admin");
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

Logout Current Logged-In User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in.

+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.logoutUser();
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Logout Specific User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in or if the specified user does not exist.

+

To logout a specific user, supply the following parameter:

+
    +
  • Username - The username of the account to logout
  • +
+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.logoutUser("admin");
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Get Currently Logged-In User's UserRole (getLoggedInUserRole)Link

+

Retrieves the user role of the currently logged in user under +the single user context. If no user is currently logged-in then this +method will return null.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final UserRole result = authManager.getLoggedInUserRole();
+
+
+ +
+

Check If An Admin User Is Logged-In (isAdminLoggedIn)Link

+

Checks if an admin user is currently logged in under the single user context.

+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isAdminLoggedIn();
+if(result) MessageBox.show("An Admin user is logged-in!");
+else MessageBox.show("An Admin user is not logged-in!");
+
+
+ +
+

Get Admin Login Override (getAdminOverride)Link

+

Requests an admin user to authenticate to override permissions by +showing the login dialog using the single session context. During this +process the admin user is not actually logged-in, instead just their +username, password and user role is verified. Returns true if +admin override succeeded and false if the cancel button was pressed +or if override failed. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.getAdminOverride();
+if(result) MessageBox.show("Admin override succedded!");
+else MessageBox.show("Admin override failed!");
+
+
+ +
+

Get User Login Verification (getUserVerification)Link

+

Requests that the currently logged in username to re-login using +the single session context. During this process the user is not +actually logged-in again, instead just their username and password is +verified. Returns true if the user verification succeeded and false +if the cancel button was pressed or if override failed. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.getUserVerification();
+if(result) MessageBox.show("User verification succedded!");
+else MessageBox.show("User verification failed!");
+
+
+ +
+

Require That Admin Is Logged-In (requireAdmin)Link

+

Checks that the logged-in user, under the single session context, +is an admin and if not, requests an admin override. +During this process the user is not actually logged-in again, +instead their username, password and user role is just verified.

+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.requireAdmin();
+if(result) MessageBox.show("Admin check passed!");
+else MessageBox.show("Admin check failed!");
+
+
+ +
+

Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin)Link

+

Checks that the logged-in user, under the single session context, +is an admin, if true, prompts the admin to re-login and +if false, requests an admin override. +During this process the user is not actually logged-in again, +instead their username, password and user role is just verified.

+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.requireAdmin();
+if(result) MessageBox.show("Admin check passed!");
+else MessageBox.show("Admin check failed!");
+
+
+ +
+

Multi-Session MethodsLink

+

Is A Specific User Logged-In (isUserLoggedIn)Link

+

Checks if the specified user is currently logged in under the multi-user context. +To check if a specific user is logged-in, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isUserLoggedIn("admin", true);
+if(result) MessageBox.show("Admin user is logged-in!");
+else MessageBox.show("Admin user is not logged-in!");
+
+
+ +
+

Get Max Allowed Sessions (getMaxSessions)Link

+

Retrieves the maximum number of allowed sessions, +under the multi session context, before login is disabled.

+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final int result = authManager.getMaxSessions();
+MessageBox.show("The max number of allowed sessions is " + result + '!');
+
+
+ +
+

Set Max Allowed Sessions (setMaxSessions)Link

+

Sets the maximum number of allowed sessions, +under the multi session context, before login is disabled. +To disable the limit set the value to a negative number. +To set the maximum number of allowed sessions, supply the following parameter:

+
    +
  • value - The number of allowed sessions to set
  • +
+
+

Example

+
1
+2
+3
+4
+5
final var authManager = AuthManager.getInstance();
+//Set max sessions to 30.
+authManager.setMaxSessions(30);
+//Block all session creation by setting to 0
+authManager.setMaxSessions(0);
+
+
+ +
+
+

Note

+

Setting this value to a negative number will disable the limit +because a negative amount of sessions can never be created. +When the SessionManager is initialized the value is initially set to -1.

+
+

Get Session Count (getSessionsCount)Link

+

Retrieves the current number of logged in sessions under the multi-user context.

+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final int result = authManager.getSessionsCount();
+MessageBox.show("The max number of logged-in sessions is " + result + '!');
+
+
+ +
+

Get All Sessions (getSessions)Link

+

Retrieves the current logged in sessions as a HashMap under the multi session context. +The returned HashMap key is the session username and the value is the related Session object.

+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final Map<String, Session> sessions = authManager.getSessions();
+MessageBox.show("The max number of logged-in sessions is " + sessions.size() + '!');
+
+
+ +
+

Get Specific User Session (getSession)Link

+

Retrieves the current session for the specified username, under the multi-user context.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final Session session = authManager.getSession("admin", true);
+
+
+ +
+

Login A Specific User (loginUser)Link

+

Logs in a user, under the multi-user context, with the specified username, +without checking for valid credentials.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Warning

+

This method does not validate credentials and should be used carefully. +With this method the user is immediately logged in as long as the user +exists and other checks pass (account unlocked, user role enabled and +password not expired). An example is listed below on how to implement this.

+
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.loginUser("admin", true);
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

This example adds password checking to verify credentials before login:

+
+

Example

+
1
+2
+3
+4
+5
+6
final var authManager = AuthManager.getInstance();
+if(authManager.checkPasswordMatches("admin", "1234")) {
+    final boolean result = authManager.loginUser("admin", true);
+    if(result) MessageBox.show("User was logged-in successfully!");
+    else MessageBox.show("User login failed!");
+} else MessageBox.show("User login failed!");
+
+
+ +
+

Logout Specific User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in or if the specified user does not exist.

+

To logout a specific user, supply the following parameters:

+
    +
  • Username - The username of the account to logout
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.logoutUser("admin");
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Other Session MethodsLink

+

Is New Session Allowed (isNewSessionAllowed)Link

+

Checks if creation of a new session for the specified username is allowed +under the specified context. This method checks to see if the specified user +is already logged-in and if the second parameter is true checks to see if the +max sessions limit has been reached.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true/false - The true for the multi-user context, false for the single-user context
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.isNewSessionAllowed("admin", true);
+if(result) MessageBox.show("New User Session Is Allowed For Admin!");
+else MessageBox.show("New User Session Is Not Allowed For Admin!");
+
+
+ +
+

User Role MethodsLink

+

Create A New User Role (createRole)Link

+

To create a new user role use the createRole method supplying the following parameter:

+
    +
  • Name - The name of the new user role
  • +
+
+

Note

+

When using this method the UserRole object related to the new user role is returned. +If a user role already exists with the specified name the already existing UserRole +object is returned instead.

+
+
+

Example

+
1
+2
+3
final var authManager = AuthManager.getInstance();
+final var newRole = authManager.createRole("moderator");
+newRole.modify().add("edit", "create", "read");
+
+
+ +
+

Add Existing User Role (addExistingRole)Link

+

You can manually create a new UserRole object and directly add that to the list. +To add an existing user role use the addExistingUserRole method supplying the following parameter:

+
    +
  • UserRole - The UserRole object to add
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final UserRole role = new UserRole("moderator");
+role.modify().add("edit", "create", "read");
+authManager.addExistingRole(role);
+
+
+ +
+

Get List Of All Installed User Roles (getRoles)Link

+

Retrieves an unmodifiable list of all user roles.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final Map<String, UserRole> roles = authManager.getRoles();
+
+
+ +
+

Get Specific User Role (getRole)Link

+

Retrieves the specified user role.

+

To retrieve a user role use the getUserRole method supplying the following parameter:

+
    +
  • Name - The name of the User Role to lookup
  • +
+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final UserRole role = authManager.getRole("admin");
+
+
+ +
+

Other MethodsLink

+

Check If User Has Permission (hasPermission)Link

+

Checks if the current username has the specified permission.

+

To check for the permission, supply the following parameter:

+
    +
  • Permission - The name of the permission to check
  • +
+

The permission manager has the following built in permissions:

+
    +
  • admin
  • +
  • edit
  • +
  • create
  • +
  • read
  • +
+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.userHasPermission("admin");
+if(result) MessageBox.show("User Has Admin Permission!");
+else MessageBox.show("User Does Not Have Admin Permission!");
+
+
+ +
+

This can also be done with a list of permissions:

+
+

Example

+
1
+2
+3
+4
final var authManager = AuthManager.getInstance();
+final boolean result = authManager.userHasPermissions(new HashSet<>(Arrays.asList("admin", "edit")));
+if(result) MessageBox.show("User Has Specified Permissions!");
+else MessageBox.show("User Does Not Have Specified Permissions!");
+
+
+ +
+

Get All Username Objects (getUsersList)Link

+

Retrieves a readonly immutable UserAccount object for each user +account and returns the list as a HashSet.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final HashSet<UserAccount> users = authManager.getUsersList();
+
+
+ +
+

Get List Of All Usernames (getUsernameList)Link

+

Retrieves a list of the user names in the database.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final HashSet<String> users = authManager.getUsernameList();
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/PermissionManager/index.html b/AuthSystem/PermissionManager/index.html new file mode 100755 index 0000000..b7b7865 --- /dev/null +++ b/AuthSystem/PermissionManager/index.html @@ -0,0 +1,1213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Permission Manager - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + + + + +
+
+ + + + + +

Permission ManagerLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authz.PermissionManager

+

The Permission Manager manages all role and user based permissions. +Permissions have a hierarchy and thus if a permission is assigned to a +user or role then all its child permissions are also assigned.

+

The Permission Manager has the following built in permissions:

+
    +
  • admin
  • +
  • edit
  • +
  • create
  • +
  • read
  • +
+

SetupLink

+

The Permission Manager is a singleton class and on first use is initialized automatically. +The following code can be used to retrieve the instance: +
1
final var manager = PermissionManager.getInstance();
+
+

+

Permission MethodsLink

+

Add New Custom Permission (addCustomPermission)Link

+

Adds new permission with the specified name and parent name, disabled by default.

+

To add a new custom permission, supply the following parameters:

+
    +
  • Name - The name of the permission to lookup
  • +
  • Parent Name - The name of the parent permission
  • +
+
+

Note

+

If you want the new permission to not have a parent and want it to be root level +then set the Parent Name to null or an empty string.

+
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.addCustomPermission("change_global_settings", "admin");
+
+
+ +
+

Add And Enable New Custom Permission (addAndEnableCustomPermission)Link

+

Adds new permission with the specified name and parent name, enabled by default.

+

To add a new custom permission, supply the following parameters:

+
    +
  • Name - The name of the permission to lookup
  • +
  • Parent Name - The name of the parent permission
  • +
+
+

Note

+

If you want the new permission to not have a parent and want it to be root level +then set the Parent Name to null or an empty string.

+
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.addAndEnableCustomPermission("change_global_settings", "admin");
+
+
+ +
+

Load Permissions (loadPermissions)Link

+

Loading permissions enables or disables permissions in bulk. +There is 3 ways of doing this, enable all, disable all or apply a user role's permissions.

+

Enable All PermissionsLink

+

Parameter must be true.

+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.loadPermissions(true);
+
+
+ +
+

Disable All PermissionsLink

+

Parameter must be false.

+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.loadPermissions(false);
+
+
+ +
+

Enable/Disable Based On User RoleLink

+

When run all permissions are disabled and then the permissions assigned to +the specified user role are enabled.

+

Parameter must be the name of a user role.

+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.loadPermissions("admin");
+
+
+ +
+

Remove Permission (removePermission)Link

+

Removes the specified permission.

+

To remove a permission, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.removePermission("admin");
+
+
+ +
+

Check If Permission Exists (doesPermissionExist)Link

+

Checks if the specified permission exists.

+

To check if a permission exists, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var permissionsManager = PermissionManager.getInstance();
+final var result = permissionsManager.doesPermissionExist("admin");
+if(result) MessageBox.show("Permission Exists!");
+else MessageBox.show("Permission Not Found!");
+
+
+ +
+

Enable Permission (enablePermission)Link

+

Enables the specified permission.

+

To enable a permission, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.enablePermission("admin");
+
+
+ +
+

Disable Permission (disablePermission)Link

+

Disables the specified permission.

+

To disable a permission, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+permissionsManager.disablePermission("admin");
+
+
+ +
+

Check If Permission Is Enabled (isPermissionEnabled)Link

+

Checks if the specified permission is enabled.

+

To check if a permission is enabled, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var permissionsManager = PermissionManager.getInstance();
+final var result = permissionsManager.isPermissionEnabled("admin");
+if(result) MessageBox.show("Permission Is Enabled!");
+else MessageBox.show("Permission Is Disabled!");
+
+
+ +
+

Check If Permission Is Disabled (isPermissionDisabled)Link

+

Checks if the specified permission is disabled.

+

To check if a permission is disabled, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var permissionsManager = PermissionManager.getInstance();
+final var result = permissionsManager.isPermissionDisabled("admin");
+if(result) MessageBox.show("Permission Is Disabled!");
+else MessageBox.show("Permission Is Enabled!");
+
+
+ +
+

Get List Of All Child Permissions (getPermissionChildren)Link

+

Retrieves an unmodifiable list of all the specified permission's child permissions.

+

To retrieve a list of all child permissions, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+final HashSet<String> children = permissionsManager.getPermissionChildren("admin");
+
+
+ +
+

Get List Of All Permissions (getPermissions)Link

+

Retrieves an unmodifiable list of all permissions.

+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+final Map<String, Permission> roles = permissionsManager.getPermissions();
+
+
+ +
+

Get List Of All Permission Names (getPermissionNames)Link

+

Retrieves an unmodifiable list of names of all permissions.

+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+final Set<String> names = permissionsManager.getPermissionNames();
+
+
+ +
+

Get Specific Permission (getPermission)Link

+

Retrieves the specified permission.

+

To retrieve a permission, supply the following parameter:

+
    +
  • Name - The name of the permission to lookup
  • +
+
+

Example

+
1
+2
final var permissionsManager = PermissionManager.getInstance();
+final UserRole role = permissionsManager.getPermission("admin");
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/SessionManager/index.html b/AuthSystem/SessionManager/index.html new file mode 100755 index 0000000..f5ce43b --- /dev/null +++ b/AuthSystem/SessionManager/index.html @@ -0,0 +1,1739 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Session Manager - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Session ManagerLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authc.SessionManager

+
+

Warning

+

This class is embedded in the AuthManager, +Subject, and UserManager classes +and is not meant to be accessed directly except in advanced use cases.

+To access the AuthManager's embedded SessionManager instance use the following code: +
1
+2
final var authManager = AuthManager.getNewInstance(db);
+final var sessionManager = authManager.getSessionManager();
+
+
+To access the UserManager's embedded SessionManager instance use the following code: +
1
+2
final var userManager = new UserManager(db);
+final var sessionManager = userManager.getSessionManager();
+
+

+
+

The Session Manager class contains all methods needed for managing +login sessions to allow users to login to your application. +This includes completing login via either using the UsernamePasswordToken +or requesting credentials from the user via a login dialog.

+

SetupLink

+

The Session Manager is not a singleton class so a new instance needs to be initialized. +Since the Session Manager is a low level class it also requires an instance +of the User Manager in addition to the database instance. +The following code can be used to create a new instance:

+
+

Example

+
1
+2
+3
+4
try(final var db = new Database("./mydb.db", DatabaseType.H2)) {
+    final var userManager = new UserManager(db);
+    final var sessionManager = new SessionManager(userManager);
+}
+
+
+ +
+

An icon path and program name may also be optionally provided as parameters to change the +icon and program name for all login dialogs.

+

Session ExplanationLink

+

A login Session is a temporary connection established by a user with a login, +until either the user or the application/service terminates the connection.

+

The user must only provide credentials for authentication at the start +of a login session. The user is then authorized to use some or all of the services +offered by the application/service depending on the permissions assigned to the user.

+

Within JUT there are two types of login sessions, single-user and multi-user. +All of the following documentation will be separated into two sections one +for each session type/context.

+

Single-User Session ContextLink

+

Single-User sessions are meant for frontend login to an application. +These sessions can either be initiated via a UsernamePasswordToken or +via a login dialog. Only one user can be logged in at one time thus meaning +only one session can be open at a time. Some of the methods that are part +of the Session Manager can only be used under a Single-User context.

+

Multi-User Session ContextLink

+

Multi-User sessions are meant for backend login to an application, usually +via a remote client software. These sessions can only be initiated +via a UsernamePasswordToken. Almost an unlimited amount of users can be logged in +at one time and is only dependant on system resources and can be limited +via the setMaxSessions method. Some of the methods that are part +of the Session Manager can only be used under a Multi-User context.

+

Single-Session MethodsLink

+

Get Logged-In Username (getLoggedInUsername)Link

+

Returns the username of the currently logged in user under the single session context.

+
+

Example

+
1
+2
final var sessionManager = new SessionManager(userManager);
+final String currentUsername = sessionManager.getLoggedInUsername();
+
+
+ +
+

Is Any User Logged-In (isUserLoggedIn)Link

+

Checks if a user is currently logged in under the single-user context.

+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.isUserLoggedIn();
+if(result) MessageBox.show("A user is logged-in!");
+else MessageBox.show("No user is logged-in!");
+
+
+ +
+

Is A Specific User Logged-In (isUserLoggedIn)Link

+

Checks if the specified user is currently logged in under the single-user context. +To check if a specific user is logged-in, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.isUserLoggedIn("admin");
+if(result) MessageBox.show("Admin user is logged-in!");
+else MessageBox.show("Admin user is not logged-in!");
+
+
+ +
+

Get Currently Logged-In User Session (getSession)Link

+

Retrieves the current session for the specified username, under the single-user context.

+
+

Example

+
1
+2
final var sessionManager = new SessionManager(userManager);
+final Session currentSession = sessionManager.getSession();
+
+
+ +
+

Get Specific User Session (getSession)Link

+

Retrieves the current session for the specified username, under the single-user context.

+

To retrieve a specific user session, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var sessionManager = new SessionManager(userManager);
+final Session session = sessionManager.getSession("admin");
+
+
+ +
+

Show Login Dialog (showLoginWindow)Link

+

Shows the login dialog window to log a user into the single-user context. +The method returns true if a user was logged in successfully. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.showLoginWindow(true);
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

Login A Specific User (loginUser)Link

+

Logs in a user, under the single-user context, with the specified username, +without checking for valid credentials.

+

To retrieve a specific user session, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Warning

+

This method does not validate credentials and should not be used except +in advanced use cases. A example case could be to login a user during unit testing. +The method showLoginWindow should be used instead. With this method +the user is immediately logged in as long as the user exists and other +checks pass (account unlocked, user role enabled and password not expired).

+
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.loginUser("admin");
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

Logout Current Logged-In User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in.

+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.logoutUser();
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Logout Specific User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in or if the specified user does not exist.

+

To logout a specific user, supply the following parameter:

+
    +
  • Username - The username of the account to logout
  • +
+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.logoutUser("admin");
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Get Currently Logged-In User's UserRole (getLoggedInUserRole)Link

+

Retrieves the user role of the currently logged in user under +the single user context. If no user is currently logged-in then this +method will return null.

+
+

Example

+
1
+2
final var sessionManager = new SessionManager(userManager);
+final UserRole result = sessionManager.getLoggedInUserRole();
+
+
+ +
+

Check If An Admin User Is Logged-In (isAdminLoggedIn)Link

+

Checks if an admin user is currently logged in under the single user context.

+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.isAdminLoggedIn();
+if(result) MessageBox.show("An Admin user is logged-in!");
+else MessageBox.show("An Admin user is not logged-in!");
+
+
+ +
+

Get Admin Login Override (getAdminOverride)Link

+

Requests an admin user to authenticate to override permissions by +showing the login dialog using the single session context. During this +process the admin user is not actually logged-in, instead just their +username, password and user role is verified. Returns true if +admin override succeeded and false if the cancel button was pressed +or if override failed. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.getAdminOverride();
+if(result) MessageBox.show("Admin override succedded!");
+else MessageBox.show("Admin override failed!");
+
+
+ +
+

Get User Login Verification (getUserVerification)Link

+

Requests that the currently logged in username to re-login using +the single session context. During this process the user is not +actually logged-in again, instead just their username and password is +verified. Returns true if the user verification succeeded and false +if the cancel button was pressed or if override failed. +Fires either the sessionLoginSuccess or the sessionLoginFailure event +allowing the getUser method to be called by the assigned EventHandler. +If the user does not exist, getUser will return null.

+

To show the login dialog, supply the following parameter:

+
    +
  • true/false - If true, if during the login process an error occurs +the login dialog will show again listing the error text above the +username field. If false, if during the login process an error occurs +the entire method will return false.
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.getUserVerification();
+if(result) MessageBox.show("User verification succedded!");
+else MessageBox.show("User verification failed!");
+
+
+ +
+

Require That Admin Is Logged-In (requireAdmin)Link

+

Checks that the logged-in user, under the single session context, +is an admin and if not, requests an admin override. +During this process the user is not actually logged-in again, +instead their username, password and user role is just verified.

+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.requireAdmin();
+if(result) MessageBox.show("Admin check passed!");
+else MessageBox.show("Admin check failed!");
+
+
+ +
+

Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin)Link

+

Checks that the logged-in user, under the single session context, +is an admin, if true, prompts the admin to re-login and +if false, requests an admin override. +During this process the user is not actually logged-in again, +instead their username, password and user role is just verified.

+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.requireAdmin();
+if(result) MessageBox.show("Admin check passed!");
+else MessageBox.show("Admin check failed!");
+
+
+ +
+

Multi-Session MethodsLink

+

Is A Specific User Logged-In (isUserLoggedIn)Link

+

Checks if the specified user is currently logged in under the multi-user context. +To check if a specific user is logged-in, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.isUserLoggedIn("admin", true);
+if(result) MessageBox.show("Admin user is logged-in!");
+else MessageBox.show("Admin user is not logged-in!");
+
+
+ +
+

Get Max Allowed Sessions (getMaxSessions)Link

+

Retrieves the maximum number of allowed sessions, +under the multi session context, before login is disabled.

+
+

Example

+
1
+2
+3
final var sessionManager = new SessionManager(userManager);
+final int result = sessionManager.getMaxSessions();
+MessageBox.show("The max number of allowed sessions is " + result + '!');
+
+
+ +
+

Set Max Allowed Sessions (setMaxSessions)Link

+

Sets the maximum number of allowed sessions, +under the multi session context, before login is disabled. +To disable the limit set the value to a negative number. +To set the maximum number of allowed sessions, supply the following parameter:

+
    +
  • value - The number of allowed sessions to set
  • +
+
+

Example

+
1
+2
+3
+4
+5
final var sessionManager = new SessionManager(userManager);
+//Set max sessions to 30.
+sessionManager.setMaxSessions(30);
+//Block all session creation by setting to 0
+sessionManager.setMaxSessions(0);
+
+
+ +
+
+

Note

+

Setting this value to a negative number will disable the limit +because a negative amount of sessions can never be created. +When the SessionManager is initialized the value is initially set to -1.

+
+

Get Session Count (getSessionsCount)Link

+

Retrieves the current number of logged in sessions under the multi-user context.

+
+

Example

+
1
+2
+3
final var sessionManager = new SessionManager(userManager);
+final int result = sessionManager.getSessionsCount();
+MessageBox.show("The max number of logged-in sessions is " + result + '!');
+
+
+ +
+

Get All Sessions (getSessions)Link

+

Retrieves the current logged in sessions as a HashMap under the multi session context. +The returned HashMap key is the session username and the value is the related Session object.

+
+

Example

+
1
+2
+3
final var sessionManager = new SessionManager(userManager);
+final Map<String, Session> sessions = sessionManager.getSessions();
+MessageBox.show("The max number of logged-in sessions is " + sessions.size() + '!');
+
+
+ +
+

Get Specific User Session (getSession)Link

+

Retrieves the current session for the specified username, under the multi-user context.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Example

+
1
+2
final var sessionManager = new SessionManager(userManager);
+final Session session = sessionManager.getSession("admin", true);
+
+
+ +
+

Login A Specific User (loginUser)Link

+

Logs in a user, under the multi-user context, with the specified username, +without checking for valid credentials.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Warning

+

This method does not validate credentials and should be used carefully. +With this method the user is immediately logged in as long as the user +exists and other checks pass (account unlocked, user role enabled and +password not expired). An example is listed below on how to implement this.

+
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.loginUser("admin", true);
+if(result) MessageBox.show("User was logged-in successfully!");
+else MessageBox.show("User login failed!");
+
+
+ +
+

This example adds password checking to verify credentials before login:

+
+

Example

+
1
+2
+3
+4
+5
+6
+7
final var userManager = new UserManager(db);
+final var sessionManager = new SessionManager(userManager);
+if(userManager.checkPasswordMatches("admin", "1234")) {
+    final boolean result = sessionManager.loginUser("admin", true);
+    if(result) MessageBox.show("User was logged-in successfully!");
+    else MessageBox.show("User login failed!");
+} else MessageBox.show("User login failed!");
+
+
+ +
+

Logout Specific User (logout)Link

+

Logs out the specified user from the single session context +and clears any set permissions. This method will return false +if no user is currently logged-in or if the specified user does not exist.

+

To logout a specific user, supply the following parameters:

+
    +
  • Username - The username of the account to logout
  • +
  • true - The true boolean is required to operate under the multi-user context
  • +
+
+

Caution

+

If the user was deleted from the database while logged in, then +the getUser event method that is accessible from the +assigned event handler will return null.

+
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.logoutUser("admin");
+if(result) MessageBox.show("User was logged-out successfully!");
+else MessageBox.show("User logout failed!");
+
+
+ +
+

Other MethodsLink

+

Is New Session Allowed (isNewSessionAllowed)Link

+

Checks if creation of a new session for the specified username is allowed +under the specified context. This method checks to see if the specified user +is already logged-in and if the second parameter is true checks to see if the +max sessions limit has been reached.

+

To retrieve a specific user session, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • true/false - The true for the multi-user context, false for the single-user context
  • +
+
+

Example

+
1
+2
+3
+4
final var sessionManager = new SessionManager(userManager);
+final boolean result = sessionManager.isNewSessionAllowed("admin", true);
+if(result) MessageBox.show("New User Session Is Allowed For Admin!");
+else MessageBox.show("New User Session Is Not Allowed For Admin!");
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/Subject/index.html b/AuthSystem/Subject/index.html new file mode 100755 index 0000000..fa21569 --- /dev/null +++ b/AuthSystem/Subject/index.html @@ -0,0 +1,2033 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Subject - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

SubjectLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authc.Subject

+

A Subject is just fancy security term that basically means a security-specific ‘view’ of an application user. +In JUT the Subject object handles the management of one specific user account. +The subject allows management of the user settings, role, permissions, and sessions.

+

SetupLink

+

A Subject object instance can be created by providing an instance of the Auth Manager or by +calling the getSubject method on the Auth Manager. Multiple subject instances can exist but multiple +instances are only useful if using the multi-user context.

+

Create New Instance Via AuthManagerLink

+
1
+2
final var manager = AuthManager.getInstance();
+final Subject subject = manager.getSubject();
+
+
+ +

Create New Instance Via New Subject ObjectLink

+
1
+2
final var manager = AuthManager.getInstance();
+final Subject subject = new Subject(manager);
+
+
+ +

General Subject MethodsLink

+

Login User (login)Link

+

A new instance of a subject is considered anonymous until a user is logged-in. +A subject login requires a UsernamePasswordToken to pass in the user's credentials. +For security reasons, passwords supplied to the UsernamePasswordToken must be converted to a char array.

+

There is 4 methods supplied for logging in a user:

+

Login Under Single-User ContextLink

+

To login a user, supply the following parameter:

+
    +
  • Token - The UsernamePasswordToken containing user credentials
  • +
+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+final var token = new UsernamePasswordToken("admin", "1234".toCharArray());
+final boolean result = subject.login(token);
+if(result) MessageBox.show("Login Succeeded!");
+else MessageBox.show("Login Failed!");
+
+
+ +
+

Login Under Either ContextLink

+

To login a user, supply the following parameters:

+
    +
  • Token - The UsernamePasswordToken containing user credentials
  • +
  • True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context
  • +
+

Multi-User Context Example:

+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+final var token = new UsernamePasswordToken("admin", "1234".toCharArray());
+final boolean result = subject.login(token, true);
+if(result) MessageBox.show("Login Succeeded!");
+else MessageBox.show("Login Failed!");
+
+
+ +
+

Login Under Single-User Context With Previous TokenLink

+

For previous token to be saved, setRememberMe needs to be set to true during token creation. +Also if no token is saved CredentialsException will be thrown. +To login a user, no parameters are needed.

+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+final var token = new UsernamePasswordToken("admin", "1234".toCharArray());
+final boolean result = subject.login();
+if(result) MessageBox.show("Login Succeeded!");
+else MessageBox.show("Login Failed!");
+
+
+ +
+

Login Under Either Context With Previous TokenLink

+

For previous token to be saved, setRememberMe needs to be set to true during token creation. +Also if no token is saved CredentialsException will be thrown. +To login a user, supply the following parameters:

+
    +
  • True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context
  • +
+

Multi-User Context Example:

+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+final var token = new UsernamePasswordToken("admin", "1234".toCharArray());
+final boolean result = subject.login(true);
+if(result) MessageBox.show("Login Succeeded!");
+else MessageBox.show("Login Failed!");
+
+
+ +
+

Logout User (logout)Link

+

When logging out a user, unless the setRememberMe is set to true during the token +creation, the subject username and token are cleared thus making the subject anonymous again. +This method will return false if the user is not already logged-in.

+

There is 4 methods supplied for logging out a user:

+

Logout Under Single-User ContextLink

+

To logout a user, no parameters are needed.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.logout();
+if(result) MessageBox.show("Logout Succeeded!");
+else MessageBox.show("Logout Failed!");
+
+
+ +
+

Logout Under Either ContextLink

+

To logout a user, supply the following parameter:

+
    +
  • True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context
  • +
+

Multi-User Context Example:

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.login(true);
+if(result) MessageBox.show("Logout Succeeded!");
+else MessageBox.show("Logout Failed!");
+
+
+ +
+

Get Last Session Duration Time (getLastSessionDuration)Link

+

When a session is opened a timer starts recording the duration the session was open. +This duration can be retrieved after a session is closed with the subject.

+

There is 3 methods supplied for returning this value:

+

Return Duration ObjectLink

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final Duration duration = subject.getLastSessionDuration();
+
+
+ +
+

Return Text String With MillisecondsLink

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final String duration = subject.getLastSessionDurationStringFull();
+
+
+ +
+

Return Text String Without MillisecondsLink

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final String duration = subject.getLastSessionDurationString();
+
+
+ +
+

Check If Subject Is Anonymous (isAnonymous)Link

+

Checks if the subject is anonymous.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isAnonymous();
+if(result) MessageBox.show("Subject Is Anonymous!");
+else MessageBox.show("Subject Is Not Anonymous!");
+
+
+ +
+

Check If Subject Is Authenticated Under Single-User Context (isAuthenticated)Link

+

Checks if the subject is anonymous.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isAuthenticated();
+if(result) MessageBox.show("Subject Is Anonymous!");
+else MessageBox.show("Subject Is Not Anonymous!");
+
+
+ +
+

Check If Subject Is Authenticated Under Either Context (isAuthenticated)Link

+

Checks if the subject is anonymous.

+

To check status, supply the following parameter:

+
    +
  • True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context
  • +
+

Multi-User Context Example:

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isAuthenticated(true);
+if(result) MessageBox.show("Subject Is Anonymous!");
+else MessageBox.show("Subject Is Not Anonymous!");
+
+
+ +
+

Get Current Logged-In Session Under Single-User Context (getSession)Link

+

Retrieves the current logged in session or returns null if no session is open.

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final Session session = subject.getSession();
+
+
+ +
+

Get Current Logged-In Session Under Either Context (getSession)Link

+

Retrieves the current logged in session or returns null if no session is open.

+

To retrieve the current session, supply the following parameter:

+
    +
  • True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context
  • +
+

Multi-User Context Example:

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final Session session = subject.getSession(true);
+
+
+ +
+

Check If Username And Token Are Remembered (isRemembered)Link

+

Checks to see if the username and token are set to be saved after logout. +For credentials to be saved, setRememberMe needs to be set to true during token creation.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isRemembered();
+if(result) MessageBox.show("Subject Credentials Is Remembered!");
+else MessageBox.show("Subject Credentials Is Not Remembered!");
+
+
+ +
+

User Management MethodsLink

+

Get Current Username (getUsername)Link

+

Retrieves the current username. Returns null if the subject is anonymous.

+
+

Example

+
1
+2
+3
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.getUsername();
+MessageBox.show("The Current Username Is " + result + '!');
+
+
+ +
+

Set New Password (setPassword)Link

+

Sets a new password for the current user.

+

To set a new password, supply the following parameter:

+
    +
  • Password - The new password to set
  • +
+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+subject.setPassword("pass");
+
+
+ +
+

Get Current User Role (getUserRole)Link

+

Retrieves the UserRole object assigned to the current user.

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+final UserRole role = subject.getUserRole();
+
+
+ +
+

Set User Role (setUserRole)Link

+

Sets the user role assigned to the specified user. +To set the user role, supply the following parameter:

+
    +
  • User Role - The user role of the new account
  • +
+

The user role can be a text string or one of the +items from the UserRoleManager.SystemUserRoles enum.

+

The UserRoleManager.SystemUserRoles list contains:

+
    +
  • ADMIN
  • +
  • AUTHOR
  • +
  • EDITOR
  • +
  • BASIC
  • +
  • NONE
  • +
+
+

Note

+

The NONE user role can never have permissions assigned to it. +Using the NONE user role is a quick way to remove all permissions from a user.

+
+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+subject.setUserRole(UserRoleManager.SystemUserRoles.ADMIN);
+
+
+ +
+

Check If User Has Permission (hasPermission)Link

+

Checks if the current username has the specified permission.

+

To check for the permission, supply the following parameter:

+
    +
  • Permission - The name of the permission to check
  • +
+

The permission manager has the following built in permissions:

+
    +
  • admin
  • +
  • edit
  • +
  • create
  • +
  • read
  • +
+

Single PermissionLink

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.hasPermission("admin");
+if(result) MessageBox.show("User Has Admin Permission!");
+else MessageBox.show("User Does Not Have Admin Permission!");
+
+
+ +
+

HashSet Of PermissionsLink

+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+final HashSet<String> list = new HashSet<>(Arrays.asList("admin", "edit"));
+final boolean result = subject.hasPermissions(list);
+if(result) MessageBox.show("User Has Specified Permissions!");
+else MessageBox.show("User Does Not Have Specified Permissions!");
+
+
+ +
+

Comma Separated list Of Permissions:Link

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.hasPermissions("admin", "edit");
+if(result) MessageBox.show("User Has Specified Permissions!");
+else MessageBox.show("User Does Not Have Specified Permissions!");
+
+
+ +
+

Get Account Creation Date (getUserCreationDate)Link

+

Returns the date and time the user was initially created.

+

There is two methods to retrieving the user creation date. +The date can either be returned as a LocalDateTime object or as a formatted string.

+

LocalDateTime ObjectLink

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+final LocalDateTime result = subject.getUserCreationDate();
+MessageBox.show("Account Was Created On " + result.format(formatter));
+
+
+ +
+

Formatted String ObjectLink

+

To retrieve the user creation date, supply the following parameter:

+
    +
  • Format - The string that represents the format to return the date
  • +
+
+

Example

+
1
+2
+3
final var subject = AuthManager.getInstance().getSubject();
+final String result = subject.getUserCreationDate("yyyy-MM-dd HH:mm");
+MessageBox.show("Account Was Created On " + result);
+
+
+ +
+

Check If User Is Locked (isUserLocked)Link

+

A locked user account prevents login and prevents any new sessions +to be opened for the user. Locking an user account may be needed for numerous reasons.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isUserLocked();
+if(result) MessageBox.show("Admin Account Is Locked!");
+else MessageBox.show("Admin Account Is Unlocked!");
+
+
+ +
+

Lock/Unlock A User (lockUser and unlockUser)Link

+

A locked user account prevents login and prevents any new sessions +to be opened for the user. Locking an user account may be needed for numerous reasons.

+
+

Example

+
1
+2
+3
+4
+5
final var subject = AuthManager.getInstance().getSubject();
+//Lock The Account
+subject.lockUser();
+//Unlock The Account
+subject.unlockUser();
+
+
+ +
+

Check If Password Is Expired (isPasswordExpired)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isPasswordExpired();
+if(result) MessageBox.show("Admin Account Password Is Expired!");
+else MessageBox.show("Admin Account Password Is Not Expired!");
+
+
+ +
+

Check If Password Has Expiration Date (isPasswordSetToExpire)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.isPasswordSetToExpire();
+if(result) MessageBox.show("Admin Account Password Has An Expiration Date!");
+else MessageBox.show("Admin Account Password Does Not Have An Expiration Date!");
+
+
+ +
+

Get Password Expiration Date (getPasswordExpirationDate)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

There is two methods to retrieving the password expiration date. +The date can either be returned as a LocalDateTime object or as a formatted string.

+
+

Note

+

If the expiration date has been disabled or was never enabled this method will +still return an expiration date. For logistical database reasons a date still +has to be set. So the date will be set to 1000 years after the user account +was created or 1000 years after the date when the password expiration date +was last disabled. This number can be updated if any bugs occur but it seems +like 1000 years is far enough in the future to not cause any problems.

+
+

LocalDateTime ObjectLink

+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+final LocalDateTime result = subject.getPasswordExpirationDate();
+MessageBox.show("Admin Account Password Expires At " + result.format(formatter));
+
+
+ +
+

Formatted String ObjectLink

+

To retrieve the password expiration date, supply the following parameter:

+
    +
  • Format - The string that represents the format to return the date
  • +
+
+

Example

+
1
+2
+3
final var subject = AuthManager.getInstance().getSubject();
+final String result = subject.getPasswordExpirationDate("yyyy-MM-dd HH:mm");
+MessageBox.show("Admin Account Password Expires At " + result);
+
+
+ +
+

Set Password Expiration Date (setPasswordExpirationDate)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To set a password expiration date, supply the following parameter:

+
    +
  • Expiration Date - A LocalDateTime object representing the expiration date
  • +
+
+

Example

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
final var subject = AuthManager.getInstance().getSubject();
+//Sets the date to now
+subject.setPasswordExpirationDate(LocalDateTime.now());
+//Sets the date to 30 days from today
+subject.setPasswordExpirationDate(LocalDateTime.now().plusDays(30));
+//First Method To Set the date to January 1st, 2019 at 8am
+subject.setPasswordExpirationDate(LocalDateTime.of(2019, 1, 1, 8, 0));
+//Second Method To Set the date to January 1st of 2019 at 8am
+subject.setPasswordExpirationDate(LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0));
+//Third Method To Set the date to January 1st of 2019 at 8am
+final String str = "2019-01-01 08:00";
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+subject.setPasswordExpirationDate(LocalDateTime.parse(str, formatter));
+
+
+ +
+

Disable Password Expiration (disablePasswordExpiration)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+
+

Example

+
1
+2
final var subject = AuthManager.getInstance().getSubject();
+authManager.disablePasswordExpiration();
+
+
+ +
+

Check If Password Matches (checkPasswordMatches)Link

+

This method allows you to check if the supplied password matches +the user's stored password in the database. +To verify the password, supply the following parameter:

+
    +
  • Password - The password to verify
  • +
+
+

Example

+
1
+2
+3
+4
final var subject = AuthManager.getInstance().getSubject();
+final boolean result = subject.checkPasswordMatches("1234");
+if(result) MessageBox.show("Password Matches!");
+else MessageBox.show("Password Does Not Match!");
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/UserManager/index.html b/AuthSystem/UserManager/index.html new file mode 100755 index 0000000..35a3b83 --- /dev/null +++ b/AuthSystem/UserManager/index.html @@ -0,0 +1,1243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User Manager - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + + + + +
+
+ + + + + +

User ManagerLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authc.UserManager

+
+

Warning

+

This class is embedded in the AuthManager +and Subject classes and is not meant to be +accessed directly except in advanced use cases.

+To access the AuthManager's embedded UserManager instance use the following code: +
1
+2
final var authManager = AuthManager.getNewInstance(db);
+final var userManager = authManager.getUserManager();
+
+

+
+

The User Manager manages all user accounts in the database. +This is where all the native SQL code is automatically +generated using the Database Builder classes.

+

SetupLink

+

The User Manager is not a singleton class so a new instance needs to be initialized. +When a new instance is created a "users" table is automatically created in the specified database. +The following code can be used to create a new instance:

+
+

Example

+
1
+2
+3
try(final var db = new Database("./mydb.db", DatabaseType.H2)) {
+    final var userManager = new UserManager(db);
+}
+
+
+ +
+

An icon path and program name may also be optionally provided as parameters to change the +icon and program name for all login dialogs.

+

User Account MethodsLink

+

Create A New User (createUser)Link

+

To create a new user use the createUser method supplying the following parameters:

+
    +
  • Username - The username of the new account
  • +
  • Password - The password of the new account
  • +
  • User Role - The user role of the new account
  • +
+

The user role can be a text string or one of the +items from the UserRoleManager.SystemUserRoles enum.

+

The UserRoleManager.SystemUserRoles list contains:

+
    +
  • ADMIN
  • +
  • AUTHOR
  • +
  • EDITOR
  • +
  • BASIC
  • +
  • NONE
  • +
+
+

Note

+

The NONE user role can never have permissions assigned to it. +Using the NONE user role is a quick way to remove all permissions from a user.

+
+
+

Example

+
1
+2
+3
final var userManager = new UserManager(db);
+userManager.createUser("admin", "1234", UserRoleManager.SystemUserRoles.ADMIN);
+userManager.createUser("editor", "1234", UserRoleManager.SystemUserRoles.EDITOR);
+
+
+ +
+

Delete An Existing User (deleteUser)Link

+

To delete an existing user use the deleteUser method supplying the following parameter:

+
    +
  • Username - The username of the account to delete
  • +
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+userManager.deleteUser("admin");
+
+
+ +
+

Get Username Object (getUser)Link

+

Retrieves a readonly immutable UserAccount object. +To retrieve the object, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+final UserAccount user = userManager.getUser("admin");
+
+
+ +
+

Check If User Exists (userExists)Link

+

Checks to see if the specified user account exists. +To check a user account, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
+3
+4
final var userManager = new UserManager(db);
+final boolean result = userManager.userExists("admin");
+if(result) MessageBox.show("Admin User Exists!");
+else MessageBox.show("Admin User Does Not Exist!");
+
+
+ +
+

Get User Role (getUserRole)Link

+

Retrieves the UserRole object assigned to the specified user. +To retrieve the object, supply the following parameter:

+
    +
  • Username - The username of the account to lookup
  • +
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+final UserRole userRole = userManager.getUserRole("admin");
+
+
+ +
+

Set User Role (getUserRole)Link

+

Sets the user role assigned to the specified user. +To set the user role, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • User Role - The user role of the new account
  • +
+

The user role can be a text string or one of the +items from the UserRoleManager.SystemUserRoles enum.

+

The UserRoleManager.SystemUserRoles list contains:

+
    +
  • ADMIN
  • +
  • AUTHOR
  • +
  • EDITOR
  • +
  • BASIC
  • +
  • NONE
  • +
+
+

Note

+

The NONE user role can never have permissions assigned to it. +Using the NONE user role is a quick way to remove all permissions from a user.

+
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+userManager.setUserRole("admin", UserRoleManager.SystemUserRoles.ADMIN);
+
+
+ +
+

Set User Password (setPassword)Link

+

Sets the password assigned to the specified user. +To set the new password, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Password - The new password to set
  • +
+
+

Note

+

If you want to prevent a user from setting an empty password +or to check for password complexity requirements those checks need +to be implemented separately. This method allows empty passwords. +Even if the password is empty, the empty password is still encrypted +with a random secure salt just like any supplied password would be.

+
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+userManager.setPassword("admin", "newPass");
+
+
+ +
+

Check If Password Matches (checkPasswordMatches)Link

+

This method allows you to check if the supplied password matches +the user's stored password in the database. +To verify the password, supply the following parameters:

+
    +
  • Username - The username of the account to lookup
  • +
  • Password - The password to verify
  • +
+
+

Example

+
1
+2
+3
+4
final var userManager = new UserManager(db);
+final boolean result = userManager.checkPasswordMatches("admin", "1234");
+if(result) MessageBox.show("Password Matches!");
+else MessageBox.show("Password Does Not Match!");
+
+
+ +
+

Lock/Unlock A User Account(setLockStatus)Link

+

A locked user account prevents login and prevents any new sessions +to be opened for the user. Locking an user account may be needed for numerous reasons.

+

To lock and unlock an account, supply the following parameters:

+
    +
  • Username - The username of the account to lock/unlock
  • +
  • true/false - The value to set, true to lock, false to unlock
  • +
+
+

Example

+
1
+2
+3
+4
+5
final var userManager = new UserManager(db);
+//Lock The Account
+userManager.setLockStatus("admin", true);
+//Unlock The Account
+userManager.setLockStatus("admin", false);
+
+
+ +
+

Set User Password Expiration Date (setPasswordExpirationDate)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To set a password expiration date, supply the following parameters:

+
    +
  • Username - The username of the account to update
  • +
  • Expiration Date - A LocalDateTime object representing the expiration date
  • +
+
+

Example

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
final var userManager = new UserManager(db);
+//Sets the date to now
+userManager.setPasswordExpirationDate("admin", LocalDateTime.now());
+//Sets the date to 30 days from today
+userManager.setPasswordExpirationDate("admin", LocalDateTime.now().plusDays(30));
+//First Method To Set the date to January 1st, 2019 at 8am
+userManager.setPasswordExpirationDate("admin", LocalDateTime.of(2019, 1, 1, 8, 0));
+//Second Method To Set the date to January 1st of 2019 at 8am
+userManager.setPasswordExpirationDate("admin", LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0));
+//Third Method To Set the date to January 1st of 2019 at 8am
+final String str = "2019-01-01 08:00";
+final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+userManager.setPasswordExpirationDate("admin", LocalDateTime.parse(str, formatter));
+
+
+ +
+

Disable Password Expiration (disablePasswordExpiration)Link

+

Setting a password to expire after a specified date allows the prevention of login and +new session creation if the password is expired. Setting a password to expire could +be used to force regular password changes or allow for temporary accounts to be made.

+

To disable password expiration for a user, supply the following parameter:

+
    +
  • Username - The username of the account to update
  • +
+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+userManager.disablePasswordExpiration("admin");
+
+
+ +
+

Other MethodsLink

+

Get All Username Objects (getUsersList)Link

+

The getUsersList method retrieves a readonly immutable UserAccount object for each user +account and returns the list as a HashSet.

+
+

Example

+
1
+2
final var userManager = new UserManager(db);
+final HashMap<UserAccount> users = userManager.getUsersList();
+
+
+ +
+

Get List Of All Usernames (getUsernameList)Link

+

Retrieves a list of the user names in the database.

+
+

Example

+
1
+2
final var authManager = AuthManager.getInstance();
+final HashSet<String> users = authManager.getUsernameList();
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/UserRoleManager/index.html b/AuthSystem/UserRoleManager/index.html new file mode 100755 index 0000000..8cf1d04 --- /dev/null +++ b/AuthSystem/UserRoleManager/index.html @@ -0,0 +1,898 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User Role Manager - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + + + + +
+
+ + + + + +

User Role ManagerLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.authc.UserRoleManager

+

The User Role Manager class contains all methods needed for managing +User Roles that can be assigned to a User Account.

+

User Role ExplanationLink

+

Role-based Access Control (RBAC) is a common approach to restricting system access to authorized users. +A user role defines permissions for a user to perform a group of tasks. +Although every role has a predefined set of permissions, +new permissions can be added and removed from each role. +New custom roles can also be created as a new role or a copy of an existing role.

+

The base permissions are (Descriptions are based on a CMS implementation and are just examples):

+
    +
  • Admin - Allows changes to system settings.
  • +
  • Edit - Allows editing of all content even other user's content.
  • +
  • Create - Allows creation of new content and editing of own content.
  • +
  • Read - Allows viewing of all content.
  • +
+

The base user roles are (Descriptions are based on a CMS implementation and are just examples):

+
    +
  • Admin(Admin, Edit, Create, Read) - Has all permissions.
  • +
  • Editor(Edit, Create, Read) - Can create and edit all content but not change system settings.
  • +
  • Author(Create, Read) - Can create new content but not edit other users content.
  • +
  • Basic(Read) - Can read all content but not create or edit content.
  • +
  • None() - Has no permissions.
  • +
+
+

Note

+

Currently JUT is designed to allow a user to be assigned only one user role. +This will be changing in future releases to allow for assignment of multiple roles.

+
+

SetupLink

+

The User Role Manager is a singleton class and on first use is initialized automatically. +The following code can be used to retrieve the instance: +
1
final var manager = UserRoleManager.getInstance();
+
+

+

User Role Manager MethodsLink

+

Create A New User Role (createUserRole)Link

+

To create a new user role use the createUserRole method supplying the following parameter:

+
    +
  • Name - The name of the new user role
  • +
+
+

Note

+

When using this method the UserRole object related to the new user role is returned. +If a user role already exists with the specified name the already existing UserRole +object is returned instead.

+
+
+

Example

+
1
+2
+3
final var userRoleManager = UserRoleManager.getInstance();
+final var newRole = userRoleManager.createUserRole("moderator");
+newRole.modify().add("edit", "create", "read");
+
+
+ +
+

Add Existing User Role (addExistingUserRole)Link

+

You can manually create a new UserRole object and directly add that to the list. +To add an existing user role use the addExistingUserRole method supplying the following parameter:

+
    +
  • UserRole - The UserRole object to add
  • +
+
+

Example

+
1
+2
+3
+4
final var userRoleManager = UserRoleManager.getInstance();
+final UserRole role = new UserRole("moderator");
+role.modify().add("edit", "create", "read");
+userRoleManager.addExistingUserRole(role);
+
+
+ +
+

Get List Of All Installed User Roles (getUserRoles)Link

+

Retrieves an unmodifiable list of all user roles.

+
+

Example

+
1
+2
final var userRoleManager = UserRoleManager.getInstance();
+final Map<String, UserRole> roles = userRoleManager.getUserRoles();
+
+
+ +
+

Get Specific User Role (getUserRole)Link

+

Retrieves the specified user role.

+

To retrieve a user role use the getUserRole method supplying the following parameter:

+
    +
  • Name - The name of the User Role to lookup
  • +
+
+

Example

+
1
+2
final var userRoleManager = UserRoleManager.getInstance();
+final UserRole role = userRoleManager.getUserRole("admin");
+
+
+ +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/AuthSystem/index.html b/AuthSystem/index.html new file mode 100755 index 0000000..23dff36 --- /dev/null +++ b/AuthSystem/index.html @@ -0,0 +1,733 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Intoduction - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Auth System DocumentationLink

+

IntroductionLink

+

Package Names:

+ +

The JUT Auth System is a set of classes that allow for authentication and authorization. +This system uses the Database class to connect to a database to store all account info.

+

FeaturesLink

+
    +
  • Auth Manager
      +
    • Contains all methods needed for controlling the Auth System.
    • +
    +
  • +
  • Permission Manager
      +
    • Manages permissions to be used to enable or disable parts of your application.
    • +
    +
  • +
  • Subject
      +
    • Manages all tasks related to the currently logged in user account.
    • +
    +
  • +
  • Session Manager
      +
    • Manages all login sessions to allow users to login to your application.
    • +
    +
  • +
  • User Manager
      +
    • Manages all user accounts in the database.
    • +
    +
  • +
  • User Role Manager
      +
    • Manages all user account roles.
    • +
    +
  • +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/DatabaseTools/index.html b/DatabaseTools/index.html new file mode 100755 index 0000000..f00f0a6 --- /dev/null +++ b/DatabaseTools/index.html @@ -0,0 +1,766 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Database Tools - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Database Tools DocumentationLink

+

IntroductionLink

+

Package Names:

+ +

Contains tools to communicate with a database using JDBC. +The goal behind this class is to allow connection with the +database and creation of auto-generated SQL statements so manually +creating native SQL code is not needed. This includes initial table creation +which is not normally included in most database frameworks.

+

Supported DatabasesLink

+ +

SQL Statement BuildersLink

+
    +
  • ColumnBuilder
      +
    • Used for creating a database table column.
    • +
    +
  • +
  • DeleteBuilder
      +
    • Used for creating a DELETE sql statement to delete a row from a table.
    • +
    +
  • +
  • IndexBuilder
      +
    • Used for creating a CREATE sql statement to create a new table index.
    • +
    +
  • +
  • InsertBuilder
      +
    • Used for creating an INSERT sql statement to add a row to a table.
    • +
    +
  • +
  • QueryBuilder
      +
    • Used for creating a SELECT sql statement to query the database.
    • +
    +
  • +
  • TableBuilder
      +
    • Used for creating an CREATE sql statement to create a new table.
    • +
    +
  • +
  • UpdateBuilder
      +
    • Used for creating an UPDATE sql statement to update a row in a table.
    • +
    +
  • +
  • WhereBuilder
      +
    • Used for creating a WHERE sql statement to set a constraint on another statement.
    • +
    +
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/Dialogs/index.html b/Dialogs/index.html new file mode 100755 index 0000000..cfadf01 --- /dev/null +++ b/Dialogs/index.html @@ -0,0 +1,728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dialogs - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Dialogs DocumentationLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.dialogs

+

Contains JavaFX dialogs to use in your application. +Platform.runLater is not needed to be called since all dialogs use a +wrapper class that automatically calls runLater if it is needed.

+

FeaturesLink

+
    +
  • LoginDialog
      +
    • Creates a Login Dialog for use to authenticate passwords. +Allows for display of error message in case of login failure.
    • +
    +
  • +
  • MessageBox
      +
    • Displays message box with specified options.
    • +
    +
  • +
  • FXMLDialogWrapper
      +
    • Allows custom creation of a dialog using a specified JavaFX +fxml file.
    • +
    +
  • +
+
+

Note

+

The MessageBox.Show() method is used throughout this documentation to show messages + for demo example purposes. These code statements are not required for the example + to function.

+
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/EventManagement/index.html b/EventManagement/index.html new file mode 100755 index 0000000..61df55c --- /dev/null +++ b/EventManagement/index.html @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Event Management - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Event Management DocumentationLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.events

+

Contains classes to manage custom events. +All events are managed through the Event Manager class.

+
+

Note

+

The JavaFX EventHandler class is not the same as the included +EventHandler class and is not compatible with the JUT event system.

+
+

FeaturesLink

+
    +
  • Registration and firing events
  • +
  • Creation of event handlers to handle fired events
  • +
  • The ability to pass arguments to event handlers
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/HWInfo/index.html b/HWInfo/index.html new file mode 100755 index 0000000..7f7eab8 --- /dev/null +++ b/HWInfo/index.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HWInfo - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

HWInfo DocumentationLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.HWInfo

+

The HWInfo class returns information about the currently installed hardware.

+

FeaturesLink

+
    +
  • BIOS
      +
    • Returns information about the system BIOS.
    • +
    +
  • +
  • Network
      +
    • Returns information about the current network.
    • +
    +
  • +
  • OEM
      +
    • Returns information about the system manufacturer.
    • +
    +
  • +
  • Processor
      +
    • Returns information about the system processor.
    • +
    +
  • +
  • RAM
      +
    • Returns information about the system RAM.
    • +
    +
  • +
  • Storage
      +
    • Returns information about the system storage.
    • +
    +
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/OSInfo/index.html b/OSInfo/index.html new file mode 100755 index 0000000..f1bb704 --- /dev/null +++ b/OSInfo/index.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSInfo - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

OSInfo DocumentationLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.OSInfo

+

The OSInfo class returns information about the current operating system.

+

FeaturesLink

+
    +
  • Architecture
      +
    • Determines if the current application is 32 or 64-bit.
    • +
    +
  • +
  • Name
      +
    • Returns the name of the operating system running on this Computer.
    • +
    • ComputerNameActive and ComputerNamePending returns the computer network name.
    • +
    +
  • +
  • Windows
      +
    • Returns information about the current Windows installation.
    • +
    +
  • +
  • CheckIf
      +
    • Returns boolean value checks.
        +
      • is32BitOS - Identifies if OS is a 32 Bit OS.
      • +
      • is64BitOS - Identifies if OS is a 64 Bit OS.
      • +
      • isLinux - Identifies if OS is a distro of Linux.
      • +
      • isMac - Identifies if OS is MacOSX.
      • +
      • isSolaris - Identifies if OS is Solaris.
      • +
      • isWindows - Identifies if OS is Windows.
      • +
      +
    • +
    +
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 9d7180b..0000000 --- a/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# JavaUltimateTools-Docs -This is the repository for the JUT documentation site. - -The documentation is currently hosted at: https://javatools.jgcomptech.com - -NOTE: This documentation is still WIP and will be changing a lot until officially released. - -The Java Ultimate Tools main repository can be found at: https://github.com/JGCompTech/JavaUltimateTools diff --git a/SecurityTools/index.html b/SecurityTools/index.html new file mode 100755 index 0000000..0503031 --- /dev/null +++ b/SecurityTools/index.html @@ -0,0 +1,722 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Security Tools - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Security Tools DocumentationLink

+

IntroductionLink

+

Package Name: com.jgcomptech.tools.SecurityTools

+

Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384, SHA512 and BCrypt. Also includes encryption/decryption with RSA.

+

FeaturesLink

+
    +
  • FileHashes
      +
    • Contains methods dealing with hashing files.
    • +
    +
  • +
  • PasswordHashes
      +
    • Contains methods dealing with hashing passwords.
    • +
    +
  • +
  • RSAFiles
      +
    • Contains methods dealing with RSA key files.
    • +
    +
  • +
  • RSAHashes
      +
    • Contains methods dealing with RSA encryption and decryption.
    • +
    +
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/Utils/index.html b/Utils/index.html new file mode 100755 index 0000000..7b2bef1 --- /dev/null +++ b/Utils/index.html @@ -0,0 +1,721 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Utils - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

Utils DocumentationLink

+

IntroductionLink

+

JUT contains many utils classes to allow for extension and simplification of many aspects of Java.

+

FeaturesLink

+
    +
  • CollectionUtils
      +
    • Contains methods for dealing with collections.
    • +
    +
  • +
  • ExceptionUtils
      +
    • Contains methods for dealing with exceptions.
    • +
    +
  • +
  • NumberUtils
      +
    • Contains methods dealing with numbers and math.
    • +
    +
  • +
  • StringUtils
      +
    • Contains methods dealing with strings.
    • +
    +
  • +
+
+

Info

+

This page is a WIP and more documentation is coming soon.

+
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/assets/fonts/font-awesome.css b/assets/fonts/font-awesome.css new file mode 100755 index 0000000..b476b53 --- /dev/null +++ b/assets/fonts/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;font-style:normal;font-weight:400;src:url("specimen/FontAwesome.woff2") format("woff2"),url("specimen/FontAwesome.woff") format("woff"),url("specimen/FontAwesome.ttf") format("truetype")}.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} \ No newline at end of file diff --git a/assets/fonts/material-icons.css b/assets/fonts/material-icons.css new file mode 100755 index 0000000..d23d365 --- /dev/null +++ b/assets/fonts/material-icons.css @@ -0,0 +1,13 @@ +/*! + * 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. + */@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} \ No newline at end of file diff --git a/assets/fonts/specimen/FontAwesome.ttf b/assets/fonts/specimen/FontAwesome.ttf new file mode 100755 index 0000000..35acda2 Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.ttf differ diff --git a/assets/fonts/specimen/FontAwesome.woff b/assets/fonts/specimen/FontAwesome.woff new file mode 100755 index 0000000..400014a Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.woff differ diff --git a/assets/fonts/specimen/FontAwesome.woff2 b/assets/fonts/specimen/FontAwesome.woff2 new file mode 100755 index 0000000..4d13fc6 Binary files /dev/null and b/assets/fonts/specimen/FontAwesome.woff2 differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.ttf b/assets/fonts/specimen/MaterialIcons-Regular.ttf new file mode 100755 index 0000000..7015564 Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.ttf differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.woff b/assets/fonts/specimen/MaterialIcons-Regular.woff new file mode 100755 index 0000000..b648a3e Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.woff differ diff --git a/assets/fonts/specimen/MaterialIcons-Regular.woff2 b/assets/fonts/specimen/MaterialIcons-Regular.woff2 new file mode 100755 index 0000000..9fa2112 Binary files /dev/null and b/assets/fonts/specimen/MaterialIcons-Regular.woff2 differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100755 index 0000000..76d17f5 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/images/icons/bitbucket.1b09e088.svg b/assets/images/icons/bitbucket.1b09e088.svg new file mode 100755 index 0000000..a25435a --- /dev/null +++ b/assets/images/icons/bitbucket.1b09e088.svg @@ -0,0 +1,20 @@ + + + diff --git a/assets/images/icons/github.f0b8504a.svg b/assets/images/icons/github.f0b8504a.svg new file mode 100755 index 0000000..c009420 --- /dev/null +++ b/assets/images/icons/github.f0b8504a.svg @@ -0,0 +1,18 @@ + + + diff --git a/assets/images/icons/gitlab.6dd19c00.svg b/assets/images/icons/gitlab.6dd19c00.svg new file mode 100755 index 0000000..9e3d6f0 --- /dev/null +++ b/assets/images/icons/gitlab.6dd19c00.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/javascripts/application.583bbe55.js b/assets/javascripts/application.583bbe55.js new file mode 100755 index 0000000..7cc2081 --- /dev/null +++ b/assets/javascripts/application.583bbe55.js @@ -0,0 +1 @@ +!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";t.__esModule=!0,t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o pre, pre > code");Array.prototype.forEach.call(n,function(t,n){var r="__code_"+n,i=e.createElement("button",{class:"md-clipboard",title:h("clipboard.copy"),"data-clipboard-target":"#"+r+" pre, #"+r+" code"},e.createElement("span",{class:"md-clipboard__message"})),o=t.parentNode;o.id=r,o.insertBefore(i,t)});new c.default(".md-clipboard").on("success",function(e){var t=e.trigger.querySelector(".md-clipboard__message");if(!(t instanceof HTMLElement))throw new ReferenceError;e.clearSelection(),t.dataset.mdTimer&&clearTimeout(parseInt(t.dataset.mdTimer,10)),t.classList.add("md-clipboard__message--active"),t.innerHTML=h("clipboard.copied"),t.dataset.mdTimer=setTimeout(function(){t.classList.remove("md-clipboard__message--active"),t.dataset.mdTimer=""},2e3).toString()})}if(!Modernizr.details){var r=document.querySelectorAll("details > summary");Array.prototype.forEach.call(r,function(e){e.addEventListener("click",function(e){var t=e.target.parentNode;t.hasAttribute("open")?t.removeAttribute("open"):t.setAttribute("open","")})})}var i=function(){if(document.location.hash){var e=document.getElementById(document.location.hash.substring(1));if(!e)return;for(var t=e.parentNode;t&&!(t instanceof HTMLDetailsElement);)t=t.parentNode;if(t&&!t.open){t.open=!0;var n=location.hash;location.hash=" ",location.hash=n}}};if(window.addEventListener("hashchange",i),i(),Modernizr.ios){var o=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(o,function(e){e.addEventListener("touchstart",function(){var t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})})}}).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Shadow("[data-md-component=container]","[data-md-component=header]")).listen(),new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Header.Title("[data-md-component=title]",".md-typeset h1")).listen(),document.querySelector("[data-md-component=hero]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=hero]")).listen(),document.querySelector("[data-md-component=tabs]")&&new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Tabs.Toggle("[data-md-component=tabs]")).listen(),new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,["scroll","resize","orientationchange"],new f.default.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener(window,"scroll",new f.default.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(e){new f.default.Event.MatchMedia("(min-width: 1220px)",new f.default.Event.Listener(e.previousElementSibling,"click",new f.default.Nav.Collapse(e)))}),new f.default.Event.MatchMedia("(max-width: 1219px)",new f.default.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new f.default.Nav.Scrolling("[data-md-component=navigation] nav"))),document.querySelector("[data-md-component=search]")&&(new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-toggle=search]","change",new f.default.Search.Lock("[data-md-toggle=search]"))),new f.default.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new f.default.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/"+(t.version<"0.17"?"mkdocs":"search")+"/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+"/"+e.location,e})})})).listen(),new f.default.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new f.default.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new f.default.Event.MatchMedia("(min-width: 960px)",new f.default.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))})),new f.default.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!e.metaKey&&!e.ctrlKey)if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href"),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur())}}else if(9===e.keyCode||27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if(-1!==[8,37,39].indexOf(e.keyCode))n!==document.activeElement&&n.focus();else if(-1!==[38,40].indexOf(e.keyCode)){var i=e.keyCode,o=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=query], [data-md-component=search] [href]")),a=o.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var s=Math.max(0,(o.indexOf(a)+o.length+(38===i?-1:1))%o.length);return o[s]&&(o[s].dataset.mdState="active",o[s].focus()),e.preventDefault(),e.stopPropagation(),!1}}else document.activeElement&&!document.activeElement.form&&(70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault()))}).listen(),new f.default.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen()),new f.default.Event.Listener(document.body,"keydown",function(e){if(9===e.keyCode){var t=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[for]:not([tabindex])");Array.prototype.forEach.call(t,function(e){e.offsetHeight&&(e.tabIndex=0)})}}).listen(),new f.default.Event.Listener(document.body,"mousedown",function(){var e=document.querySelectorAll("[data-md-component=navigation] .md-nav__link[tabindex]");Array.prototype.forEach.call(e,function(e){e.removeAttribute("tabIndex")})}).listen(),document.body.addEventListener("click",function(){"tabbing"===document.body.dataset.mdState&&(document.body.dataset.mdState="")}),new f.default.Event.MatchMedia("(max-width: 959px)",new f.default.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),function(){var e=document.querySelector("[data-md-source]");if(!e)return a.default.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new f.default.Source.Adapter.GitHub(e).fetch();default:return a.default.resolve([])}}().then(function(e){var t=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(t,function(t){new f.default.Source.Repository(t).initialize(e)})})}t.__esModule=!0,t.app=void 0,n(7),n(8),n(9),n(10),n(11),n(12),n(13);var o=n(14),a=r(o),s=n(19),c=r(s),u=n(20),l=r(u),d=n(21),f=r(d);window.Promise=window.Promise||a.default;var h=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},p={initialize:i};t.app=p}).call(t,n(0))},function(e,t,n){e.exports=n.p+"assets/images/icons/bitbucket.1b09e088.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/github.f0b8504a.svg"},function(e,t,n){e.exports=n.p+"assets/images/icons/gitlab.6dd19c00.svg"},function(e,t){},function(e,t){},function(e,t){!function(){if("undefined"!=typeof window)try{var e=new window.CustomEvent("test",{cancelable:!0});if(e.preventDefault(),!0!==e.defaultPrevented)throw new Error("Could not prevent default")}catch(e){var t=function(e,t){var n,r;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};t.prototype=window.Event.prototype,window.CustomEvent=t}}()},function(e,t,n){window.fetch||(window.fetch=n(2).default||n(2))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function r(){}function i(e,t){return function(){e.apply(t,arguments)}}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function a(e,t){for(;3===e._state;)e=e._value;if(0===e._state)return void e._deferreds.push(t);e._handled=!0,o._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._state?s:c)(t.promise,e._value);var r;try{r=n(e._value)}catch(e){return void c(t.promise,e)}s(t.promise,r)})}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof o)return e._state=3,e._value=t,void u(e);if("function"==typeof n)return void d(i(n,t),e)}e._state=1,e._value=t,u(e)}catch(t){c(e,t)}}function c(e,t){e._state=2,e._value=t,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(16),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var e=this,t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,r.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function(){return this._target}}]),e}();e.exports=a})},function(e,t,n){function r(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!s.string(t))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(e))return i(e,t,n);if(s.nodeList(e))return o(e,t,n);if(s.string(e))return a(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}function o(e,t,n){return Array.prototype.forEach.call(e,function(e){e.addEventListener(t,n)}),{destroy:function(){Array.prototype.forEach.call(e,function(e){e.removeEventListener(t,n)})}}}function a(e,t,n){return c(document.body,e,t,n)}var s=n(6),c=n(5);e.exports=r},function(e,t){function n(){}n.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){function r(){i.off(e,r),t.apply(n,arguments)}var i=this;return r._=t,this.on(e,r,n)},emit:function(e){var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,i=n.length;for(r;r0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===f(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=(0,d.default)(e,"click",function(e){return t.onClick(e)})}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new u.default({action:this.action(t),target:this.target(t),text:this.text(t),container:this.container,trigger:t,emitter:this})}},{key:"defaultAction",value:function(e){return c("action",e)}},{key:"defaultTarget",value:function(e){var t=c("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return c("text",e)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach(function(e){n=n&&!!document.queryCommandSupported(e)}),n}}]),t}(l.default);e.exports=p})},function(e,t){function n(e,t){for(;e&&e.nodeType!==r;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}var r=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}e.exports=n},function(e,t,n){function r(e,t,n,r,i){var a=o.apply(this,arguments);return e.addEventListener(n,a,i),{destroy:function(){e.removeEventListener(n,a,i)}}}function i(e,t,n,i,o){return"function"==typeof e.addEventListener?r.apply(null,arguments):"function"==typeof n?r.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,function(e){return r(e,t,n,i,o)}))}function o(e,t,n,r){return function(n){n.delegateTarget=a(n.target,t),n.delegateTarget&&r.call(e,n)}}var a=n(4);e.exports=i},function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},function(e,t){function n(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),i=document.createRange();i.selectNodeContents(e),r.removeAllRanges(),r.addRange(i),t=r.toString()}return t}e.exports=n}])})},function(e,t,n){var r;!function(){"use strict";function i(e,t){var n;if(t=t||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=t.touchBoundary||10,this.layer=e,this.tapDelay=t.tapDelay||200,this.tapTimeout=t.tapTimeout||700,!i.notNeeded(e)){for(var r=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],o=this,s=0,c=r.length;s=0,a=navigator.userAgent.indexOf("Android")>0&&!o,s=/iP(ad|hone|od)/.test(navigator.userAgent)&&!o,c=s&&/OS 4_\d(_\d)?/.test(navigator.userAgent),u=s&&/OS [6-7]_\d/.test(navigator.userAgent),l=navigator.userAgent.indexOf("BB10")>0;i.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(s&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},i.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},i.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},i.prototype.determineEventType=function(e){return a&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},i.prototype.focus=function(e){var t;s&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},i.prototype.updateScrollParent=function(e){var t,n;if(!(t=e.fastClickScrollParent)||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},i.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},i.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],s){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!c){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTimen||Math.abs(t.pageY-this.touchStartY)>n},i.prototype.onTouchMove=function(e){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0)},i.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},i.prototype.onTouchEnd=function(e){var t,n,r,i,o,l=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,u&&(o=e.changedTouches[0],l=document.elementFromPoint(o.pageX-window.pageXOffset,o.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),"label"===(r=l.tagName.toLowerCase())){if(t=this.findControl(l)){if(this.focus(l),a)return!1;l=t}}else if(this.needsFocus(l))return e.timeStamp-n>100||s&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,e),s&&"select"===r||(this.targetElement=null,e.preventDefault()),!1);return!(!s||c||!(i=l.fastClickScrollParent)||i.fastClickLastScrollTop===i.scrollTop)||(this.needsClick(l)||(e.preventDefault(),this.sendClick(l,e)),!1)},i.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},i.prototype.onMouse=function(e){return!this.targetElement||(!!e.forwardedTouchEvent||(!e.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1))))},i.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail||(t=this.onMouse(e),t||(this.targetElement=null),t)},i.prototype.destroy=function(){var e=this.layer;a&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},i.notNeeded=function(e){var t,n,r;if(void 0===window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(l&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction||(!!(+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]>=27&&(t=document.querySelector("meta[name=viewport]"))&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))||("none"===e.style.touchAction||"manipulation"===e.style.touchAction))},i.attach=function(e,t){return new i(e,t)},void 0!==(r=function(){return i}.call(t,n,t,e))&&(e.exports=r)}()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(22),o=r(i),a=n(24),s=r(a),c=n(27),u=r(c),l=n(31),d=r(l),f=n(37),h=r(f),p=n(39),m=r(p),v=n(45),y=r(v);t.default={Event:o.default,Header:s.default,Nav:u.default,Search:d.default,Sidebar:h.default,Source:m.default,Tabs:y.default}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(3),o=r(i),a=n(23),s=r(a);t.default={Listener:o.default,MatchMedia:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(3),o=(function(e){e&&e.__esModule}(i),function e(t,n){r(this,e),this.handler_=function(e){e.matches?n.listen():n.unlisten()};var i=window.matchMedia(t);i.addListener(this.handler_),this.handler_(i)});t.default=o},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(25),o=r(i),a=n(26),s=r(a);t.default={Shadow:o.default,Title:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.active_=!1}return e.prototype.setup=function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()},e.prototype.update=function(e){if(!e||"resize"!==e.type&&"orientationchange"!==e.type){var t=window.pageYOffset>=this.height_;t!==this.active_&&(this.header_.dataset.mdState=(this.active_=t)?"shadow":"")}else this.height_=0,this.setup()},e.prototype.reset=function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLHeadingElement))throw new ReferenceError;this.header_=i,this.active_=!1}return e.prototype.setup=function(){var e=this;Array.prototype.forEach.call(this.el_.children,function(t){t.style.width=e.el_.offsetWidth-20+"px"})},e.prototype.update=function(e){var t=this,n=window.pageYOffset>=this.header_.offsetTop;n!==this.active_&&(this.el_.dataset.mdState=(this.active_=n)?"active":""),"resize"!==e.type&&"orientationchange"!==e.type||Array.prototype.forEach.call(this.el_.children,function(e){e.style.width=t.el_.offsetWidth-20+"px"})},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.width="",this.active_=!1},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(28),o=r(i),a=n(29),s=r(a),c=n(30),u=r(c);t.default={Blur:o.default,Collapse:s.default,Scrolling:u.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e),this.els_="string"==typeof t?document.querySelectorAll(t):t,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){return e.concat(document.getElementById(t.hash.substring(1))||[])},[])}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=this.index_=t?0:this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;n0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>e)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=e,this.dir_=t}},e.prototype.reset=function(){Array.prototype.forEach.call(this.els_,function(e){e.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){var e=this.el_.getBoundingClientRect().height;this.el_.style.display=e?"block":"none",this.el_.style.overflow=e?"visible":"hidden"},e.prototype.update=function(){var e=this,t=this.el_.getBoundingClientRect().height;if(this.el_.style.display="block",this.el_.style.overflow="",t)this.el_.style.maxHeight=t+"px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight="0px"});else{this.el_.setAttribute("data-md-state","expand"),this.el_.style.maxHeight="";var n=this.el_.getBoundingClientRect().height;this.el_.removeAttribute("data-md-state"),this.el_.style.maxHeight="0px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight=n+"px"})}var r=function e(n){var r=n.target;if(!(r instanceof HTMLElement))throw new ReferenceError;r.removeAttribute("data-md-state"),r.style.maxHeight="",r.style.display=t?"none":"block",r.style.overflow=t?"hidden":"visible",r.removeEventListener("transitionend",e)};this.el_.addEventListener("transitionend",r,!1)},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.maxHeight="",this.el_.style.display="",this.el_.style.overflow=""},e}();t.default=i},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return e.prototype.setup=function(){this.el_.children[this.el_.children.length-1].style.webkitOverflowScrolling="touch";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling="touch"}})},e.prototype.update=function(e){var t=e.target;if(!(t instanceof HTMLElement))throw new ReferenceError;var n=t.nextElementSibling;if(!(n instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==n.tagName&&n.nextElementSibling;)n=n.nextElementSibling;if(!(t.parentNode instanceof HTMLElement&&t.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var r=t.parentNode.parentNode,i=n.children[n.children.length-1];if(r.style.webkitOverflowScrolling="",i.style.webkitOverflowScrolling="",!t.checked){var o=function e(){n instanceof HTMLElement&&(r.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",o,!1)}if(t.checked){var a=function e(){n instanceof HTMLElement&&(i.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",a,!1)}},e.prototype.reset=function(){this.el_.children[1].style.webkitOverflowScrolling="";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling=""}})},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(32),o=r(i),a=n(33),s=r(a);t.default={Lock:o.default,Result:s.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(this.el_=n,!document.body)throw new ReferenceError;this.lock_=document.body}return e.prototype.setup=function(){this.update()},e.prototype.update=function(){var e=this;this.el_.checked?(this.offset_=window.pageYOffset,setTimeout(function(){window.scrollTo(0,0),e.el_.checked&&(e.lock_.dataset.mdState="lock")},400)):(this.lock_.dataset.mdState="",setTimeout(function(){void 0!==e.offset_&&window.scrollTo(0,e.offset_)},100))},e.prototype.reset=function(){"lock"===this.lock_.dataset.mdState&&window.scrollTo(0,this.offset_),this.lock_.dataset.mdState=""},e}();t.default=i},function(e,t,n){"use strict";(function(e){function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var o=n(34),a=r(o),s=n(35),c=r(s),u=function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&--n>0;);return e.substring(0,n)+"..."}return e},l=function(e){var t=document.getElementsByName("lang:"+e)[0];if(!(t instanceof HTMLMetaElement))throw new ReferenceError;return t.content},d=function(){function t(e,n){i(this,t);var r="string"==typeof e?document.querySelector(e):e;if(!(r instanceof HTMLElement))throw new ReferenceError;this.el_=r;var o=Array.prototype.slice.call(this.el_.children),a=o[0],s=o[1];this.data_=n,this.meta_=a,this.list_=s,this.message_={placeholder:this.meta_.textContent,none:l("search.result.none"),one:l("search.result.one"),other:l("search.result.other")};var u=l("search.tokenizer");u.length&&(c.default.tokenizer.separator=u),this.lang_=l("search.language").split(",").filter(Boolean).map(function(e){return e.trim()})}return t.prototype.update=function(t){var n=this;if("focus"!==t.type||this.index_){if("focus"===t.type||"keyup"===t.type){var r=t.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;if(!this.index_||r.value===this.value_)return;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);if(this.value_=r.value,0===this.value_.length)return void(this.meta_.textContent=this.message_.placeholder);var i=this.index_.query(function(e){n.value_.toLowerCase().split(" ").filter(Boolean).forEach(function(t){e.term(t,{wildcard:c.default.Query.wildcard.TRAILING})})}).reduce(function(e,t){var r=n.docs_.get(t.ref);if(r.parent){var i=r.parent.location;e.set(i,(e.get(i)||[]).concat(t))}else{var o=r.location;e.set(o,e.get(o)||[])}return e},new Map),o=(0,a.default)(this.value_.trim()).replace(new RegExp(c.default.tokenizer.separator,"img"),"|"),s=new RegExp("(^|"+c.default.tokenizer.separator+")("+o+")","img"),d=function(e,t,n){return t+""+n+""};this.stack_=[],i.forEach(function(t,r){var i,o=n.docs_.get(r),a=e.createElement("li",{class:"md-search-result__item"},e.createElement("a",{href:o.location,title:o.title,class:"md-search-result__link",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article md-search-result__article--document"},e.createElement("h1",{class:"md-search-result__title"},{__html:o.title.replace(s,d)}),o.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:o.text.replace(s,d)}):{}))),c=t.map(function(t){return function(){var r=n.docs_.get(t.ref);a.appendChild(e.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":"anchor",tabindex:"-1"},e.createElement("article",{class:"md-search-result__article"},e.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,d)}),r.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:u(r.text.replace(s,d),400)}):{})))}});(i=n.stack_).push.apply(i,[function(){return n.list_.appendChild(a)}].concat(c))});var f=this.el_.parentNode;if(!(f instanceof HTMLElement))throw new ReferenceError;for(;this.stack_.length&&f.offsetHeight>=f.scrollHeight-16;)this.stack_.shift()();var h=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(h,function(e){["click","keydown"].forEach(function(t){e.addEventListener(t,function(n){if("keydown"!==t||13===n.keyCode){var r=document.querySelector("[data-md-toggle=search]");if(!(r instanceof HTMLInputElement))throw new ReferenceError;r.checked&&(r.checked=!1,r.dispatchEvent(new CustomEvent("change"))),n.preventDefault(),setTimeout(function(){document.location.href=e.href},100)}})})}),i.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",i.size)}}}else{var p=function(e){n.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=n[0];return n[1]&&(t.parent=e.get(r),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var t=n.docs_,r=n.lang_;n.stack_=[],n.index_=(0,c.default)(function(){var e,n=this,i={"search.pipeline.trimmer":c.default.trimmer,"search.pipeline.stopwords":c.default.stopWordFilter},o=Object.keys(i).reduce(function(e,t){return l(t).match(/^false$/i)||e.push(i[t]),e},[]);this.pipeline.reset(),o&&(e=this.pipeline).add.apply(e,o),1===r.length&&"en"!==r[0]&&c.default[r[0]]?this.use(c.default[r[0]]):r.length>1&&this.use(c.default.multiLanguage.apply(c.default,r)),this.field("title",{boost:10}),this.field("text"),this.ref("location"),t.forEach(function(e){return n.add(e)})});var i=n.el_.parentNode;if(!(i instanceof HTMLElement))throw new ReferenceError;i.addEventListener("scroll",function(){for(;n.stack_.length&&i.scrollTop+i.offsetHeight>=i.scrollHeight-16;)n.stack_.splice(0,10).forEach(function(e){return e()})})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(p):p(n.data_)},250)}},t}();t.default=d}).call(t,n(0))},function(e,t,n){"use strict";var r=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\$&")}},function(e,t,n){(function(t){e.exports=t.lunr=n(36)}).call(t,n(1))},function(e,t,n){var r,i;!function(){var o=function(e){var t=new o.Builder;return t.pipeline.add(o.trimmer,o.stopWordFilter,o.stemmer),t.searchPipeline.add(o.stemmer),e.call(t,t),t.build()};o.version="2.1.5",o.utils={},o.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),o.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},o.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},o.FieldRef.joiner="/",o.FieldRef.fromString=function(e){var t=e.indexOf(o.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),r=e.slice(t+1);return new o.FieldRef(r,n,e)},o.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+o.FieldRef.joiner+this.docRef),this._stringValue},o.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);var i=(t-n+.5)/(n+.5);return Math.log(1+Math.abs(i))},o.Token=function(e,t){this.str=e||"",this.metadata=t||{}},o.Token.prototype.toString=function(){return this.str},o.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},o.Token.prototype.clone=function(e){return e=e||function(e){return e},new o.Token(e(this.str,this.metadata),this.metadata)},o.tokenizer=function(e){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new o.Token(o.utils.asString(e).toLowerCase())});for(var t=e.toString().trim().toLowerCase(),n=t.length,r=[],i=0,a=0;i<=n;i++){var s=t.charAt(i),c=i-a;(s.match(o.tokenizer.separator)||i==n)&&(c>0&&r.push(new o.Token(t.slice(a,i),{position:[a,c],index:r.length})),a=i+1)}return r},o.tokenizer.separator=/[\s\-]+/,o.Pipeline=function(){this._stack=[]},o.Pipeline.registeredFunctions=Object.create(null),o.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&o.utils.warn("Overwriting existing registered function: "+t),e.label=t,o.Pipeline.registeredFunctions[e.label]=e},o.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||o.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},o.Pipeline.load=function(e){var t=new o.Pipeline;return e.forEach(function(e){var n=o.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},o.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){o.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},o.Pipeline.prototype.after=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},o.Pipeline.prototype.before=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},o.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},o.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=i),o!=e);)r=n-t,i=t+Math.floor(r/2),o=this.elements[2*i];return o==e?2*i:o>e?2*i:os?u+=2:a==s&&(t+=n[c+1]*r[u+1],c+=2,u+=2);return t},o.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},o.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var a,s=i.str.charAt(0);s in i.node.edges?a=i.node.edges[s]:(a=new o.TokenSet,i.node.edges[s]=a),1==i.str.length?a.final=!0:r.push({node:a,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(i.editsRemaining>0&&i.str.length>1){var c,s=i.str.charAt(1);s in i.node.edges?c=i.node.edges[s]:(c=new o.TokenSet,i.node.edges[s]=c),i.str.length<=2?c.final=!0:r.push({node:c,editsRemaining:i.editsRemaining-1,str:i.str.slice(2)})}if(i.editsRemaining>0&&1==i.str.length&&(i.node.final=!0),i.editsRemaining>0&&i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{var u=new o.TokenSet;i.node.edges["*"]=u}1==i.str.length?u.final=!0:r.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.editsRemaining>0){if("*"in i.node.edges)var l=i.node.edges["*"];else{var l=new o.TokenSet;i.node.edges["*"]=l}0==i.str.length?l.final=!0:r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str})}if(i.editsRemaining>0&&i.str.length>1){var d,f=i.str.charAt(0),h=i.str.charAt(1);h in i.node.edges?d=i.node.edges[h]:(d=new o.TokenSet,i.node.edges[h]=d),1==i.str.length?d.final=!0:r.push({node:d,editsRemaining:i.editsRemaining-1,str:f+i.str.slice(2)})}}return n},o.TokenSet.fromString=function(e){for(var t=new o.TokenSet,n=t,r=!1,i=0,a=e.length;i=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},o.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},o.Index.prototype.search=function(e){return this.query(function(t){new o.QueryParser(e,t).parse()})},o.Index.prototype.query=function(e){var t=new o.Query(this.fields),n=Object.create(null),r=Object.create(null),i=Object.create(null);e.call(t,t);for(var a=0;a1?1:e},o.Builder.prototype.k1=function(e){this._k1=e},o.Builder.prototype.add=function(e){var t=e[this._ref];this.documentCount+=1;for(var n=0;n=this.length)return o.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},o.QueryLexer.prototype.width=function(){return this.pos-this.start},o.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},o.QueryLexer.prototype.backup=function(){this.pos-=1},o.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{e=this.next(),t=e.charCodeAt(0)}while(t>47&&t<58);e!=o.QueryLexer.EOS&&this.backup()},o.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(o.QueryLexer.TERM)),e.ignore(),e.more())return o.QueryLexer.lexText},o.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.EDIT_DISTANCE),o.QueryLexer.lexText},o.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.BOOST),o.QueryLexer.lexText},o.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(o.QueryLexer.TERM)},o.QueryLexer.termSeparator=o.tokenizer.separator,o.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==o.QueryLexer.EOS)return o.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return o.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexBoost;if(t.match(o.QueryLexer.termSeparator))return o.QueryLexer.lexTerm}else e.escapeCharacter()}},o.QueryParser=function(e,t){this.lexer=new o.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},o.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=o.QueryParser.parseFieldOrTerm;e;)e=e(this);return this.query},o.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},o.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},o.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},o.QueryParser.parseFieldOrTerm=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case o.QueryLexer.FIELD:return o.QueryParser.parseField;case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new o.QueryParseError(n,t.start,t.end)}},o.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(void 0==i){var r="expecting term, found nothing";throw new o.QueryParseError(r,t.start,t.end)}switch(i.type){case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var r="expecting term, found '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+n.type+"'";throw new o.QueryParseError(r,n.start,n.end)}}},o.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},function(o,a){r=a,void 0!==(i="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=i)}(0,function(){return o})}()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(38),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={Position:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,this.parent_=i.parentNode,!((i="string"==typeof n?document.querySelector(n):n)instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.pad_="fixed"===window.getComputedStyle(this.header_).position}return e.prototype.setup=function(){var e=Array.prototype.reduce.call(this.parent_.children,function(e,t){return Math.max(e,t.offsetTop)},0);this.offset_=e-(this.pad_?this.header_.offsetHeight:0),this.update()},e.prototype.update=function(e){var t=window.pageYOffset,n=window.innerHeight;e&&"resize"===e.type&&this.setup();var r={top:this.pad_?this.header_.offsetHeight:0,bottom:this.parent_.offsetTop+this.parent_.offsetHeight},i=n-r.top-Math.max(0,this.offset_-t)-Math.max(0,t+n-r.bottom);i!==this.height_&&(this.el_.style.height=(this.height_=i)+"px"),t>=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0},e}();t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var i=n(40),o=r(i),a=n(44),s=r(a);t.default={Adapter:o.default,Repository:s.default}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(41),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default={GitHub:i.default}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var a=n(42),s=function(e){return e&&e.__esModule?e:{default:e}}(a),c=function(e){function t(n){r(this,t);var o=i(this,e.call(this,n)),a=/^.+github\.com\/([^\/]+)\/?([^\/]+)?.*$/.exec(o.base_);if(a&&3===a.length){var s=a[1],c=a[2];o.base_="https://api.github.com/users/"+s+"/repos",o.name_=c}return o}return o(t,e),t.prototype.fetch_=function(){var e=this;return function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return fetch(e.base_+"?per_page=30&page="+n).then(function(e){return e.json()}).then(function(r){if(!(r instanceof Array))throw new TypeError;if(e.name_){var i=r.find(function(t){return t.name===e.name_});return i||30!==r.length?i?[e.format_(i.stargazers_count)+" Stars",e.format_(i.forks_count)+" Forks"]:[]:t(n+1)}return[r.length+" Repositories"]})}()},t}(s.default);t.default=c},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0;var i=n(43),o=function(e){return e&&e.__esModule?e:{default:e}}(i),a=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=n,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}return e.prototype.fetch=function(){var e=this;return new Promise(function(t){var n=o.default.getJSON(e.salt_+".cache-source");void 0!==n?t(n):e.fetch_().then(function(n){o.default.set(e.salt_+".cache-source",n,{expires:1/96}),t(n)})})},e.prototype.fetch_=function(){throw new Error("fetch_(): Not implemented")},e.prototype.format_=function(e){return e>1e4?(e/1e3).toFixed(0)+"k":e>1e3?(e/1e3).toFixed(1)+"k":""+e},e.prototype.hash_=function(e){var t=0;if(0===e.length)return t;for(var n=0,r=e.length;n1){if(o=e({path:"/"},r.defaults,o),"number"==typeof o.expires){var s=new Date;s.setMilliseconds(s.getMilliseconds()+864e5*o.expires),o.expires=s}o.expires=o.expires?o.expires.toUTCString():"";try{a=JSON.stringify(i),/^[\{\[]/.test(a)&&(i=a)}catch(e){}i=n.write?n.write(i,t):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var c="";for(var u in o)o[u]&&(c+="; "+u,!0!==o[u]&&(c+="="+o[u]));return document.cookie=t+"="+i+c}t||(a={});for(var l=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,f=0;f=this.el_.children[0].offsetTop+-43;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")},e.prototype.reset=function(){this.el_.dataset.mdState="",this.active_=!1},e}();t.default=i}])); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.da.js b/assets/javascripts/lunr/lunr.da.js new file mode 100755 index 0000000..3b07b2c --- /dev/null +++ b/assets/javascripts/lunr/lunr.da.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,i,n;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,t,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new i;function l(){var e,r=c.limit-c.cursor;c.cursor>=n&&(e=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var r,i=c.cursor;return function(){var r,i=c.cursor+3;if(n=c.limit,0<=i&&i<=c.limit){for(e=i;;){if(r=c.cursor,c.in_grouping(d,97,248)){c.cursor=r;break}if(c.cursor=r,r>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(n=c.cursor)=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,t=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-t,c.cursor>=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=n&&(r=c.limit_backward,c.limit_backward=n,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,t=c.slice_to(t),c.limit_backward=r,c.eq_v_b(t)&&c.slice_del()):c.limit_backward=r),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.de.js b/assets/javascripts/lunr/lunr.de.js new file mode 100755 index 0000000..ebd78f2 --- /dev/null +++ b/assets/javascripts/lunr/lunr.de.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,i;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){var e,i,s,t=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],o=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],c=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],u=[new r("ig",-1,1),new r("lich",-1,1)],a=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],l=[117,30,5],m=[117,30,4],h=new n;function w(e,r,n){return!(!h.eq_s(1,e)||(h.ket=h.cursor,!h.in_grouping(d,97,252)))&&(h.slice_from(r),h.cursor=n,!0)}function f(){for(;!h.in_grouping(d,97,252);){if(h.cursor>=h.limit)return!0;h.cursor++}for(;!h.out_grouping(d,97,252);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function b(){return s<=h.cursor}function _(){return i<=h.cursor}this.setCurrent=function(e){h.setCurrent(e)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var r=h.cursor;return function(){for(var e,r,n,i,s=h.cursor;;)if(e=h.cursor,h.bra=e,h.eq_s(1,"ß"))h.ket=h.cursor,h.slice_from("ss");else{if(e>=h.limit)break;h.cursor=e+1}for(h.cursor=s;;)for(r=h.cursor;;){if(n=h.cursor,h.in_grouping(d,97,252)){if(i=h.cursor,h.bra=i,w("u","U",n))break;if(h.cursor=i,w("y","Y",n))break}if(n>=h.limit)return void(h.cursor=r);h.cursor=n+1}}(),h.cursor=r,function(){s=h.limit,i=s;var r=h.cursor+3;0<=r&&r<=h.limit&&(e=r,f()||((s=h.cursor)=h.limit)return;h.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.du.js b/assets/javascripts/lunr/lunr.du.js new file mode 100755 index 0000000..375c0e7 --- /dev/null +++ b/assets/javascripts/lunr/lunr.du.js @@ -0,0 +1 @@ +!function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,i,n;r.du=function(){this.pipeline.reset(),this.pipeline.add(r.du.trimmer,r.du.stopWordFilter,r.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.du.stemmer))},r.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.du.trimmer=r.trimmerSupport.generateTrimmer(r.du.wordCharacters),r.Pipeline.registerFunction(r.du.trimmer,"trimmer-du"),r.du.stemmer=(e=r.stemmerSupport.Among,i=r.stemmerSupport.SnowballProgram,n=new function(){var r,n,o,t=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],s=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],u=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],c=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],a=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],l=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new i;function w(r){return _.cursor=r,r>=_.limit||(_.cursor++,!1)}function b(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function p(){return n<=_.cursor}function g(){return r<=_.cursor}function h(){var r=_.limit-_.cursor;_.find_among_b(u,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function k(){var r;o=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,p()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),o=!0,h())))}function v(){var r;p()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),h())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var e=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(t,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(w(e))break}else if(w(e))break}(),_.cursor=e,n=_.limit,r=n,b()||((n=_.cursor)<3&&(n=3),b()||(r=_.cursor)),_.limit_backward=e,_.cursor=_.limit,function(){var r,e,i,n,t,s,u=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:p()&&_.slice_from("heid");break;case 2:v();break;case 3:p()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-u,k(),_.cursor=_.limit-u,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,g()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,v())))),_.cursor=_.limit-u,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(g()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,g()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,h()}break;case 2:g()&&(t=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-t,_.slice_del()));break;case 3:g()&&(_.slice_del(),k());break;case 4:g()&&_.slice_del();break;case 5:g()&&o&&_.slice_del()}_.cursor=_.limit-u,_.out_grouping_b(d,73,232)&&(s=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-s,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(s,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}),r.Pipeline.registerFunction(r.du.stemmer,"stemmer-du"),r.du.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.es.js b/assets/javascripts/lunr/lunr.es.js new file mode 100755 index 0000000..4cb634f --- /dev/null +++ b/assets/javascripts/lunr/lunr.es.js @@ -0,0 +1 @@ +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var s,r,n;e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=(s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,i,a=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],t=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],o=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],u=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],w=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],c=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],m=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],l=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],d=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],b=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],_=new r;function h(){if(_.out_grouping(f,97,252)){for(;!_.in_grouping(f,97,252);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}return!0}function v(){var e,s=_.cursor;if(function(){if(_.in_grouping(f,97,252)){var e=_.cursor;if(h()){if(_.cursor=e,!_.in_grouping(f,97,252))return!0;for(;!_.out_grouping(f,97,252);){if(_.cursor>=_.limit)return!0;_.cursor++}}return!1}return!0}()){if(_.cursor=s,!_.out_grouping(f,97,252))return;if(e=_.cursor,h()){if(_.cursor=e,!_.in_grouping(f,97,252)||_.cursor>=_.limit)return;_.cursor++}}i=_.cursor}function p(){for(;!_.in_grouping(f,97,252);){if(_.cursor>=_.limit)return!1;_.cursor++}for(;!_.out_grouping(f,97,252);){if(_.cursor>=_.limit)return!1;_.cursor++}return!0}function g(){return i<=_.cursor}function k(){return e<=_.cursor}function y(e,s){if(!k())return!0;_.slice_del(),_.ket=_.cursor;var r=_.find_among_b(e,s);return r&&(_.bra=_.cursor,1==r&&k()&&_.slice_del()),!1}function q(e){return!k()||(_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,e)&&(_.bra=_.cursor,k()&&_.slice_del()),!1)}function C(){var e;if(_.ket=_.cursor,e=_.find_among_b(m,46)){switch(_.bra=_.cursor,e){case 1:if(!k())return!1;_.slice_del();break;case 2:if(q("ic"))return!1;break;case 3:if(!k())return!1;_.slice_from("log");break;case 4:if(!k())return!1;_.slice_from("u");break;case 5:if(!k())return!1;_.slice_from("ente");break;case 6:if(!(n<=_.cursor))return!1;_.slice_del(),_.ket=_.cursor,(e=_.find_among_b(u,4))&&(_.bra=_.cursor,k()&&(_.slice_del(),1==e&&(_.ket=_.cursor,_.eq_s_b(2,"at")&&(_.bra=_.cursor,k()&&_.slice_del()))));break;case 7:if(y(w,3))return!1;break;case 8:if(y(c,3))return!1;break;case 9:if(q("at"))return!1}return!0}return!1}this.setCurrent=function(e){_.setCurrent(e)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var s,r=_.cursor;return s=_.cursor,i=_.limit,n=i,e=i,v(),_.cursor=s,p()&&(n=_.cursor,p()&&(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var e;if(_.ket=_.cursor,_.find_among_b(t,13)&&(_.bra=_.cursor,(e=_.find_among_b(o,11))&&g()))switch(e){case 1:_.bra=_.cursor,_.slice_from("iendo");break;case 2:_.bra=_.cursor,_.slice_from("ando");break;case 3:_.bra=_.cursor,_.slice_from("ar");break;case 4:_.bra=_.cursor,_.slice_from("er");break;case 5:_.bra=_.cursor,_.slice_from("ir");break;case 6:_.slice_del();break;case 7:_.eq_s_b(1,"u")&&_.slice_del()}}(),_.cursor=_.limit,C()||(_.cursor=_.limit,function(){var e,s;if(_.cursor>=i&&(s=_.limit_backward,_.limit_backward=i,_.ket=_.cursor,e=_.find_among_b(l,12),_.limit_backward=s,e)){if(_.bra=_.cursor,1==e){if(!_.eq_s_b(1,"u"))return!1;_.slice_del()}return!0}return!1}()||(_.cursor=_.limit,function(){var e,s,r,n;if(_.cursor>=i&&(s=_.limit_backward,_.limit_backward=i,_.ket=_.cursor,e=_.find_among_b(d,96),_.limit_backward=s,e))switch(_.bra=_.cursor,e){case 1:r=_.limit-_.cursor,_.eq_s_b(1,"u")?(n=_.limit-_.cursor,_.eq_s_b(1,"g")?_.cursor=_.limit-n:_.cursor=_.limit-r):_.cursor=_.limit-r,_.bra=_.cursor;case 2:_.slice_del()}}())),_.cursor=_.limit,function(){var e,s;if(_.ket=_.cursor,e=_.find_among_b(b,8))switch(_.bra=_.cursor,e){case 1:g()&&_.slice_del();break;case 2:g()&&(_.slice_del(),_.ket=_.cursor,_.eq_s_b(1,"u")&&(_.bra=_.cursor,s=_.limit-_.cursor,_.eq_s_b(1,"g")&&(_.cursor=_.limit-s,g()&&_.slice_del())))}}(),_.cursor=_.limit_backward,function(){for(var e;;){if(_.bra=_.cursor,e=_.find_among(a,6))switch(_.ket=_.cursor,e){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.fi.js b/assets/javascripts/lunr/lunr.fi.js new file mode 100755 index 0000000..0200b1f --- /dev/null +++ b/assets/javascripts/lunr/lunr.fi.js @@ -0,0 +1 @@ +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var e,r,n;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){var i,n,t,s,l=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],o=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],a=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],u=[new e("lle",-1,-1),new e("ine",-1,-1)],c=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],m=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],w=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,C),new e("seen",11,-1,v),new e("hen",11,2),new e("tten",11,-1,C),new e("hin",11,3),new e("siin",11,-1,C),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],_=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],k=[new e("i",-1,-1),new e("j",-1,-1)],b=[new e("mma",-1,1),new e("imma",0,-1)],d=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],f=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],p=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],g=new r;function j(){for(var i;i=g.cursor,!g.in_grouping(f,97,246);){if(g.cursor=i,i>=g.limit)return!0;g.cursor++}for(g.cursor=i;!g.out_grouping(f,97,246);){if(g.cursor>=g.limit)return!0;g.cursor++}return!1}function q(){var i,e;if(g.cursor>=s)if(e=g.limit_backward,g.limit_backward=s,g.ket=g.cursor,i=g.find_among_b(l,10)){switch(g.bra=g.cursor,g.limit_backward=e,i){case 1:if(!g.in_grouping_b(p,97,246))return;break;case 2:if(!(t<=g.cursor))return}g.slice_del()}else g.limit_backward=e}function v(){return g.find_among_b(m,7)}function C(){return g.eq_s_b(1,"i")&&g.in_grouping_b(h,97,246)}this.setCurrent=function(i){g.setCurrent(i)},this.getCurrent=function(){return g.getCurrent()},this.stem=function(){var e,r=g.cursor;return s=g.limit,t=s,j()||(s=g.cursor,j()||(t=g.cursor)),i=!1,g.limit_backward=r,g.cursor=g.limit,q(),g.cursor=g.limit,function(){var i,e,r;if(g.cursor>=s)if(e=g.limit_backward,g.limit_backward=s,g.ket=g.cursor,i=g.find_among_b(c,9))switch(g.bra=g.cursor,g.limit_backward=e,i){case 1:r=g.limit-g.cursor,g.eq_s_b(1,"k")||(g.cursor=g.limit-r,g.slice_del());break;case 2:g.slice_del(),g.ket=g.cursor,g.eq_s_b(3,"kse")&&(g.bra=g.cursor,g.slice_from("ksi"));break;case 3:g.slice_del();break;case 4:g.find_among_b(o,6)&&g.slice_del();break;case 5:g.find_among_b(a,6)&&g.slice_del();break;case 6:g.find_among_b(u,2)&&g.slice_del()}else g.limit_backward=e}(),g.cursor=g.limit,function(){var e,r,n;if(g.cursor>=s)if(r=g.limit_backward,g.limit_backward=s,g.ket=g.cursor,e=g.find_among_b(w,30)){switch(g.bra=g.cursor,g.limit_backward=r,e){case 1:if(!g.eq_s_b(1,"a"))return;break;case 2:case 9:if(!g.eq_s_b(1,"e"))return;break;case 3:if(!g.eq_s_b(1,"i"))return;break;case 4:if(!g.eq_s_b(1,"o"))return;break;case 5:if(!g.eq_s_b(1,"ä"))return;break;case 6:if(!g.eq_s_b(1,"ö"))return;break;case 7:if(n=g.limit-g.cursor,!v()&&(g.cursor=g.limit-n,!g.eq_s_b(2,"ie"))){g.cursor=g.limit-n;break}if(g.cursor=g.limit-n,g.cursor<=g.limit_backward){g.cursor=g.limit-n;break}g.cursor--,g.bra=g.cursor;break;case 8:if(!g.in_grouping_b(f,97,246)||!g.out_grouping_b(f,97,246))return}g.slice_del(),i=!0}else g.limit_backward=r}(),g.cursor=g.limit,function(){var i,e,r;if(g.cursor>=t)if(e=g.limit_backward,g.limit_backward=t,g.ket=g.cursor,i=g.find_among_b(_,14)){if(g.bra=g.cursor,g.limit_backward=e,1==i){if(r=g.limit-g.cursor,g.eq_s_b(2,"po"))return;g.cursor=g.limit-r}g.slice_del()}else g.limit_backward=e}(),g.cursor=g.limit,i?(g.cursor>=s&&(e=g.limit_backward,g.limit_backward=s,g.ket=g.cursor,g.find_among_b(k,2)?(g.bra=g.cursor,g.limit_backward=e,g.slice_del()):g.limit_backward=e),g.cursor=g.limit):(g.cursor=g.limit,function(){var i,e,r,n,l,o;if(g.cursor>=s){if(e=g.limit_backward,g.limit_backward=s,g.ket=g.cursor,g.eq_s_b(1,"t")&&(g.bra=g.cursor,r=g.limit-g.cursor,g.in_grouping_b(f,97,246)&&(g.cursor=g.limit-r,g.slice_del(),g.limit_backward=e,n=g.limit-g.cursor,g.cursor>=t&&(g.cursor=t,l=g.limit_backward,g.limit_backward=g.cursor,g.cursor=g.limit-n,g.ket=g.cursor,i=g.find_among_b(b,2))))){if(g.bra=g.cursor,g.limit_backward=l,1==i){if(o=g.limit-g.cursor,g.eq_s_b(2,"po"))return;g.cursor=g.limit-o}return void g.slice_del()}g.limit_backward=e}}(),g.cursor=g.limit),function(){var i,e,r,t;if(g.cursor>=s){for(i=g.limit_backward,g.limit_backward=s,e=g.limit-g.cursor,v()&&(g.cursor=g.limit-e,g.ket=g.cursor,g.cursor>g.limit_backward&&(g.cursor--,g.bra=g.cursor,g.slice_del())),g.cursor=g.limit-e,g.ket=g.cursor,g.in_grouping_b(d,97,228)&&(g.bra=g.cursor,g.out_grouping_b(f,97,246)&&g.slice_del()),g.cursor=g.limit-e,g.ket=g.cursor,g.eq_s_b(1,"j")&&(g.bra=g.cursor,r=g.limit-g.cursor,g.eq_s_b(1,"o")?g.slice_del():(g.cursor=g.limit-r,g.eq_s_b(1,"u")&&g.slice_del())),g.cursor=g.limit-e,g.ket=g.cursor,g.eq_s_b(1,"o")&&(g.bra=g.cursor,g.eq_s_b(1,"j")&&g.slice_del()),g.cursor=g.limit-e,g.limit_backward=i;;){if(t=g.limit-g.cursor,g.out_grouping_b(f,97,246)){g.cursor=g.limit-t;break}if(g.cursor=g.limit-t,g.cursor<=g.limit_backward)return;g.cursor--}g.ket=g.cursor,g.cursor>g.limit_backward&&(g.cursor--,g.bra=g.cursor,n=g.slice_to(),g.eq_v_b(n)&&g.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.fr.js b/assets/javascripts/lunr/lunr.fr.js new file mode 100755 index 0000000..3a9b9b1 --- /dev/null +++ b/assets/javascripts/lunr/lunr.fr.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,s,i;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){var e,i,n,t=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new s;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return n<=d.cursor}function v(){return i<=d.cursor}function h(){return e<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=n){if(s=d.limit_backward,d.limit_backward=n,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var r,s=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,d.bra=e,!k("y","Y",e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if(d.cursor=e,e>=d.limit)return;d.cursor++}}}(),d.cursor=s,function(){var r=d.cursor;if(n=d.limit,i=n,e=n,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=n;break}d.cursor++}while(!d.in_grouping(_,97,251))}n=d.cursor,d.cursor=r,g()||(i=d.cursor,g()||(e=d.cursor))}(),d.limit_backward=s,d.cursor=d.limit,z(),d.cursor=d.limit,r=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-r,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.hu.js b/assets/javascripts/lunr/lunr.hu.js new file mode 100755 index 0000000..fa704a6 --- /dev/null +++ b/assets/javascripts/lunr/lunr.hu.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var n,r,i;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){var e,i=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],a=[new n("á",-1,1),new n("é",-1,2)],t=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],s=[new n("al",-1,1),new n("el",-1,2)],c=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],w=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],o=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],l=[new n("á",-1,1),new n("é",-1,2)],u=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],m=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],k=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],f=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],b=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],d=new r;function g(){return e<=d.cursor}function h(){var e=d.limit-d.cursor;return!!d.find_among_b(t,23)&&(d.cursor=d.limit-e,!0)}function p(){if(d.cursor>d.limit_backward){d.cursor--,d.ket=d.cursor;var e=d.cursor-1;d.limit_backward<=e&&e<=d.limit&&(d.cursor=e,d.bra=e,d.slice_del())}}function _(){d.ket=d.cursor,d.find_among_b(c,44)&&(d.bra=d.cursor,g()&&(d.slice_del(),function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(a,2))&&(d.bra=d.cursor,g()))switch(e){case 1:d.slice_from("a");break;case 2:d.slice_from("e")}}()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var n=d.cursor;return function(){var n,r=d.cursor;if(e=d.limit,d.in_grouping(b,97,252))for(;;){if(n=d.cursor,d.out_grouping(b,97,252))return d.cursor=n,d.find_among(i,8)||(d.cursor=n,n=d.limit)return void(e=n);d.cursor++}if(d.cursor=r,d.out_grouping(b,97,252)){for(;!d.in_grouping(b,97,252);){if(d.cursor>=d.limit)return;d.cursor++}e=d.cursor}}(),d.limit_backward=n,d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(s,2))&&(d.bra=d.cursor,g())){if((1==e||2==e)&&!h())return;d.slice_del(),p()}}(),d.cursor=d.limit,_(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(w,3))&&(d.bra=d.cursor,g()))switch(e){case 1:d.slice_from("e");break;case 2:case 3:d.slice_from("a")}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(o,6))&&(d.bra=d.cursor,g()))switch(e){case 1:case 2:d.slice_del();break;case 3:d.slice_from("a");break;case 4:d.slice_from("e")}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(l,2))&&(d.bra=d.cursor,g())){if((1==e||2==e)&&!h())return;d.slice_del(),p()}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(m,12))&&(d.bra=d.cursor,g()))switch(e){case 1:case 4:case 7:case 9:d.slice_del();break;case 2:case 5:case 8:d.slice_from("e");break;case 3:case 6:d.slice_from("a")}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(k,31))&&(d.bra=d.cursor,g()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:d.slice_del();break;case 2:case 5:case 10:case 14:case 19:d.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:d.slice_from("e")}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(f,42))&&(d.bra=d.cursor,g()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:d.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:d.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:d.slice_from("e")}}(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,(e=d.find_among_b(u,7))&&(d.bra=d.cursor,g()))switch(e){case 1:d.slice_from("a");break;case 2:d.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:d.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.it.js b/assets/javascripts/lunr/lunr.it.js new file mode 100755 index 0000000..2930733 --- /dev/null +++ b/assets/javascripts/lunr/lunr.it.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,i,n;e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=(r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,o,t=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],s=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],a=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],u=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],c=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],w=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],l=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],m=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],v=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],b=[17],d=new i;function _(e,r,i){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(f,97,249)))&&(d.slice_from(r),d.cursor=i,!0)}function g(e){if(d.cursor=e,!d.in_grouping(f,97,249))return!1;for(;!d.out_grouping(f,97,249);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function p(){var e,r=d.cursor;if(!function(){if(d.in_grouping(f,97,249)){var e=d.cursor;if(d.out_grouping(f,97,249)){for(;!d.in_grouping(f,97,249);){if(d.cursor>=d.limit)return g(e);d.cursor++}return!0}return g(e)}return!1}()){if(d.cursor=r,!d.out_grouping(f,97,249))return;if(e=d.cursor,d.out_grouping(f,97,249)){for(;!d.in_grouping(f,97,249);){if(d.cursor>=d.limit)return d.cursor=e,void(d.in_grouping(f,97,249)&&d.cursor=d.limit)return;d.cursor++}o=d.cursor}function k(){for(;!d.in_grouping(f,97,249);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,249);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return o<=d.cursor}function q(){return e<=d.cursor}function C(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(l,51)))return!1;switch(d.bra=d.cursor,e){case 1:if(!q())return!1;d.slice_del();break;case 2:if(!q())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,q()&&d.slice_del());break;case 3:if(!q())return!1;d.slice_from("log");break;case 4:if(!q())return!1;d.slice_from("u");break;case 5:if(!q())return!1;d.slice_from("ente");break;case 6:if(!h())return!1;d.slice_del();break;case 7:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(c,4))&&(d.bra=d.cursor,q()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,q()&&d.slice_del()))));break;case 8:if(!q())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(w,3))&&(d.bra=d.cursor,1==e&&q()&&d.slice_del());break;case 9:if(!q())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,q()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,q()&&d.slice_del())))}return!0}function z(){var e;e=d.limit-d.cursor,d.ket=d.cursor,d.in_grouping_b(v,97,242)&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,h())))?d.slice_del():d.cursor=d.limit-e,d.ket=d.cursor,d.eq_s_b(1,"h")&&(d.bra=d.cursor,d.in_grouping_b(b,99,103)&&h()&&d.slice_del())}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var r,i,c,w=d.cursor;return function(){for(var e,r,i,n,o=d.cursor;;){if(d.bra=d.cursor,e=d.find_among(t,7))switch(d.ket=d.cursor,e){case 1:d.slice_from("à");continue;case 2:d.slice_from("è");continue;case 3:d.slice_from("ì");continue;case 4:d.slice_from("ò");continue;case 5:d.slice_from("ù");continue;case 6:d.slice_from("qU");continue;case 7:if(d.cursor>=d.limit)break;d.cursor++;continue}break}for(d.cursor=o;;)for(r=d.cursor;;){if(i=d.cursor,d.in_grouping(f,97,249)){if(d.bra=d.cursor,n=d.cursor,_("u","U",i))break;if(d.cursor=n,_("i","I",i))break}if(d.cursor=i,d.cursor>=d.limit)return void(d.cursor=r);d.cursor++}}(),d.cursor=w,r=d.cursor,o=d.limit,n=o,e=o,p(),d.cursor=r,k()&&(n=d.cursor,k()&&(e=d.cursor)),d.limit_backward=w,d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,d.find_among_b(a,37)&&(d.bra=d.cursor,(e=d.find_among_b(u,5))&&h()))switch(e){case 1:d.slice_del();break;case 2:d.slice_from("e")}}(),d.cursor=d.limit,C()||(d.cursor=d.limit,d.cursor>=o&&(c=d.limit_backward,d.limit_backward=o,d.ket=d.cursor,(i=d.find_among_b(m,87))&&(d.bra=d.cursor,1==i&&d.slice_del()),d.limit_backward=c)),d.cursor=d.limit,z(),d.cursor=d.limit_backward,function(){for(var e;d.bra=d.cursor,e=d.find_among(s,3);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.jp.js b/assets/javascripts/lunr/lunr.jp.js new file mode 100755 index 0000000..a33c3c7 --- /dev/null +++ b/assets/javascripts/lunr/lunr.jp.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.jp=function(){this.pipeline.reset(),this.pipeline.add(e.jp.stopWordFilter,e.jp.stemmer),r?this.tokenizer=e.jp.tokenizer:(e.tokenizer&&(e.tokenizer=e.jp.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.jp.tokenizer))};var t=new e.TinySegmenter;e.jp.tokenizer=function(n){if(!arguments.length||null==n||null==n)return[];if(Array.isArray(n))return n.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(var i=n.toString().toLowerCase().replace(/^\s+/,""),o=i.length-1;o>=0;o--)if(/\S/.test(i.charAt(o))){i=i.substring(0,o+1);break}return t.segment(i).filter(function(e){return!!e}).map(function(t){return r?new e.Token(t):t})},e.jp.stemmer=function(e){return e},e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.jp.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.jp.stopWordFilter=function(t){if(-1===e.jp.stopWordFilter.stopWords.indexOf(r?t.toString():t))return t},e.jp.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.multi.js b/assets/javascripts/lunr/lunr.multi.js new file mode 100755 index 0000000..d3dbc86 --- /dev/null +++ b/assets/javascripts/lunr/lunr.multi.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var i=Array.prototype.slice.call(arguments),t=i.join("-"),r="",n=[],s=[],p=0;p=l.limit)return;l.cursor=r+1}for(;!l.out_grouping(a,97,248);){if(l.cursor>=l.limit)return;l.cursor++}(i=l.cursor)=i&&(r=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,e=l.find_among_b(t,29),l.limit_backward=r,e))switch(l.bra=l.cursor,e){case 1:l.slice_del();break;case 2:n=l.limit-l.cursor,l.in_grouping_b(m,98,122)?l.slice_del():(l.cursor=l.limit-n,l.eq_s_b(1,"k")&&l.out_grouping_b(a,97,248)&&l.slice_del());break;case 3:l.slice_from("er")}}(),l.cursor=l.limit,n=l.limit-l.cursor,l.cursor>=i&&(r=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,l.find_among_b(o,2)?(l.bra=l.cursor,l.limit_backward=r,l.cursor=l.limit-n,l.cursor>l.limit_backward&&(l.cursor--,l.bra=l.cursor,l.slice_del())):l.limit_backward=r),l.cursor=l.limit,l.cursor>=i&&(d=l.limit_backward,l.limit_backward=i,l.ket=l.cursor,(u=l.find_among_b(s,11))?(l.bra=l.cursor,l.limit_backward=d,1==u&&l.slice_del()):l.limit_backward=d),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.pt.js b/assets/javascripts/lunr/lunr.pt.js new file mode 100755 index 0000000..51035c9 --- /dev/null +++ b/assets/javascripts/lunr/lunr.pt.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,s,n;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,i,o=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],a=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],t=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],u=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],w=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],m=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],c=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],l=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],f=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],d=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],v=new s;function p(){if(v.out_grouping(d,97,250)){for(;!v.in_grouping(d,97,250);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}return!0}function _(){var e,r,s=v.cursor;if(v.in_grouping(d,97,250))if(e=v.cursor,p()){if(v.cursor=e,function(){if(v.in_grouping(d,97,250))for(;!v.out_grouping(d,97,250);){if(v.cursor>=v.limit)return!1;v.cursor++}return i=v.cursor,!0}())return}else i=v.cursor;if(v.cursor=s,v.out_grouping(d,97,250)){if(r=v.cursor,p()){if(v.cursor=r,!v.in_grouping(d,97,250)||v.cursor>=v.limit)return;v.cursor++}i=v.cursor}}function h(){for(;!v.in_grouping(d,97,250);){if(v.cursor>=v.limit)return!1;v.cursor++}for(;!v.out_grouping(d,97,250);){if(v.cursor>=v.limit)return!1;v.cursor++}return!0}function b(){return i<=v.cursor}function g(){return e<=v.cursor}function k(){var e;if(v.ket=v.cursor,!(e=v.find_among_b(m,45)))return!1;switch(v.bra=v.cursor,e){case 1:if(!g())return!1;v.slice_del();break;case 2:if(!g())return!1;v.slice_from("log");break;case 3:if(!g())return!1;v.slice_from("u");break;case 4:if(!g())return!1;v.slice_from("ente");break;case 5:if(!(n<=v.cursor))return!1;v.slice_del(),v.ket=v.cursor,(e=v.find_among_b(t,4))&&(v.bra=v.cursor,g()&&(v.slice_del(),1==e&&(v.ket=v.cursor,v.eq_s_b(2,"at")&&(v.bra=v.cursor,g()&&v.slice_del()))));break;case 6:if(!g())return!1;v.slice_del(),v.ket=v.cursor,(e=v.find_among_b(u,3))&&(v.bra=v.cursor,1==e&&g()&&v.slice_del());break;case 7:if(!g())return!1;v.slice_del(),v.ket=v.cursor,(e=v.find_among_b(w,3))&&(v.bra=v.cursor,1==e&&g()&&v.slice_del());break;case 8:if(!g())return!1;v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"at")&&(v.bra=v.cursor,g()&&v.slice_del());break;case 9:if(!b()||!v.eq_s_b(1,"e"))return!1;v.slice_from("ir")}return!0}function q(e,r){if(v.eq_s_b(1,e)){v.bra=v.cursor;var s=v.limit-v.cursor;if(v.eq_s_b(1,r))return v.cursor=v.limit-s,b()&&v.slice_del(),!1}return!0}function j(){if(!k()&&(v.cursor=v.limit,!function(){var e,r;if(v.cursor>=i){if(r=v.limit_backward,v.limit_backward=i,v.ket=v.cursor,e=v.find_among_b(c,120))return v.bra=v.cursor,1==e&&v.slice_del(),v.limit_backward=r,!0;v.limit_backward=r}return!1}()))return v.cursor=v.limit,v.ket=v.cursor,void((e=v.find_among_b(l,7))&&(v.bra=v.cursor,1==e&&b()&&v.slice_del()));var e;v.cursor=v.limit,v.ket=v.cursor,v.eq_s_b(1,"i")&&(v.bra=v.cursor,v.eq_s_b(1,"c")&&(v.cursor=v.limit,b()&&v.slice_del()))}this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var r,s=v.cursor;return function(){for(var e;;){if(v.bra=v.cursor,e=v.find_among(o,3))switch(v.ket=v.cursor,e){case 1:v.slice_from("a~");continue;case 2:v.slice_from("o~");continue;case 3:if(v.cursor>=v.limit)break;v.cursor++;continue}break}}(),v.cursor=s,r=v.cursor,i=v.limit,n=i,e=i,_(),v.cursor=r,h()&&(n=v.cursor,h()&&(e=v.cursor)),v.limit_backward=s,v.cursor=v.limit,j(),v.cursor=v.limit,function(){var e;if(v.ket=v.cursor,e=v.find_among_b(f,4))switch(v.bra=v.cursor,e){case 1:b()&&(v.slice_del(),v.ket=v.cursor,v.limit,v.cursor,q("u","g")&&q("i","c"));break;case 2:v.slice_from("c")}}(),v.cursor=v.limit_backward,function(){for(var e;;){if(v.bra=v.cursor,e=v.find_among(a,3))switch(v.ket=v.cursor,e){case 1:v.slice_from("ã");continue;case 2:v.slice_from("õ");continue;case 3:if(v.cursor>=v.limit)break;v.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.ro.js b/assets/javascripts/lunr/lunr.ro.js new file mode 100755 index 0000000..155cb56 --- /dev/null +++ b/assets/javascripts/lunr/lunr.ro.js @@ -0,0 +1 @@ +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i,r,n;e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=(i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){var e,n,t,a,o=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],s=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],c=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],u=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],w=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],m=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],l=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],f=new r;function p(e,i){f.eq_s(1,e)&&(f.ket=f.cursor,f.in_grouping(l,97,259)&&f.slice_from(i))}function d(){if(f.out_grouping(l,97,259)){for(;!f.in_grouping(l,97,259);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}return!0}function b(){var e,i,r=f.cursor;if(f.in_grouping(l,97,259)){if(e=f.cursor,!d())return void(a=f.cursor);if(f.cursor=e,!function(){if(f.in_grouping(l,97,259))for(;!f.out_grouping(l,97,259);){if(f.cursor>=f.limit)return!0;f.cursor++}return!1}())return void(a=f.cursor)}f.cursor=r,f.out_grouping(l,97,259)&&(i=f.cursor,d()&&(f.cursor=i,f.in_grouping(l,97,259)&&f.cursor=f.limit)return!1;f.cursor++}for(;!f.out_grouping(l,97,259);){if(f.cursor>=f.limit)return!1;f.cursor++}return!0}function _(){return t<=f.cursor}function g(){var i,r=f.limit-f.cursor;if(f.ket=f.cursor,(i=f.find_among_b(c,46))&&(f.bra=f.cursor,_())){switch(i){case 1:f.slice_from("abil");break;case 2:f.slice_from("ibil");break;case 3:f.slice_from("iv");break;case 4:f.slice_from("ic");break;case 5:f.slice_from("at");break;case 6:f.slice_from("it")}return e=!0,f.cursor=f.limit-r,!0}return!1}function k(){var i,r;for(e=!1;;)if(r=f.limit-f.cursor,!g()){f.cursor=f.limit-r;break}if(f.ket=f.cursor,(i=f.find_among_b(u,62))&&(f.bra=f.cursor,n<=f.cursor)){switch(i){case 1:f.slice_del();break;case 2:f.eq_s_b(1,"ţ")&&(f.bra=f.cursor,f.slice_from("t"));break;case 3:f.slice_from("ist")}e=!0}}function h(){var e;f.ket=f.cursor,(e=f.find_among_b(m,5))&&(f.bra=f.cursor,a<=f.cursor&&1==e&&f.slice_del())}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var i,r=f.cursor;return function(){for(var e,i;e=f.cursor,f.in_grouping(l,97,259)&&(i=f.cursor,f.bra=i,p("u","U"),f.cursor=i,p("i","I")),f.cursor=e,!(f.cursor>=f.limit);)f.cursor++}(),f.cursor=r,i=f.cursor,a=f.limit,t=a,n=a,b(),f.cursor=i,v()&&(t=f.cursor,v()&&(n=f.cursor)),f.limit_backward=r,f.cursor=f.limit,function(){var e,i;if(f.ket=f.cursor,(e=f.find_among_b(s,16))&&(f.bra=f.cursor,_()))switch(e){case 1:f.slice_del();break;case 2:f.slice_from("a");break;case 3:f.slice_from("e");break;case 4:f.slice_from("i");break;case 5:i=f.limit-f.cursor,f.eq_s_b(2,"ab")||(f.cursor=f.limit-i,f.slice_from("i"));break;case 6:f.slice_from("at");break;case 7:f.slice_from("aţi")}}(),f.cursor=f.limit,k(),f.cursor=f.limit,e||(f.cursor=f.limit,function(){var e,i,r;if(f.cursor>=a){if(i=f.limit_backward,f.limit_backward=a,f.ket=f.cursor,e=f.find_among_b(w,94))switch(f.bra=f.cursor,e){case 1:if(r=f.limit-f.cursor,!f.out_grouping_b(l,97,259)&&(f.cursor=f.limit-r,!f.eq_s_b(1,"u")))break;case 2:f.slice_del()}f.limit_backward=i}}(),f.cursor=f.limit),h(),f.cursor=f.limit_backward,function(){for(var e;;){if(f.bra=f.cursor,e=f.find_among(o,3))switch(f.ket=f.cursor,e){case 1:f.slice_from("i");continue;case 2:f.slice_from("u");continue;case 3:if(f.cursor>=f.limit)break;f.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.ru.js b/assets/javascripts/lunr/lunr.ru.js new file mode 100755 index 0000000..078609a --- /dev/null +++ b/assets/javascripts/lunr/lunr.ru.js @@ -0,0 +1 @@ +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var n,r,t;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){var e,t,w=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],i=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],u=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],s=[new n("сь",-1,1),new n("ся",-1,1)],o=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],c=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],m=[new n("ост",-1,1),new n("ость",-1,1)],l=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],f=[33,65,8,232],a=new r;function p(){for(;!a.in_grouping(f,1072,1103);){if(a.cursor>=a.limit)return!1;a.cursor++}return!0}function d(){for(;!a.out_grouping(f,1072,1103);){if(a.cursor>=a.limit)return!1;a.cursor++}return!0}function _(e,n){var r,t;if(a.ket=a.cursor,r=a.find_among_b(e,n)){switch(a.bra=a.cursor,r){case 1:if(t=a.limit-a.cursor,!a.eq_s_b(1,"а")&&(a.cursor=a.limit-t,!a.eq_s_b(1,"я")))return!1;case 2:a.slice_del()}return!0}return!1}function b(e,n){var r;return a.ket=a.cursor,!!(r=a.find_among_b(e,n))&&(a.bra=a.cursor,1==r&&a.slice_del(),!0)}function h(){return!!b(i,26)&&(_(u,8),!0)}function g(){var n;a.ket=a.cursor,(n=a.find_among_b(m,2))&&(a.bra=a.cursor,e<=a.cursor&&1==n&&a.slice_del())}this.setCurrent=function(e){a.setCurrent(e)},this.getCurrent=function(){return a.getCurrent()},this.stem=function(){return t=a.limit,e=t,p()&&(t=a.cursor,d()&&p()&&d()&&(e=a.cursor)),a.cursor=a.limit,!(a.cursor=i&&t[(e-=i)>>3]&1<<(7&e))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&t[(e-=i)>>3]&1<<(7&e))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){if(o>=(_=t[s]).s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;_--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-m.s[_])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var m;if(o>=(m=t[s]).s_size){if(this.cursor=n-m.s_size,!m.method)return m.result;var b=m.method();if(this.cursor=n-m.s_size,b)return m.result}if((s=m.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.sv.js b/assets/javascripts/lunr/lunr.sv.js new file mode 100755 index 0000000..4bb0f9f --- /dev/null +++ b/assets/javascripts/lunr/lunr.sv.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,n,t;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){var e,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new n;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var r,n=m.cursor;return function(){var r,n=m.cursor+3;if(t=m.limit,0<=n||n<=m.limit){for(e=n;;){if(r=m.cursor,m.in_grouping(o,97,246)){m.cursor=r;break}if(m.cursor=r,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,r=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=r),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/lunr.tr.js b/assets/javascripts/lunr/lunr.tr.js new file mode 100755 index 0000000..c42b349 --- /dev/null +++ b/assets/javascripts/lunr/lunr.tr.js @@ -0,0 +1 @@ +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i,e,n;r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=(i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){var r,n=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],t=[new i("leri",-1,-1),new i("ları",-1,-1)],u=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],o=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],s=[new i("a",-1,-1),new i("e",-1,-1)],c=[new i("na",-1,-1),new i("ne",-1,-1)],l=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],a=[new i("nda",-1,-1),new i("nde",-1,-1)],m=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],d=[new i("ndan",-1,-1),new i("nden",-1,-1)],f=[new i("la",-1,-1),new i("le",-1,-1)],b=[new i("ca",-1,-1),new i("ce",-1,-1)],w=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],_=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],k=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],p=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],g=[new i("lar",-1,-1),new i("ler",-1,-1)],y=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],z=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],h=[new i("casına",-1,-1),new i("cesine",-1,-1)],v=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],q=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],C=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],P=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],F=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],S=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],W=[65],L=[65],x=[["a",[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],97,305],["e",[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],101,252],["ı",[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,1],97,305],["i",[17],101,105],["o",W,111,117],["ö",L,246,252],["u",W,111,117]],A=new e;function E(r,i,e){for(;;){var n=A.limit-A.cursor;if(A.in_grouping_b(r,i,e)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return!1;A.cursor--}return!0}function j(){var r,i;r=A.limit-A.cursor,E(F,97,305);for(var e=0;eA.limit_backward&&(A.cursor--,e=A.limit-A.cursor,i()))?(A.cursor=A.limit-e,!0):(A.cursor=A.limit-n,r()?(A.cursor=A.limit-n,!1):(A.cursor=A.limit-n,!(A.cursor<=A.limit_backward)&&(A.cursor--,!!i()&&(A.cursor=A.limit-n,!0))))}function Z(r){return T(r,function(){return A.in_grouping_b(F,97,305)})}function B(){return Z(function(){return A.eq_s_b(1,"n")})}function D(){return Z(function(){return A.eq_s_b(1,"y")})}function G(){return A.find_among_b(n,10)&&T(function(){return A.in_grouping_b(S,105,305)},function(){return A.out_grouping_b(F,97,305)})}function H(){return j()&&A.in_grouping_b(S,105,305)&&Z(function(){return A.eq_s_b(1,"s")})}function I(){return A.find_among_b(t,2)}function J(){return j()&&A.find_among_b(o,4)&&B()}function K(){return j()&&A.find_among_b(l,4)}function M(){return j()&&A.find_among_b(a,2)}function N(){return j()&&A.find_among_b(w,4)&&D()}function O(){return j()&&A.find_among_b(_,4)}function Q(){return j()&&A.find_among_b(k,4)&&D()}function R(){return A.find_among_b(p,4)}function U(){return j()&&A.find_among_b(g,2)}function V(){return j()&&A.find_among_b(z,8)}function X(){return j()&&A.find_among_b(v,32)&&D()}function Y(){return A.find_among_b(q,8)&&D()}function $(){return j()&&A.find_among_b(C,4)&&D()}function rr(){var r=A.limit-A.cursor;return!($()||(A.cursor=A.limit-r,X()||(A.cursor=A.limit-r,Y()||(A.cursor=A.limit-r,A.eq_s_b(3,"ken")&&D()))))}function ir(){if(A.find_among_b(h,2)){var r=A.limit-A.cursor;if(R()||(A.cursor=A.limit-r,U()||(A.cursor=A.limit-r,N()||(A.cursor=A.limit-r,O()||(A.cursor=A.limit-r,Q()||(A.cursor=A.limit-r))))),$())return!1}return!0}function er(){if(!j()||!A.find_among_b(y,4))return!0;var r=A.limit-A.cursor;return!X()&&(A.cursor=A.limit-r,!Y())}function nr(){var i,e,n,t=A.limit-A.cursor;if(A.ket=A.cursor,r=!0,rr()&&(A.cursor=A.limit-t,ir()&&(A.cursor=A.limit-t,function(){if(U()){A.bra=A.cursor,A.slice_del();var i=A.limit-A.cursor;return A.ket=A.cursor,V()||(A.cursor=A.limit-i,X()||(A.cursor=A.limit-i,Y()||(A.cursor=A.limit-i,$()||(A.cursor=A.limit-i)))),r=!1,!1}return!0}()&&(A.cursor=A.limit-t,er()&&(A.cursor=A.limit-t,n=A.limit-A.cursor,!(R()||(A.cursor=A.limit-n,Q()||(A.cursor=A.limit-n,O()||(A.cursor=A.limit-n,N()))))||(A.bra=A.cursor,A.slice_del(),e=A.limit-A.cursor,A.ket=A.cursor,$()||(A.cursor=A.limit-e),0)))))){if(A.cursor=A.limit-t,!V())return;A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,i=A.limit-A.cursor,R()||(A.cursor=A.limit-i,U()||(A.cursor=A.limit-i,N()||(A.cursor=A.limit-i,O()||(A.cursor=A.limit-i,Q()||(A.cursor=A.limit-i))))),$()||(A.cursor=A.limit-i)}A.bra=A.cursor,A.slice_del()}function tr(){var r,i,e,n;if(A.ket=A.cursor,A.eq_s_b(2,"ki")){if(r=A.limit-A.cursor,K())return A.bra=A.cursor,A.slice_del(),i=A.limit-A.cursor,A.ket=A.cursor,U()?(A.bra=A.cursor,A.slice_del(),tr()):(A.cursor=A.limit-i,G()&&(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr()))),!0;if(A.cursor=A.limit-r,J()){if(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,e=A.limit-A.cursor,I())A.bra=A.cursor,A.slice_del();else{if(A.cursor=A.limit-e,A.ket=A.cursor,!G()&&(A.cursor=A.limit-e,!H()&&(A.cursor=A.limit-e,!tr())))return!0;A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr())}return!0}if(A.cursor=A.limit-r,M()){if(n=A.limit-A.cursor,I())A.bra=A.cursor,A.slice_del();else if(A.cursor=A.limit-n,H())A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr());else if(A.cursor=A.limit-n,!tr())return!1;return!0}}return!1}function ur(r){if(A.ket=A.cursor,!M()&&(A.cursor=A.limit-r,!j()||!A.find_among_b(c,2)))return!1;var i=A.limit-A.cursor;if(I())A.bra=A.cursor,A.slice_del();else if(A.cursor=A.limit-i,H())A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr());else if(A.cursor=A.limit-i,!tr())return!1;return!0}function or(r){if(A.ket=A.cursor,!(j()&&A.find_among_b(d,2)||(A.cursor=A.limit-r,j()&&A.find_among_b(u,4))))return!1;var i=A.limit-A.cursor;return!(!H()&&(A.cursor=A.limit-i,!I()))&&(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr()),!0)}function sr(){var r,i=A.limit-A.cursor;return A.ket=A.cursor,!!(J()||(A.cursor=A.limit-i,j()&&A.find_among_b(f,2)&&D()))&&(A.bra=A.cursor,A.slice_del(),r=A.limit-A.cursor,A.ket=A.cursor,!(!U()||(A.bra=A.cursor,A.slice_del(),!tr()))||(A.cursor=A.limit-r,A.ket=A.cursor,!(G()||(A.cursor=A.limit-r,H()||(A.cursor=A.limit-r,tr())))||(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr()),!0)))}function cr(){var r,i,e=A.limit-A.cursor;if(A.ket=A.cursor,!(K()||(A.cursor=A.limit-e,j()&&A.in_grouping_b(S,105,305)&&D()||(A.cursor=A.limit-e,j()&&A.find_among_b(s,2)&&D()))))return!1;if(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,r=A.limit-A.cursor,G())A.bra=A.cursor,A.slice_del(),i=A.limit-A.cursor,A.ket=A.cursor,U()||(A.cursor=A.limit-i);else if(A.cursor=A.limit-r,!U())return!0;return A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,tr(),!0}function lr(){var r,i,e=A.limit-A.cursor;if(A.ket=A.cursor,U())return A.bra=A.cursor,A.slice_del(),void tr();if(A.cursor=A.limit-e,A.ket=A.cursor,j()&&A.find_among_b(b,2)&&B())if(A.bra=A.cursor,A.slice_del(),r=A.limit-A.cursor,A.ket=A.cursor,I())A.bra=A.cursor,A.slice_del();else{if(A.cursor=A.limit-r,A.ket=A.cursor,!G()&&(A.cursor=A.limit-r,!H())){if(A.cursor=A.limit-r,A.ket=A.cursor,!U())return;if(A.bra=A.cursor,A.slice_del(),!tr())return}A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr())}else if(A.cursor=A.limit-e,!ur(e)&&(A.cursor=A.limit-e,!or(e))){if(A.cursor=A.limit-e,A.ket=A.cursor,j()&&A.find_among_b(m,4))return A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,i=A.limit-A.cursor,void(G()?(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr())):(A.cursor=A.limit-i,U()?(A.bra=A.cursor,A.slice_del(),tr()):(A.cursor=A.limit-i,tr())));if(A.cursor=A.limit-e,!sr()){if(A.cursor=A.limit-e,I())return A.bra=A.cursor,void A.slice_del();A.cursor=A.limit-e,tr()||(A.cursor=A.limit-e,cr()||(A.cursor=A.limit-e,A.ket=A.cursor,(G()||(A.cursor=A.limit-e,H()))&&(A.bra=A.cursor,A.slice_del(),A.ket=A.cursor,U()&&(A.bra=A.cursor,A.slice_del(),tr()))))}}}function ar(r,i,e){if(A.cursor=A.limit-r,function(){for(;;){var r=A.limit-A.cursor;if(A.in_grouping_b(F,97,305)){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward)return!1;A.cursor--}return!0}()){var n=A.limit-A.cursor;if(!A.eq_s_b(1,i)&&(A.cursor=A.limit-n,!A.eq_s_b(1,e)))return!0;A.cursor=A.limit-r;var t=A.cursor;return A.insert(A.cursor,A.cursor,e),A.cursor=t,!1}return!0}function mr(r,i,e){for(;!A.eq_s(i,e);){if(A.cursor>=A.limit)return!0;A.cursor++}return i!=A.limit||(A.cursor=r,!1)}function dr(){var r,i,e=A.cursor;return!(!mr(r=A.cursor,2,"ad")||(A.cursor=r,!mr(r,5,"soyad")))&&(A.limit_backward=e,A.cursor=A.limit,i=A.limit-A.cursor,(A.eq_s_b(1,"d")||(A.cursor=A.limit-i,A.eq_s_b(1,"g")))&&ar(i,"a","ı")&&ar(i,"e","i")&&ar(i,"o","u")&&ar(i,"ö","ü"),A.cursor=A.limit,function(){var r;if(A.ket=A.cursor,r=A.find_among_b(P,4))switch(A.bra=A.cursor,r){case 1:A.slice_from("p");break;case 2:A.slice_from("ç");break;case 3:A.slice_from("t");break;case 4:A.slice_from("k")}}(),!0)}this.setCurrent=function(r){A.setCurrent(r)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){return!!(function(){for(var r,i=A.cursor,e=2;;){for(r=A.cursor;!A.in_grouping(F,97,305);){if(A.cursor>=A.limit)return A.cursor=r,!(e>0||(A.cursor=i,0));A.cursor++}e--}}()&&(A.limit_backward=A.cursor,A.cursor=A.limit,nr(),A.cursor=A.limit,r&&(lr(),A.cursor=A.limit_backward,dr())))}},function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js new file mode 100755 index 0000000..f7ec603 --- /dev/null +++ b/assets/javascripts/lunr/tinyseg.js @@ -0,0 +1 @@ +!function(_,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(_.lunr)}(this,function(){return function(_){function t(){var _={"[一二三四五六七八九十百千万億兆]":"M","[一-龠々〆ヵヶ]":"H","[ぁ-ん]":"I","[ァ-ヴーア-ン゙ー]":"K","[a-zA-Za-zA-Z]":"A","[0-90-9]":"N"};for(var t in this.chartype_=[],_){var H=new RegExp;H.compile(t),this.chartype_.push([H,_[t]])}return this.BIAS__=-332,this.BC1__={HH:6,II:2461,KH:406,OH:-1378},this.BC2__={AA:-3267,AI:2744,AN:-878,HH:-4070,HM:-1711,HN:4012,HO:3761,IA:1327,IH:-1184,II:-1332,IK:1721,IO:5492,KI:3831,KK:-8741,MH:-3132,MK:3334,OO:-2920},this.BC3__={HH:996,HI:626,HK:-721,HN:-1307,HO:-836,IH:-301,KK:2762,MK:1079,MM:4034,OA:-1652,OH:266},this.BP1__={BB:295,OB:304,OO:-125,UB:352},this.BP2__={BO:60,OO:-1762},this.BQ1__={BHH:1150,BHM:1521,BII:-1158,BIM:886,BMH:1208,BNH:449,BOH:-91,BOO:-2597,OHI:451,OIH:-296,OKA:1851,OKH:-1020,OKK:904,OOO:2965},this.BQ2__={BHH:118,BHI:-1159,BHM:466,BIH:-919,BKK:-1720,BKO:864,OHH:-1139,OHM:-181,OIH:153,UHI:-1146},this.BQ3__={BHH:-792,BHI:2664,BII:-299,BKI:419,BMH:937,BMM:8335,BNN:998,BOH:775,OHH:2174,OHM:439,OII:280,OKH:1798,OKI:-793,OKO:-2242,OMH:-2402,OOO:11699},this.BQ4__={BHH:-3895,BIH:3761,BII:-4654,BIK:1348,BKK:-1806,BMI:-3385,BOO:-12396,OAH:926,OHH:266,OHK:-2036,ONN:-973},this.BW1__={",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682},this.BW2__={"..":-11822,11:-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669},this.BW3__={"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1e3,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990},this.TC1__={AAA:1093,HHH:1029,HHM:580,HII:998,HOH:-390,HOM:-331,IHI:1169,IOH:-142,IOI:-1015,IOM:467,MMH:187,OOI:-1832},this.TC2__={HHO:2088,HII:-1023,HMM:-1154,IHI:-1965,KKH:703,OII:-2649},this.TC3__={AAA:-294,HHH:346,HHI:-341,HII:-1088,HIK:731,HOH:-1486,IHH:128,IHI:-3041,IHO:-1935,IIH:-825,IIM:-1035,IOI:-542,KHH:-1216,KKA:491,KKH:-1217,KOK:-1009,MHH:-2694,MHM:-457,MHO:123,MMH:-471,NNH:-1689,NNO:662,OHO:-3393},this.TC4__={HHH:-203,HHI:1344,HHK:365,HHM:-122,HHN:182,HHO:669,HIH:804,HII:679,HOH:446,IHH:695,IHO:-2324,IIH:321,III:1497,IIO:656,IOO:54,KAK:4845,KKA:3386,KKK:3065,MHH:-405,MHI:201,MMH:-241,MMM:661,MOM:841},this.TQ1__={BHHH:-227,BHHI:316,BHIH:-132,BIHH:60,BIII:1595,BNHH:-744,BOHH:225,BOOO:-908,OAKK:482,OHHH:281,OHIH:249,OIHI:200,OIIH:-68},this.TQ2__={BIHH:-1401,BIII:-1033,BKAK:-543,BOOO:-5591},this.TQ3__={BHHH:478,BHHM:-1073,BHIH:222,BHII:-504,BIIH:-116,BIII:-105,BMHI:-863,BMHM:-464,BOMH:620,OHHH:346,OHHI:1729,OHII:997,OHMH:481,OIHH:623,OIIH:1344,OKAK:2792,OKHH:587,OKKA:679,OOHH:110,OOII:-685},this.TQ4__={BHHH:-721,BHHM:-3604,BHII:-966,BIIH:-607,BIII:-2181,OAAA:-2763,OAKK:180,OHHH:-294,OHHI:2446,OHHO:480,OHIH:-1573,OIHH:1935,OIHI:-493,OIIH:626,OIII:-4007,OKAK:-8156},this.TW1__={"につい":-4681,"東京都":2026},this.TW2__={"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216},this.TW3__={"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287},this.TW4__={"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865},this.UC1__={A:484,K:93,M:645,O:-505},this.UC2__={A:819,H:1059,I:409,M:3987,N:5775,O:646},this.UC3__={A:-1370,I:2311},this.UC4__={A:-2643,H:1809,I:-1032,K:-3450,M:3565,N:3876,O:6646},this.UC5__={H:313,I:-1238,K:-799,M:539,O:-831},this.UC6__={H:-506,I:-253,K:87,M:247,O:-387},this.UP1__={O:-214},this.UP2__={B:69,O:935},this.UP3__={B:189},this.UQ1__={BH:21,BI:-12,BK:-99,BN:142,BO:-56,OH:-95,OI:477,OK:410,OO:-2422},this.UQ2__={BH:216,BI:113,OK:1759},this.UQ3__={BA:-479,BH:42,BI:1913,BK:-7198,BM:3160,BN:6427,BO:14761,OI:-827,ON:-3212},this.UW1__={",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135},this.UW2__={",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568},this.UW3__={",":4889,1:-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278},this.UW4__={",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1e3,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637},this.UW5__={",":465,".":-299,1:-514,E2:-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343},this.UW6__={",":227,".":808,1:-270,E1:306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496},this}t.prototype.ctype_=function(_){for(var t in this.chartype_)if(_.match(this.chartype_[t][0]))return this.chartype_[t][1];return"O"},t.prototype.ts_=function(_){return _||0},t.prototype.segment=function(_){if(null==_||null==_||""==_)return[];var t=[],H=["B3","B2","B1"],s=["O","O","O"],h=_.split("");for(K=0;K0&&(t.push(i),i="",N="B"),I=O,O=B,B=N,i+=H[K]}return t.push(i),t},_.TinySegmenter=t}}); \ No newline at end of file diff --git a/assets/javascripts/modernizr.1aa3b519.js b/assets/javascripts/modernizr.1aa3b519.js new file mode 100755 index 0000000..14e111f --- /dev/null +++ b/assets/javascripts/modernizr.1aa3b519.js @@ -0,0 +1 @@ +!function(e,t){for(var n in t)e[n]=t[n]}(window,function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}({4:function(e,t,n){"use strict";n(5)},5:function(e,t){!function(t){!function(e,t,n){function r(e,t){return typeof e===t}function o(e){var t=_.className,n=C._config.classPrefix||"";if(T&&(t=t.baseVal),C._config.enableJSClass){var r=new RegExp("(^|\\s)"+n+"no-js(\\s|$)");t=t.replace(r,"$1"+n+"js$2")}C._config.enableClasses&&(t+=" "+n+e.join(" "+n),T?_.className.baseVal=t:_.className=t)}function i(e,t){if("object"==typeof e)for(var n in e)b(e,n)&&i(n,e[n]);else{e=e.toLowerCase();var r=e.split("."),s=C[r[0]];if(2==r.length&&(s=s[r[1]]),void 0!==s)return C;t="function"==typeof t?t():t,1==r.length?C[r[0]]=t:(!C[r[0]]||C[r[0]]instanceof Boolean||(C[r[0]]=new Boolean(C[r[0]])),C[r[0]][r[1]]=t),o([(t&&0!=t?"":"no-")+r.join("-")]),C._trigger(e,t)}return C}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):T?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function a(){var e=t.body;return e||(e=s(T?"svg":"body"),e.fake=!0),e}function u(e,n,r,o){var i,u,l,f,c="modernizr",d=s("div"),p=a();if(parseInt(r,10))for(;r--;)l=s("div"),l.id=o?o[r]:c+(r+1),d.appendChild(l);return i=s("style"),i.type="text/css",i.id="s"+c,(p.fake?p:d).appendChild(i),p.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),d.id=c,p.fake&&(p.style.background="",p.style.overflow="hidden",f=_.style.overflow,_.style.overflow="hidden",_.appendChild(p)),u=n(d,e),p.fake?(p.parentNode.removeChild(p),_.style.overflow=f,_.offsetHeight):d.parentNode.removeChild(d),!!u}function l(e,t){return!!~(""+e).indexOf(t)}function f(e){return e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}).replace(/^ms-/,"-ms-")}function c(t,n,r){var o;if("getComputedStyle"in e){o=getComputedStyle.call(e,t,n);var i=e.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!n&&t.currentStyle&&t.currentStyle[r];return o}function d(t,r){var o=t.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(f(t[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var i=[];o--;)i.push("("+f(t[o])+":"+r+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"==c(e,null,"position")})}return n}function p(e){return e.replace(/([a-z])-([a-z])/g,function(e,t,n){return t+n.toUpperCase()}).replace(/^-/,"")}function h(e,t,o,i){function a(){f&&(delete j.style,delete j.modElem)}if(i=!r(i,"undefined")&&i,!r(o,"undefined")){var u=d(e,o);if(!r(u,"undefined"))return u}for(var f,c,h,m,v,g=["modernizr","tspan","samp"];!j.style&&g.length;)f=!0,j.modElem=s(g.shift()),j.style=j.modElem.style;for(h=e.length,c=0;h>c;c++)if(m=e[c],v=j.style[m],l(m,"-")&&(m=p(m)),j.style[m]!==n){if(i||r(o,"undefined"))return a(),"pfx"!=t||m;try{j.style[m]=o}catch(e){}if(j.style[m]!=v)return a(),"pfx"!=t||m}return a(),!1}function m(e,t){return function(){return e.apply(t,arguments)}}function v(e,t,n){var o;for(var i in e)if(e[i]in t)return!1===n?e[i]:(o=t[e[i]],r(o,"function")?m(o,n||t):o);return!1}function g(e,t,n,o,i){var s=e.charAt(0).toUpperCase()+e.slice(1),a=(e+" "+k.join(s+" ")+s).split(" ");return r(t,"string")||r(t,"undefined")?h(a,t,o,i):(a=(e+" "+A.join(s+" ")+s).split(" "),v(a,t,n))}function y(e,t,r){return g(e,n,n,t,r)}var w=[],S={_version:"3.5.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,t){var n=this;setTimeout(function(){t(n[e])},0)},addTest:function(e,t,n){w.push({name:e,fn:t,options:n})},addAsyncTest:function(e){w.push({name:null,fn:e})}},C=function(){};C.prototype=S,C=new C;var b,x=[],_=t.documentElement,T="svg"===_.nodeName.toLowerCase();!function(){var e={}.hasOwnProperty;b=r(e,"undefined")||r(e.call,"undefined")?function(e,t){return t in e&&r(e.constructor.prototype[t],"undefined")}:function(t,n){return e.call(t,n)}}(),S._l={},S.on=function(e,t){this._l[e]||(this._l[e]=[]),this._l[e].push(t),C.hasOwnProperty(e)&&setTimeout(function(){C._trigger(e,C[e])},0)},S._trigger=function(e,t){if(this._l[e]){var n=this._l[e];setTimeout(function(){var e;for(e=0;e .md-nav__link { + color: inherit; } + +button[data-md-color-primary="pink"] { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-typeset a { + color: #e91e63; } + +[data-md-color-primary="pink"] .md-header { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-hero { + background-color: #e91e63; } + +[data-md-color-primary="pink"] .md-nav__link:active, +[data-md-color-primary="pink"] .md-nav__link--active { + color: #e91e63; } + +[data-md-color-primary="pink"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="purple"] { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-typeset a { + color: #ab47bc; } + +[data-md-color-primary="purple"] .md-header { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-hero { + background-color: #ab47bc; } + +[data-md-color-primary="purple"] .md-nav__link:active, +[data-md-color-primary="purple"] .md-nav__link--active { + color: #ab47bc; } + +[data-md-color-primary="purple"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="deep-purple"] { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-typeset a { + color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-header { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-hero { + background-color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-nav__link:active, +[data-md-color-primary="deep-purple"] .md-nav__link--active { + color: #7e57c2; } + +[data-md-color-primary="deep-purple"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="indigo"] { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-typeset a { + color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-header { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-hero { + background-color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-nav__link:active, +[data-md-color-primary="indigo"] .md-nav__link--active { + color: #3f51b5; } + +[data-md-color-primary="indigo"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="blue"] { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-typeset a { + color: #2196f3; } + +[data-md-color-primary="blue"] .md-header { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-hero { + background-color: #2196f3; } + +[data-md-color-primary="blue"] .md-nav__link:active, +[data-md-color-primary="blue"] .md-nav__link--active { + color: #2196f3; } + +[data-md-color-primary="blue"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="light-blue"] { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-typeset a { + color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-header { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-hero { + background-color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-nav__link:active, +[data-md-color-primary="light-blue"] .md-nav__link--active { + color: #03a9f4; } + +[data-md-color-primary="light-blue"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="cyan"] { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-typeset a { + color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-header { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-hero { + background-color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-nav__link:active, +[data-md-color-primary="cyan"] .md-nav__link--active { + color: #00bcd4; } + +[data-md-color-primary="cyan"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="teal"] { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-typeset a { + color: #009688; } + +[data-md-color-primary="teal"] .md-header { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-hero { + background-color: #009688; } + +[data-md-color-primary="teal"] .md-nav__link:active, +[data-md-color-primary="teal"] .md-nav__link--active { + color: #009688; } + +[data-md-color-primary="teal"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="green"] { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-typeset a { + color: #4caf50; } + +[data-md-color-primary="green"] .md-header { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-hero { + background-color: #4caf50; } + +[data-md-color-primary="green"] .md-nav__link:active, +[data-md-color-primary="green"] .md-nav__link--active { + color: #4caf50; } + +[data-md-color-primary="green"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="light-green"] { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-typeset a { + color: #7cb342; } + +[data-md-color-primary="light-green"] .md-header { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-hero { + background-color: #7cb342; } + +[data-md-color-primary="light-green"] .md-nav__link:active, +[data-md-color-primary="light-green"] .md-nav__link--active { + color: #7cb342; } + +[data-md-color-primary="light-green"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="lime"] { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-typeset a { + color: #c0ca33; } + +[data-md-color-primary="lime"] .md-header { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-hero { + background-color: #c0ca33; } + +[data-md-color-primary="lime"] .md-nav__link:active, +[data-md-color-primary="lime"] .md-nav__link--active { + color: #c0ca33; } + +[data-md-color-primary="lime"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="yellow"] { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-typeset a { + color: #f9a825; } + +[data-md-color-primary="yellow"] .md-header { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-hero { + background-color: #f9a825; } + +[data-md-color-primary="yellow"] .md-nav__link:active, +[data-md-color-primary="yellow"] .md-nav__link--active { + color: #f9a825; } + +[data-md-color-primary="yellow"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="amber"] { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-typeset a { + color: #ffa000; } + +[data-md-color-primary="amber"] .md-header { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-hero { + background-color: #ffa000; } + +[data-md-color-primary="amber"] .md-nav__link:active, +[data-md-color-primary="amber"] .md-nav__link--active { + color: #ffa000; } + +[data-md-color-primary="amber"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="orange"] { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-typeset a { + color: #fb8c00; } + +[data-md-color-primary="orange"] .md-header { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-hero { + background-color: #fb8c00; } + +[data-md-color-primary="orange"] .md-nav__link:active, +[data-md-color-primary="orange"] .md-nav__link--active { + color: #fb8c00; } + +[data-md-color-primary="orange"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="deep-orange"] { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-typeset a { + color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-header { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-hero { + background-color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-nav__link:active, +[data-md-color-primary="deep-orange"] .md-nav__link--active { + color: #ff7043; } + +[data-md-color-primary="deep-orange"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="brown"] { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-typeset a { + color: #795548; } + +[data-md-color-primary="brown"] .md-header { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-hero { + background-color: #795548; } + +[data-md-color-primary="brown"] .md-nav__link:active, +[data-md-color-primary="brown"] .md-nav__link--active { + color: #795548; } + +[data-md-color-primary="brown"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="grey"] { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-typeset a { + color: #757575; } + +[data-md-color-primary="grey"] .md-header { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-hero { + background-color: #757575; } + +[data-md-color-primary="grey"] .md-nav__link:active, +[data-md-color-primary="grey"] .md-nav__link--active { + color: #757575; } + +[data-md-color-primary="grey"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="blue-grey"] { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-typeset a { + color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-header { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-hero { + background-color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-nav__link:active, +[data-md-color-primary="blue-grey"] .md-nav__link--active { + color: #546e7a; } + +[data-md-color-primary="blue-grey"] .md-nav__item--nested > .md-nav__link { + color: inherit; } + +button[data-md-color-primary="white"] { + background-color: white; + color: rgba(0, 0, 0, 0.87); + box-shadow: 0 0 0.1rem rgba(0, 0, 0, 0.54) inset; } + +[data-md-color-primary="white"] .md-header { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + +[data-md-color-primary="white"] .md-hero { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + [data-md-color-primary="white"] .md-hero--expand { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); } + +button[data-md-color-accent="red"] { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset a:hover, +[data-md-color-accent="red"] .md-typeset a:active { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="red"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="red"] .md-typeset .md-clipboard:active::before { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="red"] .md-typeset .footnote li:target .footnote-backref { + color: #ff1744; } + +[data-md-color-accent="red"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="red"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="red"] .md-typeset [id] .headerlink:focus { + color: #ff1744; } + +[data-md-color-accent="red"] .md-nav__link:focus, +[data-md-color-accent="red"] .md-nav__link:hover { + color: #ff1744; } + +[data-md-color-accent="red"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="red"] .md-search-result__link:hover { + background-color: rgba(255, 23, 68, 0.1); } + +[data-md-color-accent="red"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff1744; } + +[data-md-color-accent="red"] .md-source-file:hover::before { + background-color: #ff1744; } + +button[data-md-color-accent="pink"] { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset a:hover, +[data-md-color-accent="pink"] .md-typeset a:active { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="pink"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="pink"] .md-typeset .md-clipboard:active::before { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="pink"] .md-typeset .footnote li:target .footnote-backref { + color: #f50057; } + +[data-md-color-accent="pink"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="pink"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="pink"] .md-typeset [id] .headerlink:focus { + color: #f50057; } + +[data-md-color-accent="pink"] .md-nav__link:focus, +[data-md-color-accent="pink"] .md-nav__link:hover { + color: #f50057; } + +[data-md-color-accent="pink"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="pink"] .md-search-result__link:hover { + background-color: rgba(245, 0, 87, 0.1); } + +[data-md-color-accent="pink"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #f50057; } + +[data-md-color-accent="pink"] .md-source-file:hover::before { + background-color: #f50057; } + +button[data-md-color-accent="purple"] { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset a:hover, +[data-md-color-accent="purple"] .md-typeset a:active { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="purple"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="purple"] .md-typeset .md-clipboard:active::before { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="purple"] .md-typeset .footnote li:target .footnote-backref { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="purple"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="purple"] .md-typeset [id] .headerlink:focus { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-nav__link:focus, +[data-md-color-accent="purple"] .md-nav__link:hover { + color: #e040fb; } + +[data-md-color-accent="purple"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="purple"] .md-search-result__link:hover { + background-color: rgba(224, 64, 251, 0.1); } + +[data-md-color-accent="purple"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #e040fb; } + +[data-md-color-accent="purple"] .md-source-file:hover::before { + background-color: #e040fb; } + +button[data-md-color-accent="deep-purple"] { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset a:hover, +[data-md-color-accent="deep-purple"] .md-typeset a:active { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="deep-purple"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="deep-purple"] .md-typeset .md-clipboard:active::before { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="deep-purple"] .md-typeset .footnote li:target .footnote-backref { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="deep-purple"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="deep-purple"] .md-typeset [id] .headerlink:focus { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-nav__link:focus, +[data-md-color-accent="deep-purple"] .md-nav__link:hover { + color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="deep-purple"] .md-search-result__link:hover { + background-color: rgba(124, 77, 255, 0.1); } + +[data-md-color-accent="deep-purple"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #7c4dff; } + +[data-md-color-accent="deep-purple"] .md-source-file:hover::before { + background-color: #7c4dff; } + +button[data-md-color-accent="indigo"] { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset a:hover, +[data-md-color-accent="indigo"] .md-typeset a:active { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="indigo"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="indigo"] .md-typeset .md-clipboard:active::before { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="indigo"] .md-typeset .footnote li:target .footnote-backref { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="indigo"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="indigo"] .md-typeset [id] .headerlink:focus { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-nav__link:focus, +[data-md-color-accent="indigo"] .md-nav__link:hover { + color: #536dfe; } + +[data-md-color-accent="indigo"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="indigo"] .md-search-result__link:hover { + background-color: rgba(83, 109, 254, 0.1); } + +[data-md-color-accent="indigo"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +[data-md-color-accent="indigo"] .md-source-file:hover::before { + background-color: #536dfe; } + +button[data-md-color-accent="blue"] { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset a:hover, +[data-md-color-accent="blue"] .md-typeset a:active { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="blue"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="blue"] .md-typeset .md-clipboard:active::before { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="blue"] .md-typeset .footnote li:target .footnote-backref { + color: #448aff; } + +[data-md-color-accent="blue"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="blue"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="blue"] .md-typeset [id] .headerlink:focus { + color: #448aff; } + +[data-md-color-accent="blue"] .md-nav__link:focus, +[data-md-color-accent="blue"] .md-nav__link:hover { + color: #448aff; } + +[data-md-color-accent="blue"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="blue"] .md-search-result__link:hover { + background-color: rgba(68, 138, 255, 0.1); } + +[data-md-color-accent="blue"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #448aff; } + +[data-md-color-accent="blue"] .md-source-file:hover::before { + background-color: #448aff; } + +button[data-md-color-accent="light-blue"] { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset a:hover, +[data-md-color-accent="light-blue"] .md-typeset a:active { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="light-blue"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="light-blue"] .md-typeset .md-clipboard:active::before { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="light-blue"] .md-typeset .footnote li:target .footnote-backref { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="light-blue"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="light-blue"] .md-typeset [id] .headerlink:focus { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-nav__link:focus, +[data-md-color-accent="light-blue"] .md-nav__link:hover { + color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="light-blue"] .md-search-result__link:hover { + background-color: rgba(0, 145, 234, 0.1); } + +[data-md-color-accent="light-blue"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #0091ea; } + +[data-md-color-accent="light-blue"] .md-source-file:hover::before { + background-color: #0091ea; } + +button[data-md-color-accent="cyan"] { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset a:hover, +[data-md-color-accent="cyan"] .md-typeset a:active { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="cyan"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="cyan"] .md-typeset .md-clipboard:active::before { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="cyan"] .md-typeset .footnote li:target .footnote-backref { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="cyan"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="cyan"] .md-typeset [id] .headerlink:focus { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-nav__link:focus, +[data-md-color-accent="cyan"] .md-nav__link:hover { + color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="cyan"] .md-search-result__link:hover { + background-color: rgba(0, 184, 212, 0.1); } + +[data-md-color-accent="cyan"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00b8d4; } + +[data-md-color-accent="cyan"] .md-source-file:hover::before { + background-color: #00b8d4; } + +button[data-md-color-accent="teal"] { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset a:hover, +[data-md-color-accent="teal"] .md-typeset a:active { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="teal"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="teal"] .md-typeset .md-clipboard:active::before { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="teal"] .md-typeset .footnote li:target .footnote-backref { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="teal"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="teal"] .md-typeset [id] .headerlink:focus { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-nav__link:focus, +[data-md-color-accent="teal"] .md-nav__link:hover { + color: #00bfa5; } + +[data-md-color-accent="teal"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="teal"] .md-search-result__link:hover { + background-color: rgba(0, 191, 165, 0.1); } + +[data-md-color-accent="teal"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00bfa5; } + +[data-md-color-accent="teal"] .md-source-file:hover::before { + background-color: #00bfa5; } + +button[data-md-color-accent="green"] { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-typeset a:hover, +[data-md-color-accent="green"] .md-typeset a:active { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="green"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="green"] .md-typeset .md-clipboard:active::before { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="green"] .md-typeset .footnote li:target .footnote-backref { + color: #00c853; } + +[data-md-color-accent="green"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="green"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="green"] .md-typeset [id] .headerlink:focus { + color: #00c853; } + +[data-md-color-accent="green"] .md-nav__link:focus, +[data-md-color-accent="green"] .md-nav__link:hover { + color: #00c853; } + +[data-md-color-accent="green"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="green"] .md-search-result__link:hover { + background-color: rgba(0, 200, 83, 0.1); } + +[data-md-color-accent="green"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #00c853; } + +[data-md-color-accent="green"] .md-source-file:hover::before { + background-color: #00c853; } + +button[data-md-color-accent="light-green"] { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset a:hover, +[data-md-color-accent="light-green"] .md-typeset a:active { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="light-green"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="light-green"] .md-typeset .md-clipboard:active::before { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="light-green"] .md-typeset .footnote li:target .footnote-backref { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="light-green"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="light-green"] .md-typeset [id] .headerlink:focus { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-nav__link:focus, +[data-md-color-accent="light-green"] .md-nav__link:hover { + color: #64dd17; } + +[data-md-color-accent="light-green"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="light-green"] .md-search-result__link:hover { + background-color: rgba(100, 221, 23, 0.1); } + +[data-md-color-accent="light-green"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #64dd17; } + +[data-md-color-accent="light-green"] .md-source-file:hover::before { + background-color: #64dd17; } + +button[data-md-color-accent="lime"] { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset a:hover, +[data-md-color-accent="lime"] .md-typeset a:active { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="lime"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="lime"] .md-typeset .md-clipboard:active::before { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="lime"] .md-typeset .footnote li:target .footnote-backref { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="lime"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="lime"] .md-typeset [id] .headerlink:focus { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-nav__link:focus, +[data-md-color-accent="lime"] .md-nav__link:hover { + color: #aeea00; } + +[data-md-color-accent="lime"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="lime"] .md-search-result__link:hover { + background-color: rgba(174, 234, 0, 0.1); } + +[data-md-color-accent="lime"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #aeea00; } + +[data-md-color-accent="lime"] .md-source-file:hover::before { + background-color: #aeea00; } + +button[data-md-color-accent="yellow"] { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset a:hover, +[data-md-color-accent="yellow"] .md-typeset a:active { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="yellow"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="yellow"] .md-typeset .md-clipboard:active::before { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="yellow"] .md-typeset .footnote li:target .footnote-backref { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="yellow"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="yellow"] .md-typeset [id] .headerlink:focus { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-nav__link:focus, +[data-md-color-accent="yellow"] .md-nav__link:hover { + color: #ffd600; } + +[data-md-color-accent="yellow"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="yellow"] .md-search-result__link:hover { + background-color: rgba(255, 214, 0, 0.1); } + +[data-md-color-accent="yellow"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffd600; } + +[data-md-color-accent="yellow"] .md-source-file:hover::before { + background-color: #ffd600; } + +button[data-md-color-accent="amber"] { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset a:hover, +[data-md-color-accent="amber"] .md-typeset a:active { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="amber"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="amber"] .md-typeset .md-clipboard:active::before { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="amber"] .md-typeset .footnote li:target .footnote-backref { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="amber"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="amber"] .md-typeset [id] .headerlink:focus { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-nav__link:focus, +[data-md-color-accent="amber"] .md-nav__link:hover { + color: #ffab00; } + +[data-md-color-accent="amber"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="amber"] .md-search-result__link:hover { + background-color: rgba(255, 171, 0, 0.1); } + +[data-md-color-accent="amber"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ffab00; } + +[data-md-color-accent="amber"] .md-source-file:hover::before { + background-color: #ffab00; } + +button[data-md-color-accent="orange"] { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset a:hover, +[data-md-color-accent="orange"] .md-typeset a:active { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="orange"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="orange"] .md-typeset .md-clipboard:active::before { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="orange"] .md-typeset .footnote li:target .footnote-backref { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="orange"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="orange"] .md-typeset [id] .headerlink:focus { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-nav__link:focus, +[data-md-color-accent="orange"] .md-nav__link:hover { + color: #ff9100; } + +[data-md-color-accent="orange"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="orange"] .md-search-result__link:hover { + background-color: rgba(255, 145, 0, 0.1); } + +[data-md-color-accent="orange"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff9100; } + +[data-md-color-accent="orange"] .md-source-file:hover::before { + background-color: #ff9100; } + +button[data-md-color-accent="deep-orange"] { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset a:hover, +[data-md-color-accent="deep-orange"] .md-typeset a:active { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset pre code::-webkit-scrollbar-thumb:hover, +[data-md-color-accent="deep-orange"] .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset .md-clipboard:hover::before, +[data-md-color-accent="deep-orange"] .md-typeset .md-clipboard:active::before { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset .footnote li:hover .footnote-backref:hover, +[data-md-color-accent="deep-orange"] .md-typeset .footnote li:target .footnote-backref { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-typeset [id]:hover .headerlink:hover, +[data-md-color-accent="deep-orange"] .md-typeset [id]:target .headerlink, +[data-md-color-accent="deep-orange"] .md-typeset [id] .headerlink:focus { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-nav__link:focus, +[data-md-color-accent="deep-orange"] .md-nav__link:hover { + color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-search-result__link[data-md-state="active"], [data-md-color-accent="deep-orange"] .md-search-result__link:hover { + background-color: rgba(255, 110, 64, 0.1); } + +[data-md-color-accent="deep-orange"] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #ff6e40; } + +[data-md-color-accent="deep-orange"] .md-source-file:hover::before { + background-color: #ff6e40; } + +@media only screen and (max-width: 59.9375em) { + [data-md-color-primary="red"] .md-nav__source { + background-color: rgba(190, 66, 64, 0.9675); } + [data-md-color-primary="pink"] .md-nav__source { + background-color: rgba(185, 24, 79, 0.9675); } + [data-md-color-primary="purple"] .md-nav__source { + background-color: rgba(136, 57, 150, 0.9675); } + [data-md-color-primary="deep-purple"] .md-nav__source { + background-color: rgba(100, 69, 154, 0.9675); } + [data-md-color-primary="indigo"] .md-nav__source { + background-color: rgba(50, 64, 144, 0.9675); } + [data-md-color-primary="blue"] .md-nav__source { + background-color: rgba(26, 119, 193, 0.9675); } + [data-md-color-primary="light-blue"] .md-nav__source { + background-color: rgba(2, 134, 194, 0.9675); } + [data-md-color-primary="cyan"] .md-nav__source { + background-color: rgba(0, 150, 169, 0.9675); } + [data-md-color-primary="teal"] .md-nav__source { + background-color: rgba(0, 119, 108, 0.9675); } + [data-md-color-primary="green"] .md-nav__source { + background-color: rgba(60, 139, 64, 0.9675); } + [data-md-color-primary="light-green"] .md-nav__source { + background-color: rgba(99, 142, 53, 0.9675); } + [data-md-color-primary="lime"] .md-nav__source { + background-color: rgba(153, 161, 41, 0.9675); } + [data-md-color-primary="yellow"] .md-nav__source { + background-color: rgba(198, 134, 29, 0.9675); } + [data-md-color-primary="amber"] .md-nav__source { + background-color: rgba(203, 127, 0, 0.9675); } + [data-md-color-primary="orange"] .md-nav__source { + background-color: rgba(200, 111, 0, 0.9675); } + [data-md-color-primary="deep-orange"] .md-nav__source { + background-color: rgba(203, 89, 53, 0.9675); } + [data-md-color-primary="brown"] .md-nav__source { + background-color: rgba(96, 68, 57, 0.9675); } + [data-md-color-primary="grey"] .md-nav__source { + background-color: rgba(93, 93, 93, 0.9675); } + [data-md-color-primary="blue-grey"] .md-nav__source { + background-color: rgba(67, 88, 97, 0.9675); } + [data-md-color-primary="white"] .md-nav__source { + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.87); } } + +@media only screen and (max-width: 76.1875em) { + html [data-md-color-primary="red"] .md-nav--primary .md-nav__title--site { + background-color: #ef5350; } + html [data-md-color-primary="pink"] .md-nav--primary .md-nav__title--site { + background-color: #e91e63; } + html [data-md-color-primary="purple"] .md-nav--primary .md-nav__title--site { + background-color: #ab47bc; } + html [data-md-color-primary="deep-purple"] .md-nav--primary .md-nav__title--site { + background-color: #7e57c2; } + html [data-md-color-primary="indigo"] .md-nav--primary .md-nav__title--site { + background-color: #3f51b5; } + html [data-md-color-primary="blue"] .md-nav--primary .md-nav__title--site { + background-color: #2196f3; } + html [data-md-color-primary="light-blue"] .md-nav--primary .md-nav__title--site { + background-color: #03a9f4; } + html [data-md-color-primary="cyan"] .md-nav--primary .md-nav__title--site { + background-color: #00bcd4; } + html [data-md-color-primary="teal"] .md-nav--primary .md-nav__title--site { + background-color: #009688; } + html [data-md-color-primary="green"] .md-nav--primary .md-nav__title--site { + background-color: #4caf50; } + html [data-md-color-primary="light-green"] .md-nav--primary .md-nav__title--site { + background-color: #7cb342; } + html [data-md-color-primary="lime"] .md-nav--primary .md-nav__title--site { + background-color: #c0ca33; } + html [data-md-color-primary="yellow"] .md-nav--primary .md-nav__title--site { + background-color: #f9a825; } + html [data-md-color-primary="amber"] .md-nav--primary .md-nav__title--site { + background-color: #ffa000; } + html [data-md-color-primary="orange"] .md-nav--primary .md-nav__title--site { + background-color: #fb8c00; } + html [data-md-color-primary="deep-orange"] .md-nav--primary .md-nav__title--site { + background-color: #ff7043; } + html [data-md-color-primary="brown"] .md-nav--primary .md-nav__title--site { + background-color: #795548; } + html [data-md-color-primary="grey"] .md-nav--primary .md-nav__title--site { + background-color: #757575; } + html [data-md-color-primary="blue-grey"] .md-nav--primary .md-nav__title--site { + background-color: #546e7a; } + html [data-md-color-primary="white"] .md-nav--primary .md-nav__title--site { + background-color: white; + color: rgba(0, 0, 0, 0.87); } + [data-md-color-primary="white"] .md-hero { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); } } + +@media only screen and (min-width: 76.25em) { + [data-md-color-primary="red"] .md-tabs { + background-color: #ef5350; } + [data-md-color-primary="pink"] .md-tabs { + background-color: #e91e63; } + [data-md-color-primary="purple"] .md-tabs { + background-color: #ab47bc; } + [data-md-color-primary="deep-purple"] .md-tabs { + background-color: #7e57c2; } + [data-md-color-primary="indigo"] .md-tabs { + background-color: #3f51b5; } + [data-md-color-primary="blue"] .md-tabs { + background-color: #2196f3; } + [data-md-color-primary="light-blue"] .md-tabs { + background-color: #03a9f4; } + [data-md-color-primary="cyan"] .md-tabs { + background-color: #00bcd4; } + [data-md-color-primary="teal"] .md-tabs { + background-color: #009688; } + [data-md-color-primary="green"] .md-tabs { + background-color: #4caf50; } + [data-md-color-primary="light-green"] .md-tabs { + background-color: #7cb342; } + [data-md-color-primary="lime"] .md-tabs { + background-color: #c0ca33; } + [data-md-color-primary="yellow"] .md-tabs { + background-color: #f9a825; } + [data-md-color-primary="amber"] .md-tabs { + background-color: #ffa000; } + [data-md-color-primary="orange"] .md-tabs { + background-color: #fb8c00; } + [data-md-color-primary="deep-orange"] .md-tabs { + background-color: #ff7043; } + [data-md-color-primary="brown"] .md-tabs { + background-color: #795548; } + [data-md-color-primary="grey"] .md-tabs { + background-color: #757575; } + [data-md-color-primary="blue-grey"] .md-tabs { + background-color: #546e7a; } + [data-md-color-primary="white"] .md-tabs { + border-bottom: 0.1rem solid rgba(0, 0, 0, 0.07); + background-color: white; + color: rgba(0, 0, 0, 0.87); } } + +@media only screen and (min-width: 60em) { + [data-md-color-primary="white"] .md-search__input { + background-color: rgba(0, 0, 0, 0.07); } + [data-md-color-primary="white"] .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-color-primary="white"] .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } } + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJhc3NldHMvc3R5bGVzaGVldHMvYXBwbGljYXRpb24tcGFsZXR0ZS4yMjkxNTEyNi5jc3MiLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/assets/stylesheets/application.451f80e5.css b/assets/stylesheets/application.451f80e5.css new file mode 100755 index 0000000..ec03938 --- /dev/null +++ b/assets/stylesheets/application.451f80e5.css @@ -0,0 +1,2552 @@ +@charset "UTF-8"; +html { + box-sizing: border-box; } + +*, +*::before, +*::after { + box-sizing: inherit; } + +html { + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + -ms-text-size-adjust: none; + text-size-adjust: none; } + +body { + margin: 0; } + +hr { + overflow: visible; + box-sizing: content-box; } + +a { + -webkit-text-decoration-skip: objects; } + +a, +button, +label, +input { + -webkit-tap-highlight-color: transparent; } + +a { + color: inherit; + text-decoration: none; } + +small { + font-size: 80%; } + +sub, +sup { + position: relative; + font-size: 80%; + line-height: 0; + vertical-align: baseline; } + +sub { + bottom: -0.25em; } + +sup { + top: -0.5em; } + +img { + border-style: none; } + +table { + border-collapse: separate; + border-spacing: 0; } + +td, +th { + font-weight: normal; + vertical-align: top; } + +button { + margin: 0; + padding: 0; + border: 0; + outline-style: none; + background: transparent; + font-size: inherit; } + +input { + border: 0; + outline: 0; } + +.md-icon, .md-clipboard::before, .md-nav__title::before, .md-nav__button, .md-nav__link::after, .md-search-result__article--document::before, .md-source-file::before, .md-typeset .admonition > .admonition-title::before, .md-typeset details > .admonition-title::before, .md-typeset .admonition > summary::before, .md-typeset details > summary::before, .md-typeset .footnote-backref, .md-typeset .critic.comment::before, .md-typeset summary::after, .md-typeset .task-list-control .task-list-indicator::before { + font-family: "Material Icons"; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: 1; + text-transform: none; + white-space: nowrap; + speak: none; + word-wrap: normal; + direction: ltr; } + .md-content__icon, .md-header-nav__button, .md-footer-nav__button, .md-nav__title::before, .md-nav__button, .md-search-result__article--document::before { + display: inline-block; + margin: 0.4rem; + padding: 0.8rem; + font-size: 2.4rem; + cursor: pointer; } + +.md-icon--arrow-back::before { + content: "\E5C4"; } + +.md-icon--arrow-forward::before { + content: "\E5C8"; } + +.md-icon--menu::before { + content: "\E5D2"; } + +.md-icon--search::before { + content: "\E8B6"; } + +[dir="rtl"] .md-icon--arrow-back::before { + content: "\E5C8"; } + +[dir="rtl"] .md-icon--arrow-forward::before { + content: "\E5C4"; } + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +body, +input { + color: rgba(0, 0, 0, 0.87); + -webkit-font-feature-settings: "kern", "liga"; + font-feature-settings: "kern", "liga"; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } + +pre, +code, +kbd { + color: rgba(0, 0, 0, 0.87); + -webkit-font-feature-settings: "kern"; + font-feature-settings: "kern"; + font-family: "Courier New", Courier, monospace; } + +.md-typeset { + font-size: 1.6rem; + line-height: 1.6; + -webkit-print-color-adjust: exact; } + .md-typeset p, + .md-typeset ul, + .md-typeset ol, + .md-typeset blockquote { + margin: 1em 0; } + .md-typeset h1 { + margin: 0 0 4rem; + color: rgba(0, 0, 0, 0.54); + font-size: 3.125rem; + font-weight: 300; + letter-spacing: -0.01em; + line-height: 1.3; } + .md-typeset h2 { + margin: 4rem 0 1.6rem; + font-size: 2.5rem; + font-weight: 300; + letter-spacing: -0.01em; + line-height: 1.4; } + .md-typeset h3 { + margin: 3.2rem 0 1.6rem; + font-size: 2rem; + font-weight: 400; + letter-spacing: -0.01em; + line-height: 1.5; } + .md-typeset h2 + h3 { + margin-top: 1.6rem; } + .md-typeset h4 { + margin: 1.6rem 0; + font-size: 1.6rem; + font-weight: 700; + letter-spacing: -0.01em; } + .md-typeset h5, + .md-typeset h6 { + margin: 1.6rem 0; + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + font-weight: 700; + letter-spacing: -0.01em; } + .md-typeset h5 { + text-transform: uppercase; } + .md-typeset hr { + margin: 1.5em 0; + border-bottom: 0.1rem dotted rgba(0, 0, 0, 0.26); } + .md-typeset a { + color: #3f51b5; + word-break: break-word; } + .md-typeset a, .md-typeset a::before { + transition: color 0.125s; } + .md-typeset a:hover, .md-typeset a:active { + color: #536dfe; } + .md-typeset code, + .md-typeset pre { + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + font-size: 85%; + direction: ltr; } + .md-typeset code { + margin: 0 0.29412em; + padding: 0.07353em 0; + border-radius: 0.2rem; + box-shadow: 0.29412em 0 0 rgba(236, 236, 236, 0.5), -0.29412em 0 0 rgba(236, 236, 236, 0.5); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + .md-typeset h1 code, + .md-typeset h2 code, + .md-typeset h3 code, + .md-typeset h4 code, + .md-typeset h5 code, + .md-typeset h6 code { + margin: 0; + background-color: transparent; + box-shadow: none; } + .md-typeset a > code { + margin: inherit; + padding: inherit; + border-radius: none; + background-color: inherit; + color: inherit; + box-shadow: none; } + .md-typeset pre { + position: relative; + margin: 1em 0; + border-radius: 0.2rem; + line-height: 1.4; + -webkit-overflow-scrolling: touch; } + .md-typeset pre > code { + display: block; + margin: 0; + padding: 1.05rem 1.2rem; + background-color: transparent; + font-size: inherit; + box-shadow: none; + -webkit-box-decoration-break: none; + box-decoration-break: none; + overflow: auto; } + .md-typeset pre > code::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-typeset pre > code::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-typeset pre > code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + .md-typeset kbd { + padding: 0 0.29412em; + border: 0.1rem solid #c9c9c9; + border-radius: 0.3rem; + border-bottom-color: #bcbcbc; + background-color: #FCFCFC; + color: #555555; + font-size: 85%; + box-shadow: 0 0.1rem 0 #b0b0b0; + word-break: break-word; } + .md-typeset mark { + margin: 0 0.25em; + padding: 0.0625em 0; + border-radius: 0.2rem; + background-color: rgba(255, 235, 59, 0.5); + box-shadow: 0.25em 0 0 rgba(255, 235, 59, 0.5), -0.25em 0 0 rgba(255, 235, 59, 0.5); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + .md-typeset abbr { + border-bottom: 0.1rem dotted rgba(0, 0, 0, 0.54); + text-decoration: none; + cursor: help; } + .md-typeset small { + opacity: 0.75; } + .md-typeset sup, + .md-typeset sub { + margin-left: 0.07812em; } + [dir="rtl"] .md-typeset sup, [dir="rtl"] + .md-typeset sub { + margin-right: 0.07812em; + margin-left: initial; } + .md-typeset blockquote { + padding-left: 1.2rem; + border-left: 0.4rem solid rgba(0, 0, 0, 0.26); + color: rgba(0, 0, 0, 0.54); } + [dir="rtl"] .md-typeset blockquote { + padding-right: 1.2rem; + padding-left: initial; + border-right: 0.4rem solid rgba(0, 0, 0, 0.26); + border-left: initial; } + .md-typeset ul { + list-style-type: disc; } + .md-typeset ul, + .md-typeset ol { + margin-left: 0.625em; + padding: 0; } + [dir="rtl"] .md-typeset ul, [dir="rtl"] + .md-typeset ol { + margin-right: 0.625em; + margin-left: initial; } + .md-typeset ul ol, + .md-typeset ol ol { + list-style-type: lower-alpha; } + .md-typeset ul ol ol, + .md-typeset ol ol ol { + list-style-type: lower-roman; } + .md-typeset ul li, + .md-typeset ol li { + margin-bottom: 0.5em; + margin-left: 1.25em; } + [dir="rtl"] .md-typeset ul li, [dir="rtl"] + .md-typeset ol li { + margin-right: 1.25em; + margin-left: initial; } + .md-typeset ul li p, + .md-typeset ul li blockquote, + .md-typeset ol li p, + .md-typeset ol li blockquote { + margin: 0.5em 0; } + .md-typeset ul li:last-child, + .md-typeset ol li:last-child { + margin-bottom: 0; } + .md-typeset ul li ul, + .md-typeset ul li ol, + .md-typeset ol li ul, + .md-typeset ol li ol { + margin: 0.5em 0 0.5em 0.625em; } + [dir="rtl"] .md-typeset ul li ul, [dir="rtl"] + .md-typeset ul li ol, [dir="rtl"] + .md-typeset ol li ul, [dir="rtl"] + .md-typeset ol li ol { + margin-right: 0.625em; + margin-left: initial; } + .md-typeset dd { + margin: 1em 0 1em 1.875em; } + [dir="rtl"] .md-typeset dd { + margin-right: 1.875em; + margin-left: initial; } + .md-typeset iframe, + .md-typeset img, + .md-typeset svg { + max-width: 100%; } + .md-typeset table:not([class]) { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + display: inline-block; + max-width: 100%; + border-radius: 0.2rem; + font-size: 1.28rem; + overflow: auto; + -webkit-overflow-scrolling: touch; } + .md-typeset table:not([class]) + * { + margin-top: 1.5em; } + .md-typeset table:not([class]) th:not([align]), + .md-typeset table:not([class]) td:not([align]) { + text-align: left; } + [dir="rtl"] .md-typeset table:not([class]) th:not([align]), [dir="rtl"] + .md-typeset table:not([class]) td:not([align]) { + text-align: right; } + .md-typeset table:not([class]) th { + min-width: 10rem; + padding: 1.2rem 1.6rem; + background-color: rgba(0, 0, 0, 0.54); + color: white; + vertical-align: top; } + .md-typeset table:not([class]) td { + padding: 1.2rem 1.6rem; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + vertical-align: top; } + .md-typeset table:not([class]) tr:first-child td { + border-top: 0; } + .md-typeset table:not([class]) a { + word-break: normal; } + .md-typeset__scrollwrap { + margin: 1em -1.6rem; + overflow-x: auto; + -webkit-overflow-scrolling: touch; } + .md-typeset .md-typeset__table { + display: inline-block; + margin-bottom: 0.5em; + padding: 0 1.6rem; } + .md-typeset .md-typeset__table table { + display: table; + width: 100%; + margin: 0; + overflow: hidden; } + +html { + height: 100%; + font-size: 62.5%; + overflow-x: hidden; } + +body { + position: relative; + height: 100%; } + +hr { + display: block; + height: 0.1rem; + padding: 0; + border: 0; } + +.md-svg { + display: none; } + +.md-grid { + max-width: 122rem; + margin-right: auto; + margin-left: auto; } + +.md-container, +.md-main { + overflow: auto; } + +.md-container { + display: table; + width: 100%; + height: 100%; + padding-top: 4.8rem; + table-layout: fixed; } + +.md-main { + display: table-row; + height: 100%; } + .md-main__inner { + height: 100%; + padding-top: 3rem; + padding-bottom: 0.1rem; } + +.md-toggle { + display: none; } + +.md-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + transition: width 0s 0.25s, height 0s 0.25s, opacity 0.25s; + background-color: rgba(0, 0, 0, 0.54); + opacity: 0; + z-index: 3; } + +.md-flex { + display: table; } + .md-flex__cell { + display: table-cell; + position: relative; + vertical-align: top; } + .md-flex__cell--shrink { + width: 0%; } + .md-flex__cell--stretch { + display: table; + width: 100%; + table-layout: fixed; } + .md-flex__ellipsis { + display: table-cell; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + +.md-skip { + position: fixed; + width: 0.1rem; + height: 0.1rem; + margin: 1rem; + padding: 0.6rem 1rem; + clip: rect(0.1rem); + -webkit-transform: translateY(0.8rem); + transform: translateY(0.8rem); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.87); + color: white; + font-size: 1.28rem; + opacity: 0; + overflow: hidden; } + .md-skip:focus { + width: auto; + height: auto; + clip: auto; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; + z-index: 10; } + +@page { + margin: 25mm; } + +.md-clipboard { + position: absolute; + top: 0.6rem; + right: 0.6rem; + width: 2.8rem; + height: 2.8rem; + border-radius: 0.2rem; + font-size: 1.6rem; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .md-clipboard::before { + transition: color 0.25s, opacity 0.25s; + color: rgba(0, 0, 0, 0.07); + content: "\E14D"; } + pre:hover .md-clipboard::before, + .codehilite:hover .md-clipboard::before, .md-typeset .highlight:hover .md-clipboard::before { + color: rgba(0, 0, 0, 0.54); } + .md-clipboard:focus::before, .md-clipboard:hover::before { + color: #536dfe; } + .md-clipboard__message { + display: block; + position: absolute; + top: 0; + right: 3.4rem; + padding: 0.6rem 1rem; + -webkit-transform: translateX(0.8rem); + transform: translateX(0.8rem); + transition: opacity 0.175s, -webkit-transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0); + transition: transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0), opacity 0.175s; + transition: transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0), opacity 0.175s, -webkit-transform 0.25s cubic-bezier(0.9, 0.1, 0.9, 0); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.54); + color: white; + font-size: 1.28rem; + white-space: nowrap; + opacity: 0; + pointer-events: none; } + .md-clipboard__message--active { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.175s 0.075s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; + pointer-events: initial; } + .md-clipboard__message::before { + content: attr(aria-label); } + .md-clipboard__message::after { + display: block; + position: absolute; + top: 50%; + right: -0.4rem; + width: 0; + margin-top: -0.4rem; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-style: solid; + border-color: transparent rgba(0, 0, 0, 0.54); + content: ""; } + +.md-content__inner { + margin: 0 1.6rem 2.4rem; + padding-top: 1.2rem; } + .md-content__inner::before { + display: block; + height: 0.8rem; + content: ""; } + .md-content__inner > :last-child { + margin-bottom: 0; } + +.md-content__icon { + position: relative; + margin: 0.8rem 0; + padding: 0; + float: right; } + .md-typeset .md-content__icon { + color: rgba(0, 0, 0, 0.26); } + +.md-header { + position: fixed; + top: 0; + right: 0; + left: 0; + height: 4.8rem; + transition: background-color 0.25s, color 0.25s; + background-color: #3f51b5; + color: white; + box-shadow: none; + z-index: 2; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .no-js .md-header { + transition: none; + box-shadow: none; } + .md-header[data-md-state="shadow"] { + transition: background-color 0.25s, color 0.25s, box-shadow 0.25s; + box-shadow: 0 0 0.4rem rgba(0, 0, 0, 0.1), 0 0.4rem 0.8rem rgba(0, 0, 0, 0.2); } + +.md-header-nav { + padding: 0 0.4rem; } + .md-header-nav__button { + position: relative; + transition: opacity 0.25s; + z-index: 1; } + .md-header-nav__button:hover { + opacity: 0.7; } + .md-header-nav__button.md-logo * { + display: block; } + .no-js .md-header-nav__button.md-icon--search { + display: none; } + .md-header-nav__topic { + display: block; + position: absolute; + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(2.5rem); + transform: translateX(2.5rem); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + opacity: 0; + z-index: -1; + pointer-events: none; } + [dir="rtl"] .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(-2.5rem); + transform: translateX(-2.5rem); } + .no-js .md-header-nav__topic { + position: initial; } + .no-js .md-header-nav__topic + .md-header-nav__topic { + display: none; } + .md-header-nav__title { + padding: 0 2rem; + font-size: 1.8rem; + line-height: 4.8rem; } + .md-header-nav__title[data-md-state="active"] .md-header-nav__topic { + -webkit-transform: translateX(-2.5rem); + transform: translateX(-2.5rem); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(1, 0.7, 0.1, 0.1); + opacity: 0; + z-index: -1; + pointer-events: none; } + [dir="rtl"] .md-header-nav__title[data-md-state="active"] .md-header-nav__topic { + -webkit-transform: translateX(2.5rem); + transform: translateX(2.5rem); } + .md-header-nav__title[data-md-state="active"] .md-header-nav__topic + .md-header-nav__topic { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 1; + z-index: 0; + pointer-events: initial; } + .md-header-nav__source { + display: none; } + +.md-hero { + transition: background 0.25s; + background-color: #3f51b5; + color: white; + font-size: 2rem; + overflow: hidden; } + .md-hero__inner { + margin-top: 2rem; + padding: 1.6rem 1.6rem 0.8rem; + transition: opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition-delay: 0.1s; } + [data-md-state="hidden"] .md-hero__inner { + pointer-events: none; + -webkit-transform: translateY(1.25rem); + transform: translateY(1.25rem); + transition: opacity 0.1s 0s, -webkit-transform 0s 0.4s; + transition: transform 0s 0.4s, opacity 0.1s 0s; + transition: transform 0s 0.4s, opacity 0.1s 0s, -webkit-transform 0s 0.4s; + opacity: 0; } + .md-hero--expand .md-hero__inner { + margin-bottom: 2.4rem; } + +.md-footer-nav { + background-color: rgba(0, 0, 0, 0.87); + color: white; } + .md-footer-nav__inner { + padding: 0.4rem; + overflow: auto; } + .md-footer-nav__link { + padding-top: 2.8rem; + padding-bottom: 0.8rem; + transition: opacity 0.25s; } + .md-footer-nav__link:hover { + opacity: 0.7; } + .md-footer-nav__link--prev { + width: 25%; + float: left; } + [dir="rtl"] .md-footer-nav__link--prev { + float: right; } + .md-footer-nav__link--next { + width: 75%; + float: right; + text-align: right; } + [dir="rtl"] .md-footer-nav__link--next { + float: left; + text-align: left; } + .md-footer-nav__button { + transition: background 0.25s; } + .md-footer-nav__title { + position: relative; + padding: 0 2rem; + font-size: 1.8rem; + line-height: 4.8rem; } + .md-footer-nav__direction { + position: absolute; + right: 0; + left: 0; + margin-top: -2rem; + padding: 0 2rem; + color: rgba(255, 255, 255, 0.7); + font-size: 1.5rem; } + +.md-footer-meta { + background-color: rgba(0, 0, 0, 0.895); } + .md-footer-meta__inner { + padding: 0.4rem; + overflow: auto; } + html .md-footer-meta.md-typeset a { + color: rgba(255, 255, 255, 0.7); } + html .md-footer-meta.md-typeset a:focus, html .md-footer-meta.md-typeset a:hover { + color: white; } + +.md-footer-copyright { + margin: 0 1.2rem; + padding: 0.8rem 0; + color: rgba(255, 255, 255, 0.3); + font-size: 1.28rem; } + .md-footer-copyright__highlight { + color: rgba(255, 255, 255, 0.7); } + +.md-footer-social { + margin: 0 0.8rem; + padding: 0.4rem 0 1.2rem; } + .md-footer-social__link { + display: inline-block; + width: 3.2rem; + height: 3.2rem; + font-size: 1.6rem; + text-align: center; } + .md-footer-social__link::before { + line-height: 1.9; } + +.md-nav { + font-size: 1.4rem; + line-height: 1.3; } + .md-nav__title { + display: block; + padding: 0 1.2rem; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; } + .md-nav__title::before { + display: none; + content: "\E5C4"; } + [dir="rtl"] .md-nav__title::before { + content: "\E5C8"; } + .md-nav__title .md-nav__button { + display: none; } + .md-nav__list { + margin: 0; + padding: 0; + list-style: none; } + .md-nav__item { + padding: 0 1.2rem; } + .md-nav__item:last-child { + padding-bottom: 1.2rem; } + .md-nav__item .md-nav__item { + padding-right: 0; } + [dir="rtl"] .md-nav__item .md-nav__item { + padding-right: 1.2rem; + padding-left: 0; } + .md-nav__item .md-nav__item:last-child { + padding-bottom: 0; } + .md-nav__button img { + width: 100%; + height: auto; } + .md-nav__link { + display: block; + margin-top: 0.625em; + transition: color 0.125s; + text-overflow: ellipsis; + cursor: pointer; + overflow: hidden; } + .md-nav__item--nested > .md-nav__link::after { + content: "\E313"; } + html .md-nav__link[for="__toc"] { + display: none; } + html .md-nav__link[for="__toc"] ~ .md-nav { + display: none; } + html .md-nav__link[for="__toc"] + .md-nav__link::after { + display: none; } + .md-nav__link[data-md-state="blur"] { + color: rgba(0, 0, 0, 0.54); } + .md-nav__link:active, .md-nav__link--active { + color: #3f51b5; } + .md-nav__item--nested > .md-nav__link { + color: inherit; } + .md-nav__link:focus, .md-nav__link:hover { + color: #536dfe; } + .md-nav__source { + display: none; } + +.no-js .md-search { + display: none; } + +.md-search__overlay { + opacity: 0; + z-index: 1; } + +.md-search__form { + position: relative; } + +.md-search__input { + position: relative; + padding: 0 4.4rem 0 7.2rem; + text-overflow: ellipsis; + z-index: 2; } + [dir="rtl"] .md-search__input { + padding: 0 7.2rem 0 4.4rem; } + .md-search__input::-webkit-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input:-ms-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input::-ms-input-placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input::placeholder { + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + .md-search__input ~ .md-search__icon, .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input ~ .md-search__icon, .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__input::-ms-clear { + display: none; } + +.md-search__icon { + position: absolute; + transition: color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + font-size: 2.4rem; + cursor: pointer; + z-index: 2; } + .md-search__icon:hover { + opacity: 0.7; } + .md-search__icon[for="__search"] { + top: 0.6rem; + left: 1rem; } + [dir="rtl"] .md-search__icon[for="__search"] { + right: 1rem; + left: initial; } + .md-search__icon[for="__search"]::before { + content: "\E8B6"; } + .md-search__icon[type="reset"] { + top: 0.6rem; + right: 1rem; + -webkit-transform: scale(0.125); + transform: scale(0.125); + transition: opacity 0.15s, -webkit-transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s; + transition: transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s, -webkit-transform 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 0; } + [dir="rtl"] .md-search__icon[type="reset"] { + right: initial; + left: 1rem; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input:valid ~ .md-search__icon[type="reset"] { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input:valid ~ .md-search__icon[type="reset"]:hover { + opacity: 0.7; } + +.md-search__output { + position: absolute; + width: 100%; + border-radius: 0 0 0.2rem 0.2rem; + overflow: hidden; + z-index: 1; } + +.md-search__scrollwrap { + height: 100%; + background-color: white; + box-shadow: 0 0.1rem 0 rgba(0, 0, 0, 0.07) inset; + overflow-y: auto; + -webkit-overflow-scrolling: touch; } + +.md-search-result { + color: rgba(0, 0, 0, 0.87); + word-break: break-word; } + .md-search-result__meta { + padding: 0 1.6rem; + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + line-height: 3.6rem; } + .md-search-result__list { + margin: 0; + padding: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + list-style: none; } + .md-search-result__item { + box-shadow: 0 -0.1rem 0 rgba(0, 0, 0, 0.07); } + .md-search-result__link { + display: block; + transition: background 0.25s; + outline: 0; + overflow: hidden; } + .md-search-result__link[data-md-state="active"], .md-search-result__link:hover { + background-color: rgba(83, 109, 254, 0.1); } + .md-search-result__link[data-md-state="active"] .md-search-result__article::before, .md-search-result__link:hover .md-search-result__article::before { + opacity: 0.7; } + .md-search-result__link:last-child .md-search-result__teaser { + margin-bottom: 1.2rem; } + .md-search-result__article { + position: relative; + padding: 0 1.6rem; + overflow: auto; } + .md-search-result__article--document::before { + position: absolute; + left: 0; + margin: 0.2rem; + transition: opacity 0.25s; + color: rgba(0, 0, 0, 0.54); + content: "\E880"; } + [dir="rtl"] .md-search-result__article--document::before { + right: 0; + left: initial; } + .md-search-result__article--document .md-search-result__title { + margin: 1.1rem 0; + font-size: 1.6rem; + font-weight: 400; + line-height: 1.4; } + .md-search-result__title { + margin: 0.5em 0; + font-size: 1.28rem; + font-weight: 700; + line-height: 1.4; } + .md-search-result__teaser { + display: -webkit-box; + max-height: 3.3rem; + margin: 0.5em 0; + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; + line-height: 1.4; + text-overflow: ellipsis; + overflow: hidden; + -webkit-line-clamp: 2; } + .md-search-result em { + font-style: normal; + font-weight: 700; + text-decoration: underline; } + +.md-sidebar { + position: absolute; + width: 24.2rem; + padding: 2.4rem 0; + overflow: hidden; } + .md-sidebar[data-md-state="lock"] { + position: fixed; + top: 4.8rem; } + .md-sidebar--secondary { + display: none; } + .md-sidebar__scrollwrap { + max-height: 100%; + margin: 0 0.4rem; + overflow-y: auto; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + .md-sidebar__scrollwrap::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +@-webkit-keyframes md-source__facts--done { + 0% { + height: 0; } + 100% { + height: 1.3rem; } } + +@keyframes md-source__facts--done { + 0% { + height: 0; } + 100% { + height: 1.3rem; } } + +@-webkit-keyframes md-source__fact--done { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; } + 50% { + opacity: 0; } + 100% { + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; } } + +@keyframes md-source__fact--done { + 0% { + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; } + 50% { + opacity: 0; } + 100% { + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; } } + +.md-source { + display: block; + padding-right: 1.2rem; + transition: opacity 0.25s; + font-size: 1.3rem; + line-height: 1.2; + white-space: nowrap; } + [dir="rtl"] .md-source { + padding-right: initial; + padding-left: 1.2rem; } + .md-source:hover { + opacity: 0.7; } + .md-source::after { + display: inline-block; + height: 4.8rem; + content: ""; + vertical-align: middle; } + .md-source__icon { + display: inline-block; + width: 4.8rem; + height: 4.8rem; + content: ""; + vertical-align: middle; } + .md-source__icon svg { + width: 2.4rem; + height: 2.4rem; + margin-top: 1.2rem; + margin-left: 1.2rem; } + [dir="rtl"] .md-source__icon svg { + margin-right: 1.2rem; + margin-left: initial; } + .md-source__icon + .md-source__repository { + margin-left: -4.4rem; + padding-left: 4rem; } + [dir="rtl"] .md-source__icon + .md-source__repository { + margin-right: -4.4rem; + margin-left: initial; + padding-right: 4rem; + padding-left: initial; } + .md-source__repository { + display: inline-block; + max-width: 100%; + margin-left: 1.2rem; + font-weight: 700; + text-overflow: ellipsis; + overflow: hidden; + vertical-align: middle; } + .md-source__facts { + margin: 0; + padding: 0; + font-size: 1.1rem; + font-weight: 700; + list-style-type: none; + opacity: 0.75; + overflow: hidden; } + [data-md-state="done"] .md-source__facts { + -webkit-animation: md-source__facts--done 0.25s ease-in; + animation: md-source__facts--done 0.25s ease-in; } + .md-source__fact { + float: left; } + [dir="rtl"] .md-source__fact { + float: right; } + [data-md-state="done"] .md-source__fact { + -webkit-animation: md-source__fact--done 0.4s ease-out; + animation: md-source__fact--done 0.4s ease-out; } + .md-source__fact::before { + margin: 0 0.2rem; + content: "\B7"; } + .md-source__fact:first-child::before { + display: none; } + +.md-source-file { + display: inline-block; + margin: 1em 0.5em 1em 0; + padding-right: 0.5rem; + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.07); + font-size: 1.28rem; + list-style-type: none; + cursor: pointer; + overflow: hidden; } + .md-source-file::before { + display: inline-block; + margin-right: 0.5rem; + padding: 0.5rem; + background-color: rgba(0, 0, 0, 0.26); + color: white; + font-size: 1.6rem; + content: "\E86F"; + vertical-align: middle; } + html .md-source-file { + transition: background 0.4s, color 0.4s, box-shadow 0.4s cubic-bezier(0.4, 0, 0.2, 1); } + html .md-source-file::before { + transition: inherit; } + html body .md-typeset .md-source-file { + color: rgba(0, 0, 0, 0.54); } + .md-source-file:hover { + box-shadow: 0 0 8px rgba(0, 0, 0, 0.18), 0 8px 16px rgba(0, 0, 0, 0.36); } + .md-source-file:hover::before { + background-color: #536dfe; } + +.md-tabs { + width: 100%; + transition: background 0.25s; + background-color: #3f51b5; + color: white; + overflow: auto; } + .md-tabs__list { + margin: 0; + margin-left: 0.4rem; + padding: 0; + list-style: none; + white-space: nowrap; } + .md-tabs__item { + display: inline-block; + height: 4.8rem; + padding-right: 1.2rem; + padding-left: 1.2rem; } + .md-tabs__link { + display: block; + margin-top: 1.6rem; + transition: opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; + transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s, -webkit-transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1); + font-size: 1.4rem; + opacity: 0.7; } + .md-tabs__link--active, .md-tabs__link:hover { + color: inherit; + opacity: 1; } + .md-tabs__item:nth-child(2) .md-tabs__link { + transition-delay: 0.02s; } + .md-tabs__item:nth-child(3) .md-tabs__link { + transition-delay: 0.04s; } + .md-tabs__item:nth-child(4) .md-tabs__link { + transition-delay: 0.06s; } + .md-tabs__item:nth-child(5) .md-tabs__link { + transition-delay: 0.08s; } + .md-tabs__item:nth-child(6) .md-tabs__link { + transition-delay: 0.1s; } + .md-tabs__item:nth-child(7) .md-tabs__link { + transition-delay: 0.12s; } + .md-tabs__item:nth-child(8) .md-tabs__link { + transition-delay: 0.14s; } + .md-tabs__item:nth-child(9) .md-tabs__link { + transition-delay: 0.16s; } + .md-tabs__item:nth-child(10) .md-tabs__link { + transition-delay: 0.18s; } + .md-tabs__item:nth-child(11) .md-tabs__link { + transition-delay: 0.2s; } + .md-tabs__item:nth-child(12) .md-tabs__link { + transition-delay: 0.22s; } + .md-tabs__item:nth-child(13) .md-tabs__link { + transition-delay: 0.24s; } + .md-tabs__item:nth-child(14) .md-tabs__link { + transition-delay: 0.26s; } + .md-tabs__item:nth-child(15) .md-tabs__link { + transition-delay: 0.28s; } + .md-tabs__item:nth-child(16) .md-tabs__link { + transition-delay: 0.3s; } + .md-tabs[data-md-state="hidden"] { + pointer-events: none; } + .md-tabs[data-md-state="hidden"] .md-tabs__link { + -webkit-transform: translateY(50%); + transform: translateY(50%); + transition: color 0.25s, opacity 0.1s, -webkit-transform 0s 0.4s; + transition: color 0.25s, transform 0s 0.4s, opacity 0.1s; + transition: color 0.25s, transform 0s 0.4s, opacity 0.1s, -webkit-transform 0s 0.4s; + opacity: 0; } + +.md-typeset .admonition, .md-typeset details { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + position: relative; + margin: 1.5625em 0; + padding: 0 1.2rem; + border-left: 0.4rem solid #448aff; + border-radius: 0.2rem; + font-size: 1.28rem; + overflow: auto; } + [dir="rtl"] .md-typeset .admonition, [dir="rtl"] .md-typeset details { + border-right: 0.4rem solid #448aff; + border-left: none; } + html .md-typeset .admonition > :last-child, html .md-typeset details > :last-child { + margin-bottom: 1.2rem; } + .md-typeset .admonition .admonition, .md-typeset details .admonition, .md-typeset .admonition details, .md-typeset details details { + margin: 1em 0; } + .md-typeset .admonition > .admonition-title, .md-typeset details > .admonition-title, .md-typeset .admonition > summary, .md-typeset details > summary { + margin: 0 -1.2rem; + padding: 0.8rem 1.2rem 0.8rem 4rem; + border-bottom: 0.1rem solid rgba(68, 138, 255, 0.1); + background-color: rgba(68, 138, 255, 0.1); + font-weight: 700; } + [dir="rtl"] .md-typeset .admonition > .admonition-title, [dir="rtl"] .md-typeset details > .admonition-title, [dir="rtl"] .md-typeset .admonition > summary, [dir="rtl"] .md-typeset details > summary { + padding: 0.8rem 4rem 0.8rem 1.2rem; } + .md-typeset .admonition > .admonition-title:last-child, .md-typeset details > .admonition-title:last-child, .md-typeset .admonition > summary:last-child, .md-typeset details > summary:last-child { + margin-bottom: 0; } + .md-typeset .admonition > .admonition-title::before, .md-typeset details > .admonition-title::before, .md-typeset .admonition > summary::before, .md-typeset details > summary::before { + position: absolute; + left: 1.2rem; + color: #448aff; + font-size: 2rem; + content: "\E3C9"; } + [dir="rtl"] .md-typeset .admonition > .admonition-title::before, [dir="rtl"] .md-typeset details > .admonition-title::before, [dir="rtl"] .md-typeset .admonition > summary::before, [dir="rtl"] .md-typeset details > summary::before { + right: 1.2rem; + left: initial; } + .md-typeset .admonition.summary, .md-typeset details.summary, .md-typeset .admonition.tldr, .md-typeset details.tldr, .md-typeset .admonition.abstract, .md-typeset details.abstract { + border-left-color: #00b0ff; } + [dir="rtl"] .md-typeset .admonition.summary, [dir="rtl"] .md-typeset details.summary, [dir="rtl"] .md-typeset .admonition.tldr, [dir="rtl"] .md-typeset details.tldr, [dir="rtl"] .md-typeset .admonition.abstract, [dir="rtl"] .md-typeset details.abstract { + border-right-color: #00b0ff; } + .md-typeset .admonition.summary > .admonition-title, .md-typeset details.summary > .admonition-title, .md-typeset .admonition.tldr > .admonition-title, .md-typeset details.tldr > .admonition-title, .md-typeset .admonition.summary > summary, .md-typeset details.summary > summary, .md-typeset .admonition.tldr > summary, .md-typeset details.tldr > summary, .md-typeset .admonition.abstract > .admonition-title, .md-typeset details.abstract > .admonition-title, .md-typeset .admonition.abstract > summary, .md-typeset details.abstract > summary { + border-bottom-color: 0.1rem solid rgba(0, 176, 255, 0.1); + background-color: rgba(0, 176, 255, 0.1); } + .md-typeset .admonition.summary > .admonition-title::before, .md-typeset details.summary > .admonition-title::before, .md-typeset .admonition.tldr > .admonition-title::before, .md-typeset details.tldr > .admonition-title::before, .md-typeset .admonition.summary > summary::before, .md-typeset details.summary > summary::before, .md-typeset .admonition.tldr > summary::before, .md-typeset details.tldr > summary::before, .md-typeset .admonition.abstract > .admonition-title::before, .md-typeset details.abstract > .admonition-title::before, .md-typeset .admonition.abstract > summary::before, .md-typeset details.abstract > summary::before { + color: #00b0ff; + content: "\E8D2"; } + .md-typeset .admonition.todo, .md-typeset details.todo, .md-typeset .admonition.info, .md-typeset details.info { + border-left-color: #00b8d4; } + [dir="rtl"] .md-typeset .admonition.todo, [dir="rtl"] .md-typeset details.todo, [dir="rtl"] .md-typeset .admonition.info, [dir="rtl"] .md-typeset details.info { + border-right-color: #00b8d4; } + .md-typeset .admonition.todo > .admonition-title, .md-typeset details.todo > .admonition-title, .md-typeset .admonition.todo > summary, .md-typeset details.todo > summary, .md-typeset .admonition.info > .admonition-title, .md-typeset details.info > .admonition-title, .md-typeset .admonition.info > summary, .md-typeset details.info > summary { + border-bottom-color: 0.1rem solid rgba(0, 184, 212, 0.1); + background-color: rgba(0, 184, 212, 0.1); } + .md-typeset .admonition.todo > .admonition-title::before, .md-typeset details.todo > .admonition-title::before, .md-typeset .admonition.todo > summary::before, .md-typeset details.todo > summary::before, .md-typeset .admonition.info > .admonition-title::before, .md-typeset details.info > .admonition-title::before, .md-typeset .admonition.info > summary::before, .md-typeset details.info > summary::before { + color: #00b8d4; + content: "\E88E"; } + .md-typeset .admonition.hint, .md-typeset details.hint, .md-typeset .admonition.important, .md-typeset details.important, .md-typeset .admonition.tip, .md-typeset details.tip { + border-left-color: #00bfa5; } + [dir="rtl"] .md-typeset .admonition.hint, [dir="rtl"] .md-typeset details.hint, [dir="rtl"] .md-typeset .admonition.important, [dir="rtl"] .md-typeset details.important, [dir="rtl"] .md-typeset .admonition.tip, [dir="rtl"] .md-typeset details.tip { + border-right-color: #00bfa5; } + .md-typeset .admonition.hint > .admonition-title, .md-typeset details.hint > .admonition-title, .md-typeset .admonition.important > .admonition-title, .md-typeset details.important > .admonition-title, .md-typeset .admonition.hint > summary, .md-typeset details.hint > summary, .md-typeset .admonition.important > summary, .md-typeset details.important > summary, .md-typeset .admonition.tip > .admonition-title, .md-typeset details.tip > .admonition-title, .md-typeset .admonition.tip > summary, .md-typeset details.tip > summary { + border-bottom-color: 0.1rem solid rgba(0, 191, 165, 0.1); + background-color: rgba(0, 191, 165, 0.1); } + .md-typeset .admonition.hint > .admonition-title::before, .md-typeset details.hint > .admonition-title::before, .md-typeset .admonition.important > .admonition-title::before, .md-typeset details.important > .admonition-title::before, .md-typeset .admonition.hint > summary::before, .md-typeset details.hint > summary::before, .md-typeset .admonition.important > summary::before, .md-typeset details.important > summary::before, .md-typeset .admonition.tip > .admonition-title::before, .md-typeset details.tip > .admonition-title::before, .md-typeset .admonition.tip > summary::before, .md-typeset details.tip > summary::before { + color: #00bfa5; + content: "\E80E"; } + .md-typeset .admonition.check, .md-typeset details.check, .md-typeset .admonition.done, .md-typeset details.done, .md-typeset .admonition.success, .md-typeset details.success { + border-left-color: #00c853; } + [dir="rtl"] .md-typeset .admonition.check, [dir="rtl"] .md-typeset details.check, [dir="rtl"] .md-typeset .admonition.done, [dir="rtl"] .md-typeset details.done, [dir="rtl"] .md-typeset .admonition.success, [dir="rtl"] .md-typeset details.success { + border-right-color: #00c853; } + .md-typeset .admonition.check > .admonition-title, .md-typeset details.check > .admonition-title, .md-typeset .admonition.done > .admonition-title, .md-typeset details.done > .admonition-title, .md-typeset .admonition.check > summary, .md-typeset details.check > summary, .md-typeset .admonition.done > summary, .md-typeset details.done > summary, .md-typeset .admonition.success > .admonition-title, .md-typeset details.success > .admonition-title, .md-typeset .admonition.success > summary, .md-typeset details.success > summary { + border-bottom-color: 0.1rem solid rgba(0, 200, 83, 0.1); + background-color: rgba(0, 200, 83, 0.1); } + .md-typeset .admonition.check > .admonition-title::before, .md-typeset details.check > .admonition-title::before, .md-typeset .admonition.done > .admonition-title::before, .md-typeset details.done > .admonition-title::before, .md-typeset .admonition.check > summary::before, .md-typeset details.check > summary::before, .md-typeset .admonition.done > summary::before, .md-typeset details.done > summary::before, .md-typeset .admonition.success > .admonition-title::before, .md-typeset details.success > .admonition-title::before, .md-typeset .admonition.success > summary::before, .md-typeset details.success > summary::before { + color: #00c853; + content: "\E876"; } + .md-typeset .admonition.help, .md-typeset details.help, .md-typeset .admonition.faq, .md-typeset details.faq, .md-typeset .admonition.question, .md-typeset details.question { + border-left-color: #64dd17; } + [dir="rtl"] .md-typeset .admonition.help, [dir="rtl"] .md-typeset details.help, [dir="rtl"] .md-typeset .admonition.faq, [dir="rtl"] .md-typeset details.faq, [dir="rtl"] .md-typeset .admonition.question, [dir="rtl"] .md-typeset details.question { + border-right-color: #64dd17; } + .md-typeset .admonition.help > .admonition-title, .md-typeset details.help > .admonition-title, .md-typeset .admonition.faq > .admonition-title, .md-typeset details.faq > .admonition-title, .md-typeset .admonition.help > summary, .md-typeset details.help > summary, .md-typeset .admonition.faq > summary, .md-typeset details.faq > summary, .md-typeset .admonition.question > .admonition-title, .md-typeset details.question > .admonition-title, .md-typeset .admonition.question > summary, .md-typeset details.question > summary { + border-bottom-color: 0.1rem solid rgba(100, 221, 23, 0.1); + background-color: rgba(100, 221, 23, 0.1); } + .md-typeset .admonition.help > .admonition-title::before, .md-typeset details.help > .admonition-title::before, .md-typeset .admonition.faq > .admonition-title::before, .md-typeset details.faq > .admonition-title::before, .md-typeset .admonition.help > summary::before, .md-typeset details.help > summary::before, .md-typeset .admonition.faq > summary::before, .md-typeset details.faq > summary::before, .md-typeset .admonition.question > .admonition-title::before, .md-typeset details.question > .admonition-title::before, .md-typeset .admonition.question > summary::before, .md-typeset details.question > summary::before { + color: #64dd17; + content: "\E887"; } + .md-typeset .admonition.caution, .md-typeset details.caution, .md-typeset .admonition.attention, .md-typeset details.attention, .md-typeset .admonition.warning, .md-typeset details.warning { + border-left-color: #ff9100; } + [dir="rtl"] .md-typeset .admonition.caution, [dir="rtl"] .md-typeset details.caution, [dir="rtl"] .md-typeset .admonition.attention, [dir="rtl"] .md-typeset details.attention, [dir="rtl"] .md-typeset .admonition.warning, [dir="rtl"] .md-typeset details.warning { + border-right-color: #ff9100; } + .md-typeset .admonition.caution > .admonition-title, .md-typeset details.caution > .admonition-title, .md-typeset .admonition.attention > .admonition-title, .md-typeset details.attention > .admonition-title, .md-typeset .admonition.caution > summary, .md-typeset details.caution > summary, .md-typeset .admonition.attention > summary, .md-typeset details.attention > summary, .md-typeset .admonition.warning > .admonition-title, .md-typeset details.warning > .admonition-title, .md-typeset .admonition.warning > summary, .md-typeset details.warning > summary { + border-bottom-color: 0.1rem solid rgba(255, 145, 0, 0.1); + background-color: rgba(255, 145, 0, 0.1); } + .md-typeset .admonition.caution > .admonition-title::before, .md-typeset details.caution > .admonition-title::before, .md-typeset .admonition.attention > .admonition-title::before, .md-typeset details.attention > .admonition-title::before, .md-typeset .admonition.caution > summary::before, .md-typeset details.caution > summary::before, .md-typeset .admonition.attention > summary::before, .md-typeset details.attention > summary::before, .md-typeset .admonition.warning > .admonition-title::before, .md-typeset details.warning > .admonition-title::before, .md-typeset .admonition.warning > summary::before, .md-typeset details.warning > summary::before { + color: #ff9100; + content: "\E002"; } + .md-typeset .admonition.fail, .md-typeset details.fail, .md-typeset .admonition.missing, .md-typeset details.missing, .md-typeset .admonition.failure, .md-typeset details.failure { + border-left-color: #ff5252; } + [dir="rtl"] .md-typeset .admonition.fail, [dir="rtl"] .md-typeset details.fail, [dir="rtl"] .md-typeset .admonition.missing, [dir="rtl"] .md-typeset details.missing, [dir="rtl"] .md-typeset .admonition.failure, [dir="rtl"] .md-typeset details.failure { + border-right-color: #ff5252; } + .md-typeset .admonition.fail > .admonition-title, .md-typeset details.fail > .admonition-title, .md-typeset .admonition.missing > .admonition-title, .md-typeset details.missing > .admonition-title, .md-typeset .admonition.fail > summary, .md-typeset details.fail > summary, .md-typeset .admonition.missing > summary, .md-typeset details.missing > summary, .md-typeset .admonition.failure > .admonition-title, .md-typeset details.failure > .admonition-title, .md-typeset .admonition.failure > summary, .md-typeset details.failure > summary { + border-bottom-color: 0.1rem solid rgba(255, 82, 82, 0.1); + background-color: rgba(255, 82, 82, 0.1); } + .md-typeset .admonition.fail > .admonition-title::before, .md-typeset details.fail > .admonition-title::before, .md-typeset .admonition.missing > .admonition-title::before, .md-typeset details.missing > .admonition-title::before, .md-typeset .admonition.fail > summary::before, .md-typeset details.fail > summary::before, .md-typeset .admonition.missing > summary::before, .md-typeset details.missing > summary::before, .md-typeset .admonition.failure > .admonition-title::before, .md-typeset details.failure > .admonition-title::before, .md-typeset .admonition.failure > summary::before, .md-typeset details.failure > summary::before { + color: #ff5252; + content: "\E14C"; } + .md-typeset .admonition.error, .md-typeset details.error, .md-typeset .admonition.danger, .md-typeset details.danger { + border-left-color: #ff1744; } + [dir="rtl"] .md-typeset .admonition.error, [dir="rtl"] .md-typeset details.error, [dir="rtl"] .md-typeset .admonition.danger, [dir="rtl"] .md-typeset details.danger { + border-right-color: #ff1744; } + .md-typeset .admonition.error > .admonition-title, .md-typeset details.error > .admonition-title, .md-typeset .admonition.error > summary, .md-typeset details.error > summary, .md-typeset .admonition.danger > .admonition-title, .md-typeset details.danger > .admonition-title, .md-typeset .admonition.danger > summary, .md-typeset details.danger > summary { + border-bottom-color: 0.1rem solid rgba(255, 23, 68, 0.1); + background-color: rgba(255, 23, 68, 0.1); } + .md-typeset .admonition.error > .admonition-title::before, .md-typeset details.error > .admonition-title::before, .md-typeset .admonition.error > summary::before, .md-typeset details.error > summary::before, .md-typeset .admonition.danger > .admonition-title::before, .md-typeset details.danger > .admonition-title::before, .md-typeset .admonition.danger > summary::before, .md-typeset details.danger > summary::before { + color: #ff1744; + content: "\E3E7"; } + .md-typeset .admonition.bug, .md-typeset details.bug { + border-left-color: #f50057; } + [dir="rtl"] .md-typeset .admonition.bug, [dir="rtl"] .md-typeset details.bug { + border-right-color: #f50057; } + .md-typeset .admonition.bug > .admonition-title, .md-typeset details.bug > .admonition-title, .md-typeset .admonition.bug > summary, .md-typeset details.bug > summary { + border-bottom-color: 0.1rem solid rgba(245, 0, 87, 0.1); + background-color: rgba(245, 0, 87, 0.1); } + .md-typeset .admonition.bug > .admonition-title::before, .md-typeset details.bug > .admonition-title::before, .md-typeset .admonition.bug > summary::before, .md-typeset details.bug > summary::before { + color: #f50057; + content: "\E868"; } + .md-typeset .admonition.example, .md-typeset details.example { + border-left-color: #651fff; } + [dir="rtl"] .md-typeset .admonition.example, [dir="rtl"] .md-typeset details.example { + border-right-color: #651fff; } + .md-typeset .admonition.example > .admonition-title, .md-typeset details.example > .admonition-title, .md-typeset .admonition.example > summary, .md-typeset details.example > summary { + border-bottom-color: 0.1rem solid rgba(101, 31, 255, 0.1); + background-color: rgba(101, 31, 255, 0.1); } + .md-typeset .admonition.example > .admonition-title::before, .md-typeset details.example > .admonition-title::before, .md-typeset .admonition.example > summary::before, .md-typeset details.example > summary::before { + color: #651fff; + content: "\E242"; } + .md-typeset .admonition.cite, .md-typeset details.cite, .md-typeset .admonition.quote, .md-typeset details.quote { + border-left-color: #9e9e9e; } + [dir="rtl"] .md-typeset .admonition.cite, [dir="rtl"] .md-typeset details.cite, [dir="rtl"] .md-typeset .admonition.quote, [dir="rtl"] .md-typeset details.quote { + border-right-color: #9e9e9e; } + .md-typeset .admonition.cite > .admonition-title, .md-typeset details.cite > .admonition-title, .md-typeset .admonition.cite > summary, .md-typeset details.cite > summary, .md-typeset .admonition.quote > .admonition-title, .md-typeset details.quote > .admonition-title, .md-typeset .admonition.quote > summary, .md-typeset details.quote > summary { + border-bottom-color: 0.1rem solid rgba(158, 158, 158, 0.1); + background-color: rgba(158, 158, 158, 0.1); } + .md-typeset .admonition.cite > .admonition-title::before, .md-typeset details.cite > .admonition-title::before, .md-typeset .admonition.cite > summary::before, .md-typeset details.cite > summary::before, .md-typeset .admonition.quote > .admonition-title::before, .md-typeset details.quote > .admonition-title::before, .md-typeset .admonition.quote > summary::before, .md-typeset details.quote > summary::before { + color: #9e9e9e; + content: "\E244"; } + +.codehilite .o, .md-typeset .highlight .o { + color: inherit; } + +.codehilite .ow, .md-typeset .highlight .ow { + color: inherit; } + +.codehilite .ge, .md-typeset .highlight .ge { + color: #000000; } + +.codehilite .gr, .md-typeset .highlight .gr { + color: #AA0000; } + +.codehilite .gh, .md-typeset .highlight .gh { + color: #999999; } + +.codehilite .go, .md-typeset .highlight .go { + color: #888888; } + +.codehilite .gp, .md-typeset .highlight .gp { + color: #555555; } + +.codehilite .gs, .md-typeset .highlight .gs { + color: inherit; } + +.codehilite .gu, .md-typeset .highlight .gu { + color: #AAAAAA; } + +.codehilite .gt, .md-typeset .highlight .gt { + color: #AA0000; } + +.codehilite .gd, .md-typeset .highlight .gd { + background-color: #FFDDDD; } + +.codehilite .gi, .md-typeset .highlight .gi { + background-color: #DDFFDD; } + +.codehilite .k, .md-typeset .highlight .k { + color: #3B78E7; } + +.codehilite .kc, .md-typeset .highlight .kc { + color: #A71D5D; } + +.codehilite .kd, .md-typeset .highlight .kd { + color: #3B78E7; } + +.codehilite .kn, .md-typeset .highlight .kn { + color: #3B78E7; } + +.codehilite .kp, .md-typeset .highlight .kp { + color: #A71D5D; } + +.codehilite .kr, .md-typeset .highlight .kr { + color: #3E61A2; } + +.codehilite .kt, .md-typeset .highlight .kt { + color: #3E61A2; } + +.codehilite .c, .md-typeset .highlight .c { + color: #999999; } + +.codehilite .cm, .md-typeset .highlight .cm { + color: #999999; } + +.codehilite .cp, .md-typeset .highlight .cp { + color: #666666; } + +.codehilite .c1, .md-typeset .highlight .c1 { + color: #999999; } + +.codehilite .ch, .md-typeset .highlight .ch { + color: #999999; } + +.codehilite .cs, .md-typeset .highlight .cs { + color: #999999; } + +.codehilite .na, .md-typeset .highlight .na { + color: #C2185B; } + +.codehilite .nb, .md-typeset .highlight .nb { + color: #C2185B; } + +.codehilite .bp, .md-typeset .highlight .bp { + color: #3E61A2; } + +.codehilite .nc, .md-typeset .highlight .nc { + color: #C2185B; } + +.codehilite .no, .md-typeset .highlight .no { + color: #3E61A2; } + +.codehilite .nd, .md-typeset .highlight .nd { + color: #666666; } + +.codehilite .ni, .md-typeset .highlight .ni { + color: #666666; } + +.codehilite .ne, .md-typeset .highlight .ne { + color: #C2185B; } + +.codehilite .nf, .md-typeset .highlight .nf { + color: #C2185B; } + +.codehilite .nl, .md-typeset .highlight .nl { + color: #3B5179; } + +.codehilite .nn, .md-typeset .highlight .nn { + color: #EC407A; } + +.codehilite .nt, .md-typeset .highlight .nt { + color: #3B78E7; } + +.codehilite .nv, .md-typeset .highlight .nv { + color: #3E61A2; } + +.codehilite .vc, .md-typeset .highlight .vc { + color: #3E61A2; } + +.codehilite .vg, .md-typeset .highlight .vg { + color: #3E61A2; } + +.codehilite .vi, .md-typeset .highlight .vi { + color: #3E61A2; } + +.codehilite .nx, .md-typeset .highlight .nx { + color: #EC407A; } + +.codehilite .m, .md-typeset .highlight .m { + color: #E74C3C; } + +.codehilite .mf, .md-typeset .highlight .mf { + color: #E74C3C; } + +.codehilite .mh, .md-typeset .highlight .mh { + color: #E74C3C; } + +.codehilite .mi, .md-typeset .highlight .mi { + color: #E74C3C; } + +.codehilite .il, .md-typeset .highlight .il { + color: #E74C3C; } + +.codehilite .mo, .md-typeset .highlight .mo { + color: #E74C3C; } + +.codehilite .s, .md-typeset .highlight .s { + color: #0D904F; } + +.codehilite .sb, .md-typeset .highlight .sb { + color: #0D904F; } + +.codehilite .sc, .md-typeset .highlight .sc { + color: #0D904F; } + +.codehilite .sd, .md-typeset .highlight .sd { + color: #999999; } + +.codehilite .s2, .md-typeset .highlight .s2 { + color: #0D904F; } + +.codehilite .se, .md-typeset .highlight .se { + color: #183691; } + +.codehilite .sh, .md-typeset .highlight .sh { + color: #183691; } + +.codehilite .si, .md-typeset .highlight .si { + color: #183691; } + +.codehilite .sx, .md-typeset .highlight .sx { + color: #183691; } + +.codehilite .sr, .md-typeset .highlight .sr { + color: #009926; } + +.codehilite .s1, .md-typeset .highlight .s1 { + color: #0D904F; } + +.codehilite .ss, .md-typeset .highlight .ss { + color: #0D904F; } + +.codehilite .err, .md-typeset .highlight .err { + color: #A61717; } + +.codehilite .w, .md-typeset .highlight .w { + color: transparent; } + +.codehilite .hll, .md-typeset .highlight .hll { + display: block; + margin: 0 -1.2rem; + padding: 0 1.2rem; + background-color: rgba(255, 235, 59, 0.5); } + +.md-typeset .codehilite, .md-typeset .highlight { + position: relative; + margin: 1em 0; + padding: 0; + border-radius: 0.2rem; + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + line-height: 1.4; + -webkit-overflow-scrolling: touch; } + .md-typeset .codehilite pre, .md-typeset .highlight pre, + .md-typeset .codehilite code, .md-typeset .highlight code { + display: block; + margin: 0; + padding: 1.05rem 1.2rem; + background-color: transparent; + overflow: auto; + vertical-align: top; } + .md-typeset .codehilite pre::-webkit-scrollbar, .md-typeset .highlight pre::-webkit-scrollbar, + .md-typeset .codehilite code::-webkit-scrollbar, .md-typeset .highlight code::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-typeset .codehilite pre::-webkit-scrollbar-thumb, .md-typeset .highlight pre::-webkit-scrollbar-thumb, + .md-typeset .codehilite code::-webkit-scrollbar-thumb, .md-typeset .highlight code::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-typeset .codehilite pre::-webkit-scrollbar-thumb:hover, .md-typeset .highlight pre::-webkit-scrollbar-thumb:hover, + .md-typeset .codehilite code::-webkit-scrollbar-thumb:hover, .md-typeset .highlight code::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + +.md-typeset pre.codehilite, .md-typeset pre.highlight { + overflow: visible; } + .md-typeset pre.codehilite code, .md-typeset pre.highlight code { + display: block; + padding: 1.05rem 1.2rem; + overflow: auto; } + +.md-typeset .codehilitetable, .md-typeset .highlighttable { + display: block; + margin: 1em 0; + border-radius: 0.2em; + font-size: 1.6rem; + overflow: hidden; } + .md-typeset .codehilitetable tbody, .md-typeset .highlighttable tbody, + .md-typeset .codehilitetable td, .md-typeset .highlighttable td { + display: block; + padding: 0; } + .md-typeset .codehilitetable tr, .md-typeset .highlighttable tr { + display: flex; } + .md-typeset .codehilitetable .codehilite, .md-typeset .highlighttable .codehilite, .md-typeset .codehilitetable .highlight, .md-typeset .highlighttable .highlight, + .md-typeset .codehilitetable .linenodiv, .md-typeset .highlighttable .linenodiv { + margin: 0; + border-radius: 0; } + .md-typeset .codehilitetable .linenodiv, .md-typeset .highlighttable .linenodiv { + padding: 1.05rem 1.2rem; } + .md-typeset .codehilitetable .linenos, .md-typeset .highlighttable .linenos { + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.26); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .md-typeset .codehilitetable .linenos pre, .md-typeset .highlighttable .linenos pre { + margin: 0; + padding: 0; + background-color: transparent; + color: inherit; + text-align: right; } + .md-typeset .codehilitetable .code, .md-typeset .highlighttable .code { + flex: 1; + overflow: hidden; } + +.md-typeset > .codehilitetable, .md-typeset > .highlighttable { + box-shadow: none; } + +.md-typeset [id^="fnref:"] { + display: inline-block; } + .md-typeset [id^="fnref:"]:target { + margin-top: -7.6rem; + padding-top: 7.6rem; + pointer-events: none; } + +.md-typeset [id^="fn:"]::before { + display: none; + height: 0; + content: ""; } + +.md-typeset [id^="fn:"]:target::before { + display: block; + margin-top: -7rem; + padding-top: 7rem; + pointer-events: none; } + +.md-typeset .footnote { + color: rgba(0, 0, 0, 0.54); + font-size: 1.28rem; } + .md-typeset .footnote ol { + margin-left: 0; } + .md-typeset .footnote li { + transition: color 0.25s; } + .md-typeset .footnote li:target { + color: rgba(0, 0, 0, 0.87); } + .md-typeset .footnote li :first-child { + margin-top: 0; } + .md-typeset .footnote li:hover .footnote-backref, + .md-typeset .footnote li:target .footnote-backref { + -webkit-transform: translateX(0); + transform: translateX(0); + opacity: 1; } + .md-typeset .footnote li:hover .footnote-backref:hover, + .md-typeset .footnote li:target .footnote-backref { + color: #536dfe; } + +.md-typeset .footnote-ref { + display: inline-block; + pointer-events: initial; } + .md-typeset .footnote-ref::before { + display: inline; + margin: 0 0.2em; + border-left: 0.1rem solid rgba(0, 0, 0, 0.26); + font-size: 1.25em; + content: ""; + vertical-align: -0.5rem; } + +.md-typeset .footnote-backref { + display: inline-block; + -webkit-transform: translateX(0.5rem); + transform: translateX(0.5rem); + transition: color 0.25s, opacity 0.125s 0.125s, -webkit-transform 0.25s 0.125s; + transition: transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s; + transition: transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s, -webkit-transform 0.25s 0.125s; + color: rgba(0, 0, 0, 0.26); + font-size: 0; + opacity: 0; + vertical-align: text-bottom; } + [dir="rtl"] .md-typeset .footnote-backref { + -webkit-transform: translateX(-0.5rem); + transform: translateX(-0.5rem); } + .md-typeset .footnote-backref::before { + display: inline-block; + font-size: 1.6rem; + content: "\E31B"; } + [dir="rtl"] .md-typeset .footnote-backref::before { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); } + +.md-typeset .headerlink { + display: inline-block; + margin-left: 1rem; + -webkit-transform: translate(0, 0.5rem); + transform: translate(0, 0.5rem); + transition: color 0.25s, opacity 0.125s 0.25s, -webkit-transform 0.25s 0.25s; + transition: transform 0.25s 0.25s, color 0.25s, opacity 0.125s 0.25s; + transition: transform 0.25s 0.25s, color 0.25s, opacity 0.125s 0.25s, -webkit-transform 0.25s 0.25s; + opacity: 0; } + [dir="rtl"] .md-typeset .headerlink { + margin-right: 1rem; + margin-left: initial; } + html body .md-typeset .headerlink { + color: rgba(0, 0, 0, 0.26); } + +.md-typeset h1[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h1[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h1[id]:hover .headerlink, +.md-typeset h1[id]:target .headerlink, +.md-typeset h1[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h1[id]:hover .headerlink:hover, +.md-typeset h1[id]:target .headerlink, +.md-typeset h1[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h2[id]::before { + display: block; + margin-top: -0.8rem; + padding-top: 0.8rem; + content: ""; } + +.md-typeset h2[id]:target::before { + margin-top: -6.8rem; + padding-top: 6.8rem; } + +.md-typeset h2[id]:hover .headerlink, +.md-typeset h2[id]:target .headerlink, +.md-typeset h2[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h2[id]:hover .headerlink:hover, +.md-typeset h2[id]:target .headerlink, +.md-typeset h2[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h3[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h3[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h3[id]:hover .headerlink, +.md-typeset h3[id]:target .headerlink, +.md-typeset h3[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h3[id]:hover .headerlink:hover, +.md-typeset h3[id]:target .headerlink, +.md-typeset h3[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h4[id]::before { + display: block; + margin-top: -0.9rem; + padding-top: 0.9rem; + content: ""; } + +.md-typeset h4[id]:target::before { + margin-top: -6.9rem; + padding-top: 6.9rem; } + +.md-typeset h4[id]:hover .headerlink, +.md-typeset h4[id]:target .headerlink, +.md-typeset h4[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h4[id]:hover .headerlink:hover, +.md-typeset h4[id]:target .headerlink, +.md-typeset h4[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h5[id]::before { + display: block; + margin-top: -1.1rem; + padding-top: 1.1rem; + content: ""; } + +.md-typeset h5[id]:target::before { + margin-top: -7.1rem; + padding-top: 7.1rem; } + +.md-typeset h5[id]:hover .headerlink, +.md-typeset h5[id]:target .headerlink, +.md-typeset h5[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h5[id]:hover .headerlink:hover, +.md-typeset h5[id]:target .headerlink, +.md-typeset h5[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset h6[id]::before { + display: block; + margin-top: -1.1rem; + padding-top: 1.1rem; + content: ""; } + +.md-typeset h6[id]:target::before { + margin-top: -7.1rem; + padding-top: 7.1rem; } + +.md-typeset h6[id]:hover .headerlink, +.md-typeset h6[id]:target .headerlink, +.md-typeset h6[id] .headerlink:focus { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + opacity: 1; } + +.md-typeset h6[id]:hover .headerlink:hover, +.md-typeset h6[id]:target .headerlink, +.md-typeset h6[id] .headerlink:focus { + color: #536dfe; } + +.md-typeset .MJXc-display { + margin: 0.75em 0; + padding: 0.75em 0; + overflow: auto; + -webkit-overflow-scrolling: touch; } + +.md-typeset .MathJax_CHTML { + outline: 0; } + +.md-typeset del.critic, +.md-typeset ins.critic, +.md-typeset .critic.comment { + margin: 0 0.25em; + padding: 0.0625em 0; + border-radius: 0.2rem; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; } + +.md-typeset del.critic { + background-color: #FFDDDD; + box-shadow: 0.25em 0 0 #FFDDDD, -0.25em 0 0 #FFDDDD; } + +.md-typeset ins.critic { + background-color: #DDFFDD; + box-shadow: 0.25em 0 0 #DDFFDD, -0.25em 0 0 #DDFFDD; } + +.md-typeset .critic.comment { + background-color: rgba(236, 236, 236, 0.5); + color: #37474F; + box-shadow: 0.25em 0 0 rgba(236, 236, 236, 0.5), -0.25em 0 0 rgba(236, 236, 236, 0.5); } + .md-typeset .critic.comment::before { + padding-right: 0.125em; + color: rgba(0, 0, 0, 0.26); + content: "\E0B7"; + vertical-align: -0.125em; } + +.md-typeset .critic.block { + display: block; + margin: 1em 0; + padding-right: 1.6rem; + padding-left: 1.6rem; + box-shadow: none; } + .md-typeset .critic.block :first-child { + margin-top: 0.5em; } + .md-typeset .critic.block :last-child { + margin-bottom: 0.5em; } + +.md-typeset details { + display: block; + padding-top: 0; } + .md-typeset details[open] > summary::after { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + .md-typeset details:not([open]) { + padding-bottom: 0; } + .md-typeset details:not([open]) > summary { + border-bottom: none; } + .md-typeset details summary { + padding-right: 4rem; } + [dir="rtl"] .md-typeset details summary { + padding-left: 4rem; } + .no-details .md-typeset details:not([open]) > * { + display: none; } + .no-details .md-typeset details:not([open]) summary { + display: block; } + +.md-typeset summary { + display: block; + outline: none; + cursor: pointer; } + .md-typeset summary::-webkit-details-marker { + display: none; } + .md-typeset summary::after { + position: absolute; + top: 0.8rem; + right: 1.2rem; + color: rgba(0, 0, 0, 0.26); + font-size: 2rem; + content: "\E313"; } + [dir="rtl"] .md-typeset summary::after { + right: initial; + left: 1.2rem; } + +.md-typeset .emojione { + width: 2rem; + vertical-align: text-top; } + +.md-typeset code.codehilite, .md-typeset code.highlight { + margin: 0 0.29412em; + padding: 0.07353em 0; } + +.md-typeset .superfences-content { + display: none; + order: 99; + width: 100%; + background-color: white; } + .md-typeset .superfences-content > * { + margin: 0; + border-radius: 0; } + +.md-typeset .superfences-tabs { + display: flex; + position: relative; + flex-wrap: wrap; + margin: 1em 0; + border: 0.1rem solid rgba(0, 0, 0, 0.07); + border-radius: 0.2em; } + .md-typeset .superfences-tabs > input { + display: none; } + .md-typeset .superfences-tabs > input:checked + label { + font-weight: 700; } + .md-typeset .superfences-tabs > input:checked + label + .superfences-content { + display: block; } + .md-typeset .superfences-tabs > label { + width: auto; + padding: 1.2rem 1.2rem; + transition: color 0.125s; + font-size: 1.28rem; + cursor: pointer; } + html .md-typeset .superfences-tabs > label:hover { + color: #536dfe; } + +.md-typeset .task-list-item { + position: relative; + list-style-type: none; } + .md-typeset .task-list-item [type="checkbox"] { + position: absolute; + top: 0.45em; + left: -2em; } + [dir="rtl"] .md-typeset .task-list-item [type="checkbox"] { + right: -2em; + left: initial; } + +.md-typeset .task-list-control .task-list-indicator::before { + position: absolute; + top: 0.15em; + left: -1.25em; + color: rgba(0, 0, 0, 0.26); + font-size: 1.25em; + content: "\E835"; + vertical-align: -0.25em; } + [dir="rtl"] .md-typeset .task-list-control .task-list-indicator::before { + right: -1.25em; + left: initial; } + +.md-typeset .task-list-control [type="checkbox"]:checked + .task-list-indicator::before { + content: "\E834"; } + +.md-typeset .task-list-control [type="checkbox"] { + opacity: 0; + z-index: -1; } + +@media print { + .md-typeset a::after { + color: rgba(0, 0, 0, 0.54); + content: " [" attr(href) "]"; } + .md-typeset code, + .md-typeset pre { + white-space: pre-wrap; } + .md-typeset code { + box-shadow: none; + -webkit-box-decoration-break: initial; + box-decoration-break: initial; } + .md-clipboard { + display: none; } + .md-content__icon { + display: none; } + .md-header { + display: none; } + .md-footer { + display: none; } + .md-sidebar { + display: none; } + .md-tabs { + display: none; } + .md-typeset .headerlink { + display: none; } } + +@media only screen and (max-width: 44.9375em) { + .md-typeset pre { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset pre > code { + padding: 1.05rem 1.6rem; } + .md-footer-nav__link--prev .md-footer-nav__title { + display: none; } + .md-search-result__teaser { + max-height: 5rem; + -webkit-line-clamp: 3; } + .codehilite .hll, .md-typeset .highlight .hll { + margin: 0 -1.6rem; + padding: 0 1.6rem; } + .md-typeset > .codehilite, .md-typeset > .highlight { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset > .codehilite pre, .md-typeset > .highlight pre, + .md-typeset > .codehilite code, + .md-typeset > .highlight code { + padding: 1.05rem 1.6rem; } + .md-typeset > .codehilitetable, .md-typeset > .highlighttable { + margin: 1em -1.6rem; + border-radius: 0; } + .md-typeset > .codehilitetable .codehilite > pre, .md-typeset > .highlighttable .codehilite > pre, .md-typeset > .codehilitetable .highlight > pre, .md-typeset > .highlighttable .highlight > pre, + .md-typeset > .codehilitetable .codehilite > code, + .md-typeset > .highlighttable .codehilite > code, .md-typeset > .codehilitetable .highlight > code, .md-typeset > .highlighttable .highlight > code, + .md-typeset > .codehilitetable .linenodiv, + .md-typeset > .highlighttable .linenodiv { + padding: 1rem 1.6rem; } + .md-typeset > p > .MJXc-display { + margin: 0.75em -1.6rem; + padding: 0.25em 1.6rem; } + .md-typeset > .superfences-tabs { + margin: 1em -1.6rem; + border: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); + border-radius: 0; } + .md-typeset > .superfences-tabs pre, + .md-typeset > .superfences-tabs code { + padding: 1.05rem 1.6rem; } } + +@media only screen and (min-width: 100em) { + html { + font-size: 68.75%; } } + +@media only screen and (min-width: 125em) { + html { + font-size: 75%; } } + +@media only screen and (max-width: 59.9375em) { + body[data-md-state="lock"] { + overflow: hidden; } + .ios body[data-md-state="lock"] .md-container { + display: none; } + html .md-nav__link[for="__toc"] { + display: block; + padding-right: 4.8rem; } + html .md-nav__link[for="__toc"]::after { + color: inherit; + content: "\E8DE"; } + html .md-nav__link[for="__toc"] + .md-nav__link { + display: none; } + html .md-nav__link[for="__toc"] ~ .md-nav { + display: flex; } + html [dir="rtl"] .md-nav__link { + padding-right: 1.6rem; + padding-left: 4.8rem; } + .md-nav__source { + display: block; + padding: 0 0.4rem; + background-color: rgba(50, 64, 144, 0.9675); + color: white; } + .md-search__overlay { + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 3.6rem; + height: 3.6rem; + -webkit-transform-origin: center; + transform-origin: center; + transition: opacity 0.2s 0.2s, -webkit-transform 0.3s 0.1s; + transition: transform 0.3s 0.1s, opacity 0.2s 0.2s; + transition: transform 0.3s 0.1s, opacity 0.2s 0.2s, -webkit-transform 0.3s 0.1s; + border-radius: 2rem; + background-color: white; + overflow: hidden; + pointer-events: none; } + [dir="rtl"] .md-search__overlay { + right: 0.4rem; + left: initial; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + transition: opacity 0.1s, -webkit-transform 0.4s; + transition: transform 0.4s, opacity 0.1s; + transition: transform 0.4s, opacity 0.1s, -webkit-transform 0.4s; + opacity: 1; } + .md-search__inner { + position: fixed; + top: 0; + left: 100%; + width: 100%; + height: 100%; + -webkit-transform: translateX(5%); + transform: translateX(5%); + transition: right 0s 0.3s, left 0s 0.3s, opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1); + transition: right 0s 0.3s, left 0s 0.3s, transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s 0.15s; + transition: right 0s 0.3s, left 0s 0.3s, transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0; + z-index: 2; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + left: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: right 0s 0s, left 0s 0s, opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + transition: right 0s 0s, left 0s 0s, transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s 0.15s; + transition: right 0s 0s, left 0s 0s, transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.15s 0.15s, -webkit-transform 0.15s 0.15s cubic-bezier(0.1, 0.7, 0.1, 1); + opacity: 1; } + [dir="rtl"] [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + right: 0; + left: initial; } + html [dir="rtl"] .md-search__inner { + right: 100%; + left: initial; + -webkit-transform: translateX(-5%); + transform: translateX(-5%); } + .md-search__input { + width: 100%; + height: 4.8rem; + font-size: 1.8rem; } + .md-search__icon[for="__search"] { + top: 1.2rem; + left: 1.6rem; } + .md-search__icon[for="__search"][for="__search"]::before { + content: "\E5C4"; } + [dir="rtl"] .md-search__icon[for="__search"][for="__search"]::before { + content: "\E5C8"; } + .md-search__icon[type="reset"] { + top: 1.2rem; + right: 1.6rem; } + .md-search__output { + top: 4.8rem; + bottom: 0; } + .md-search-result__article--document::before { + display: none; } } + +@media only screen and (max-width: 76.1875em) { + [data-md-toggle="drawer"]:checked ~ .md-overlay { + width: 100%; + height: 100%; + transition: width 0s, height 0s, opacity 0.25s; + opacity: 1; } + .md-header-nav__button.md-icon--home, .md-header-nav__button.md-logo { + display: none; } + .md-hero__inner { + margin-top: 4.8rem; + margin-bottom: 2.4rem; } + .md-nav { + background-color: white; } + .md-nav--primary, + .md-nav--primary .md-nav { + display: flex; + position: absolute; + top: 0; + right: 0; + left: 0; + flex-direction: column; + height: 100%; + z-index: 1; } + .md-nav--primary .md-nav__title, + .md-nav--primary .md-nav__item { + font-size: 1.6rem; + line-height: 1.5; } + html .md-nav--primary .md-nav__title { + position: relative; + height: 11.2rem; + padding: 6rem 1.6rem 0.4rem; + background-color: rgba(0, 0, 0, 0.07); + color: rgba(0, 0, 0, 0.54); + font-weight: 400; + line-height: 4.8rem; + white-space: nowrap; + cursor: pointer; } + html .md-nav--primary .md-nav__title::before { + display: block; + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 4rem; + height: 4rem; + color: rgba(0, 0, 0, 0.54); } + html .md-nav--primary .md-nav__title ~ .md-nav__list { + background-color: white; + box-shadow: 0 0.1rem 0 rgba(0, 0, 0, 0.07) inset; } + html .md-nav--primary .md-nav__title ~ .md-nav__list > .md-nav__item:first-child { + border-top: 0; } + html .md-nav--primary .md-nav__title--site { + position: relative; + background-color: #3f51b5; + color: white; } + html .md-nav--primary .md-nav__title--site .md-nav__button { + display: block; + position: absolute; + top: 0.4rem; + left: 0.4rem; + width: 6.4rem; + height: 6.4rem; + font-size: 4.8rem; } + html .md-nav--primary .md-nav__title--site::before { + display: none; } + html [dir="rtl"] .md-nav--primary .md-nav__title::before { + right: 0.4rem; + left: initial; } + html [dir="rtl"] .md-nav--primary .md-nav__title--site .md-nav__button { + right: 0.4rem; + left: initial; } + .md-nav--primary .md-nav__list { + flex: 1; + overflow-y: auto; } + .md-nav--primary .md-nav__item { + padding: 0; + border-top: 0.1rem solid rgba(0, 0, 0, 0.07); } + [dir="rtl"] .md-nav--primary .md-nav__item { + padding: 0; } + .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 4.8rem; } + [dir="rtl"] .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 1.6rem; + padding-left: 4.8rem; } + .md-nav--primary .md-nav__item--nested > .md-nav__link::after { + content: "\E315"; } + [dir="rtl"] .md-nav--primary .md-nav__item--nested > .md-nav__link::after { + content: "\E314"; } + .md-nav--primary .md-nav__link { + position: relative; + margin-top: 0; + padding: 1.2rem 1.6rem; } + .md-nav--primary .md-nav__link::after { + position: absolute; + top: 50%; + right: 1.2rem; + margin-top: -1.2rem; + color: inherit; + font-size: 2.4rem; } + [dir="rtl"] .md-nav--primary .md-nav__link::after { + right: initial; + left: 1.2rem; } + .md-nav--primary .md-nav--secondary .md-nav__link { + position: static; } + .md-nav--primary .md-nav--secondary .md-nav { + position: static; + background-color: transparent; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-left: 2.8rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-right: 2.8rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link { + padding-left: 4rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link { + padding-right: 4rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link { + padding-left: 5.2rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link { + padding-right: 5.2rem; + padding-left: initial; } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link { + padding-left: 6.4rem; } + [dir="rtl"] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link { + padding-right: 6.4rem; + padding-left: initial; } + .md-nav__toggle ~ .md-nav { + display: flex; + -webkit-transform: translateX(100%); + transform: translateX(100%); + transition: opacity 0.125s 0.05s, -webkit-transform 0.25s cubic-bezier(0.8, 0, 0.6, 1); + transition: transform 0.25s cubic-bezier(0.8, 0, 0.6, 1), opacity 0.125s 0.05s; + transition: transform 0.25s cubic-bezier(0.8, 0, 0.6, 1), opacity 0.125s 0.05s, -webkit-transform 0.25s cubic-bezier(0.8, 0, 0.6, 1); + opacity: 0; } + [dir="rtl"] .md-nav__toggle ~ .md-nav { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); } + .no-csstransforms3d .md-nav__toggle ~ .md-nav { + display: none; } + .md-nav__toggle:checked ~ .md-nav { + -webkit-transform: translateX(0); + transform: translateX(0); + transition: opacity 0.125s 0.125s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.125s 0.125s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.125s 0.125s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 1; } + .no-csstransforms3d .md-nav__toggle:checked ~ .md-nav { + display: flex; } + .md-sidebar--primary { + position: fixed; + top: 0; + left: -24.2rem; + width: 24.2rem; + height: 100%; + -webkit-transform: translateX(0); + transform: translateX(0); + transition: box-shadow 0.25s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s; + transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.25s, -webkit-transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); + background-color: white; + z-index: 3; } + [dir="rtl"] .md-sidebar--primary { + right: -24.2rem; + left: initial; } + .no-csstransforms3d .md-sidebar--primary { + display: none; } + [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); + -webkit-transform: translateX(24.2rem); + transform: translateX(24.2rem); } + [dir="rtl"] [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + -webkit-transform: translateX(-24.2rem); + transform: translateX(-24.2rem); } + .no-csstransforms3d [data-md-toggle="drawer"]:checked ~ .md-container .md-sidebar--primary { + display: block; } + .md-sidebar--primary .md-sidebar__scrollwrap { + overflow: hidden; } + .md-sidebar--primary .md-sidebar__scrollwrap { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: 0; } + .md-tabs { + display: none; } } + +@media only screen and (min-width: 60em) { + .md-content { + margin-right: 24.2rem; } + [dir="rtl"] .md-content { + margin-right: initial; + margin-left: 24.2rem; } + .md-header-nav__button.md-icon--search { + display: none; } + .md-header-nav__source { + display: block; + width: 23rem; + max-width: 23rem; + margin-left: 2.8rem; + padding-right: 1.2rem; } + [dir="rtl"] .md-header-nav__source { + margin-right: 2.8rem; + margin-left: initial; + padding-right: initial; + padding-left: 1.2rem; } + .md-search { + padding: 0.4rem; } + .md-search__overlay { + position: fixed; + top: 0; + left: 0; + width: 0; + height: 0; + transition: width 0s 0.25s, height 0s 0.25s, opacity 0.25s; + background-color: rgba(0, 0, 0, 0.54); + cursor: pointer; } + [dir="rtl"] .md-search__overlay { + right: 0; + left: initial; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + width: 100%; + height: 100%; + transition: width 0s, height 0s, opacity 0.25s; + opacity: 1; } + .md-search__inner { + position: relative; + width: 23rem; + padding: 0.2rem 0; + float: right; + transition: width 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); } + [dir="rtl"] .md-search__inner { + float: left; } + .md-search__form { + border-radius: 0.2rem; } + .md-search__input { + width: 100%; + height: 3.6rem; + padding-left: 4.4rem; + transition: background-color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1), color 0.25s cubic-bezier(0.1, 0.7, 0.1, 1); + border-radius: 0.2rem; + background-color: rgba(0, 0, 0, 0.26); + color: inherit; + font-size: 1.6rem; } + [dir="rtl"] .md-search__input { + padding-right: 4.4rem; } + .md-search__input + .md-search__icon { + color: inherit; } + .md-search__input::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input::-ms-input-placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input::placeholder { + color: rgba(255, 255, 255, 0.7); } + .md-search__input:hover { + background-color: rgba(255, 255, 255, 0.12); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input { + border-radius: 0.2rem 0.2rem 0 0; + background-color: white; + color: rgba(0, 0, 0, 0.87); + text-overflow: none; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::-webkit-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input:-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::-ms-input-placeholder { + color: rgba(0, 0, 0, 0.54); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__input + .md-search__icon, [data-md-toggle="search"]:checked ~ .md-header .md-search__input::placeholder { + color: rgba(0, 0, 0, 0.54); } + .md-search__output { + top: 3.8rem; + transition: opacity 0.4s; + opacity: 0; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__output { + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.4); + opacity: 1; } + .md-search__scrollwrap { + max-height: 0; } + [data-md-toggle="search"]:checked ~ .md-header .md-search__scrollwrap { + max-height: 75vh; } + .md-search__scrollwrap::-webkit-scrollbar { + width: 0.4rem; + height: 0.4rem; } + .md-search__scrollwrap::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.26); } + .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: #536dfe; } + .md-search-result__meta { + padding-left: 4.4rem; } + [dir="rtl"] .md-search-result__meta { + padding-right: 4.4rem; + padding-left: initial; } + .md-search-result__article { + padding-left: 4.4rem; } + [dir="rtl"] .md-search-result__article { + padding-right: 4.4rem; + padding-left: 1.6rem; } + .md-sidebar--secondary { + display: block; + margin-left: 100%; + -webkit-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + [dir="rtl"] .md-sidebar--secondary { + margin-right: 100%; + margin-left: initial; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); } } + +@media only screen and (min-width: 76.25em) { + .md-content { + margin-left: 24.2rem; } + [dir="rtl"] .md-content { + margin-right: 24.2rem; } + .md-content__inner { + margin-right: 2.4rem; + margin-left: 2.4rem; } + .md-header-nav__button.md-icon--menu { + display: none; } + .md-nav[data-md-state="animate"] { + transition: max-height 0.25s cubic-bezier(0.86, 0, 0.07, 1); } + .md-nav__toggle ~ .md-nav { + max-height: 0; + overflow: hidden; } + .no-js .md-nav__toggle ~ .md-nav { + display: none; } + .md-nav__toggle:checked ~ .md-nav, .md-nav[data-md-state="expand"] { + max-height: 100%; } + .no-js .md-nav__toggle:checked ~ .md-nav, .no-js .md-nav[data-md-state="expand"] { + display: block; } + .md-nav__item--nested > .md-nav > .md-nav__title { + display: none; } + .md-nav__item--nested > .md-nav__link::after { + display: inline-block; + -webkit-transform-origin: 0.45em 0.45em; + transform-origin: 0.45em 0.45em; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + vertical-align: -0.125em; } + .js .md-nav__item--nested > .md-nav__link::after { + transition: -webkit-transform 0.4s; + transition: transform 0.4s; + transition: transform 0.4s, -webkit-transform 0.4s; } + .md-nav__item--nested .md-nav__toggle:checked ~ .md-nav__link::after { + -webkit-transform: rotateX(180deg); + transform: rotateX(180deg); } + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + width: 68.8rem; } + .md-search__scrollwrap { + width: 68.8rem; } + .md-sidebar--secondary { + margin-left: 122rem; } + [dir="rtl"] .md-sidebar--secondary { + margin-right: 122rem; + margin-left: initial; } + .md-tabs ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested { + font-size: 0; + visibility: hidden; } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title { + display: block; + padding: 0; } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title--site { + display: none; } + .no-js .md-tabs--active ~ .md-main .md-nav--primary .md-nav { + display: block; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item { + font-size: 0; + visibility: hidden; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested { + display: none; + font-size: 1.4rem; + overflow: auto; + visibility: visible; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested > .md-nav__link { + display: none; } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--active { + display: block; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] { + max-height: initial; + overflow: visible; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] > .md-nav__list > .md-nav__item { + padding-left: 0; } + .md-tabs--active ~ .md-main .md-nav[data-md-level="1"] .md-nav .md-nav__title { + display: none; } } + +@media only screen and (min-width: 45em) { + .md-footer-nav__link { + width: 50%; } + .md-footer-copyright { + max-width: 75%; + float: left; } + [dir="rtl"] .md-footer-copyright { + float: right; } + .md-footer-social { + padding: 1.2rem 0; + float: right; } + [dir="rtl"] .md-footer-social { + float: left; } } + +@media only screen and (max-width: 29.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(45); + transform: scale(45); } } + +@media only screen and (min-width: 30em) and (max-width: 44.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(60); + transform: scale(60); } } + +@media only screen and (min-width: 45em) and (max-width: 59.9375em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__overlay { + -webkit-transform: scale(75); + transform: scale(75); } } + +@media only screen and (min-width: 60em) and (max-width: 76.1875em) { + [data-md-toggle="search"]:checked ~ .md-header .md-search__inner { + width: 46.8rem; } + .md-search__scrollwrap { + width: 46.8rem; } + .md-search-result__teaser { + max-height: 5rem; + -webkit-line-clamp: 3; } } + +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJhc3NldHMvc3R5bGVzaGVldHMvYXBwbGljYXRpb24uNDUxZjgwZTUuY3NzIiwic291cmNlUm9vdCI6IiJ9*/ \ No newline at end of file diff --git a/changelog/index.html b/changelog/index.html new file mode 100755 index 0000000..2ba14e3 --- /dev/null +++ b/changelog/index.html @@ -0,0 +1,890 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + + + + +
+
+ + + + + +

JUT Version ChangelogLink

+

Version 1.5.1 changes (10/13/2018):Link

+
    +
  • Added new userHasPermissions method overload to AuthManager
  • +
  • Added new userHasPermissions method overload to Subject
  • +
  • Fixed bugs and missing methods in Subject
  • +
  • Fixed deprecated methods in NativeMethods
  • +
  • Fixed other small bugs
  • +
+

Version 1.5.0 changes (10/07/2018):Link

+
    +
  • Updated JDK to Java 10
  • +
  • Login Dialogs now don't require the use of Platform.runLater()
  • +
  • Message Boxes now don't require the use of Platform.runLater()
  • +
  • Message Box Default button is now in the right order.
  • +
  • Massive changes to authentication and permissions system
  • +
  • Renamed jbdc to jdbc
  • +
  • Removed all deprecated methods from 1.4.0
  • +
  • Updated javadoc
  • +
  • Replaced some loops with streams
  • +
  • Added trim to all string isEmpty checks
  • +
  • Added UTF_8 protection
  • +
  • Added ExceptionUtils class for use in junit tests
  • +
  • All password hashing now uses BCrypt replacing SHA-512
  • +
  • Other minor fixes
  • +
+

Version 1.4.2 changes (1/23/2018):Link

+
    +
  • Fixed fatal error with isUserLoggedIn method
  • +
+

Version 1.4.1 changes (1/22/2018):Link

+
    +
  • Added UserManagerException
  • +
  • Added PasswordHashingFailedException
  • +
  • Added isAdminLoggedIn method
  • +
  • Added getAdminOverride and getUserVerification methods
  • +
  • Added requireAdmin and requireAndVerifyAdmin methods
  • +
  • Added isLoggedIn method
  • +
  • Fixed rare bugs with loginUser and logoutUser methods
  • +
  • Fixed exception that was thrown if user did not exist on login dialog
  • +
  • Limited number of SQLException and GeneralSecurityException checked exceptions
  • +
  • Changed Session Manager dialogs to use instance vars for parameters(old methods deprecated)
  • +
+

Version 1.4.0 changes (1/19/2018):Link

+
    +
  • Added User Management Classes (UserManager, UserAccount, UserRoleManager and UserRole)
  • +
  • Added Permission Management Classes (Permission Manager and Permission)
  • +
  • Added Session Management Classes (Session Manager, MultiSessionManager and Session)
  • +
  • Added Database Builder Classes For Building SQL Code
  • +
  • Added HyperSQL Database Support
  • +
  • Added Custom Event/Event Handler System
  • +
  • Added New Utilities Classes (StringUtils, NumberUtils and CollectionUtils)
  • +
+

NOTE: Some API changes have occurred: +* Moved Database.Users class to UsersManager class +* Made Database class constructor auto-connect to database +* Deprecated DatabaseConnectionInfo fields and replaced with getters/setters +* Made all utility classes final and have private constructors +* Made all method parameters and most existing classes final +* Added period to first line of all javadoc comments +* Updated SecurityTools.getFileHash to use Apache Commons Codec Library (Java 9 Fix) +* Renamed ReInitalizeHW to ReInitializeHW +* Renamed ReInitalizeOS to ReInitializeOS

+

Version 1.3.1 changes (⅘/2017):Link

+
    +
  • Added FXML Dialog Wrapper
  • +
  • JavaDocs documentation is improved
  • +
  • Pom file is improved and updated
  • +
  • Now hosted on Maven Central
  • +
+

Version 1.3.0 changes (3/31/2017):Link

+
    +
  • Added MessageBox and Login dialog objects
  • +
  • Added Static Class Instantiation Protection
  • +
  • Added Database Tools classes (Includes SQLite and H2 databases)
  • +
  • All dependencies are now included in jar file
  • +
  • JavaDocs documentation is improved
  • +
+

Version 1.2.0 changes (02/22/2017):Link

+
    +
  • Fixed ComputerNameActive and ComputerNamePending not returning accurate value
  • +
  • Added ComputerInfo Class
  • +
  • Fixed a naming bug since version 1.1 that caused an infinite loop
  • +
  • Fixed the java.IO.File.delete calls to now use the java.nio.file.Files.delete
  • +
  • Created a demo if the library is run directly
  • +
  • Fixed error with RSA generate key pair, it didn't check if save to files was true
  • +
  • Fixed error with ConvertBytes function not returning accurate value
  • +
+

Version 1.1.0 changes (02/18/2017):Link

+
    +
  • Created OSInfo, HWInfo, SecurityTools and WebTools classes instead of packages to improve importing.
  • +
  • Renamed StringExpanded2 to StringExpandedFromRegistry.
  • +
  • Moved tools.osinfo.Enums to just tools.Enums.
  • +
  • Finalized JavaDocs. Everything is documented correctly now.
  • +
+

Version 1.0.0 changes (02/13/2017):Link

+
    +
  • Initial Release
  • +
+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/docs/AuthSystem/AuthManager.md b/docs/AuthSystem/AuthManager.md deleted file mode 100644 index 47afbcc..0000000 --- a/docs/AuthSystem/AuthManager.md +++ /dev/null @@ -1,872 +0,0 @@ -#Auth Manager - -##Introduction -Package Name: [com.jgcomptech.tools.authc.AuthManager](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/AuthManager.html) - -The Auth Manager class contains all methods needed for controlling the Auth System. -This includes methods to manage user accounts, login sessions, user roles and user permissions. - -##Setup -The Auth Manager is a singleton class but a new instance still needs to be initialized upon first use. -When a new instance is created a "users" table is automatically created in the specified database. -The following code can be used to create a new instance: -``` java -try(final var db = new Database("./mydb.db", DatabaseType.H2)) { - final var manager = AuthManager.getNewInstance(db); -} -``` - -After the new instance has been created you can use the following to retrieve the instance again: -``` java -try(final var db = new Database("./mydb.db", DatabaseType.H2)) { - final var manager = AuthManager.getInstance(); -} -``` - -An icon path and program name may also be optionally provided as parameters to change the -icon and program name for all login dialogs. - -##User Account Methods - -###Create A New User (createUser) -To create a new user use the createUser method supplying the following parameters: - -- Username - The username of the new account -- Password - The password of the new account -- User Role - The user role of the new account - -The user role can be a text string or one of the -items from the UserRoleManager.SystemUserRoles enum. - -The UserRoleManager.SystemUserRoles list contains: - -- ADMIN -- AUTHOR -- EDITOR -- BASIC -- NONE - -!!! note - The NONE user role can never have permissions assigned to it. - Using the NONE user role is a quick way to remove all permissions from a user. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - authManager.createUser("admin", "1234", UserRoleManager.SystemUserRoles.ADMIN); - authManager.createUser("editor", "1234", UserRoleManager.SystemUserRoles.EDITOR); - ``` - -###Delete An Existing User (deleteUser) -To delete an existing user use the deleteUser method supplying the following parameter: - -- Username - The username of the account to delete - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - authManager.deleteUser("admin"); - ``` - -###Get Username Object (getUser) -Retrieves a readonly immutable UserAccount object. -To retrieve the object supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final UserAccount user = authManager.getUser("admin"); - ``` - -###Check If User Exists (userExists) -Checks to see if the specified user account exists. -To check a user account, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.userExists("admin"); - if(result) MessageBox.show("Admin User Exists!"); - else MessageBox.show("Admin User Does Not Exist!"); - ``` - -###Get Account Creation Date (getUserCreationDate) -Returns the date and time the user was initially created. - -There is two methods to retrieving the user creation date. -The date can either be returned as a LocalDateTime object or as a formatted string. - -####LocalDateTime Object -To retrieve the user creation date, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - final LocalDateTime result = authManager.getUserCreationDate("admin"); - MessageBox.show("Account Was Created On " + result.format(formatter)); - ``` - -####Formatted String Object -To retrieve the user creation date, supply the following parameters: - -- Username - The username of the account to lookup -- Format - The string that represents the format to return the date - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final String result = authManager.getUserCreationDate("admin", "yyyy-MM-dd HH:mm"); - MessageBox.show("Account Was Created On " + result); - ``` - -###Get User Role (getUserRole) -Retrieves the UserRole object assigned to the specified user. -To retrieve the object, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final UserRole userRole = authManager.getUserRole("admin"); - ``` - -###Set User Role (getUserRole) -Sets the user role assigned to the specified user. -To set the user role, supply the following parameters: - -- Username - The username of the account to lookup -- User Role - The user role of the new account - -The user role can be a text string or one of the -items from the UserRoleManager.SystemUserRoles enum. - -The UserRoleManager.SystemUserRoles list contains: - -- ADMIN -- AUTHOR -- EDITOR -- BASIC -- NONE - -!!! note - The NONE user role can never have permissions assigned to it. - Using the NONE user role is a quick way to remove all permissions from a user. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - userManager.setUserRole("admin", UserRoleManager.SystemUserRoles.ADMIN); - ``` - -###Set User Password (setPassword) -Sets the password assigned to the specified user. -To set the new password, supply the following parameters: - -- Username - The username of the account to lookup -- Password - The new password to set - -!!! note - If you want to prevent a user from setting an empty password - or to check for password complexity requirements those checks need - to be implemented separately. This method allows empty passwords. - Even if the password is empty, the empty password is still encrypted - with a random secure salt just like any supplied password would be. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - authManager.setPassword("admin", "newPass"); - ``` - -###Check If Password Matches (checkPasswordMatches) -This method allows you to check if the supplied password matches -the user's stored password in the database. -To verify the password, supply the following parameters: - -- Username - The username of the account to lookup -- Password - The password to verify - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.checkPasswordMatches("admin", "1234"); - if(result) MessageBox.show("Password Matches!"); - else MessageBox.show("Password Does Not Match!"); - ``` - -###Lock/Unlock A User (lockUser and unlockUser) -A locked user account prevents login and prevents any new sessions -to be opened for the user. Locking an user account may be needed for numerous reasons. - -To lock and unlock an account, supply the following parameter: - -- Username - The username of the account to lock/unlock - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - //Lock The Account - authManager.lockUser("admin"); - //Unlock The Account - authManager.unlockUser("admin"); - ``` - -###Check If A User Is Locked (isUserLocked) -A locked user account prevents login and prevents any new sessions -to be opened for the user. Locking an user account may be needed for numerous reasons. - -To check if an account is locked, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isUserLocked("admin"); - if(result) MessageBox.show("Admin Account Is Locked!"); - else MessageBox.show("Admin Account Is Unlocked!"); - ``` - -###Set User Password Expiration Date (setPasswordExpirationDate) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To set a password expiration date, supply the following parameters: - -- Username - The username of the account to update -- Expiration Date - A LocalDateTime object representing the expiration date - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - //Sets the date to now - authManager.setPasswordExpirationDate("admin", LocalDateTime.now()); - //Sets the date to 30 days from today - authManager.setPasswordExpirationDate("admin", LocalDateTime.now().plusDays(30)); - //First Method To Set the date to January 1st, 2019 at 8am - authManager.setPasswordExpirationDate("admin", LocalDateTime.of(2019, 1, 1, 8, 0)); - //Second Method To Set the date to January 1st of 2019 at 8am - authManager.setPasswordExpirationDate("admin", LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0)); - //Third Method To Set the date to January 1st of 2019 at 8am - final String str = "2019-01-01 08:00"; - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - authManager.setPasswordExpirationDate("admin", LocalDateTime.parse(str, formatter)); - ``` - -###Disable Password Expiration (disablePasswordExpiration) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To disable password expiration for a user, supply the following parameter: - -- Username - The username of the account to update - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - authManager.disablePasswordExpiration("admin"); - ``` - -###Check If User Password Is Expired (isPasswordExpired) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To check if a user's password is expired, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isPasswordExpired("admin"); - if(result) MessageBox.show("Admin Account Password Is Expired!"); - else MessageBox.show("Admin Account Password Is Not Expired!"); - ``` - -###Check If User Password Has Expiration Date (isPasswordSetToExpire) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To check if a user's password has an expiration date, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isPasswordSetToExpire("admin"); - if(result) MessageBox.show("Admin Account Password Has An Expiration Date!"); - else MessageBox.show("Admin Account Password Does Not Have An Expiration Date!"); - ``` - -###Get User Password Expiration Date (getPasswordExpirationDate) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -There is two methods to retrieving the password expiration date. -The date can either be returned as a LocalDateTime object or as a formatted string. - -!!! note - If the expiration date has been disabled or was never enabled this method will - still return an expiration date. For logistical database reasons a date still - has to be set. So the date will be set to 1000 years after the user account - was created or 1000 years after the date when the password expiration date - was last disabled. This number can be updated if any bugs occur but it seems - like 1000 years is far enough in the future to not cause any problems. - -####LocalDateTime Object -To retrieve the password expiration date, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - final LocalDateTime result = authManager.getPasswordExpirationDate("admin"); - MessageBox.show("Admin Account Password Expires At " + result.format(formatter)); - ``` - -####Formatted String Object -To retrieve the password expiration date, supply the following parameters: - -- Username - The username of the account to lookup -- Format - The string that represents the format to return the date - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final String result = authManager.getPasswordExpirationDate("admin", "yyyy-MM-dd HH:mm"); - MessageBox.show("Admin Account Password Expires At " + result); - ``` - -##Single-Session Methods - -###Get Logged-In Username (getLoggedInUsername) -Returns the username of the currently logged in user under the single session context. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final String currentUsername = authManager.getLoggedInUsername(); - ``` - -###Is Any User Logged-In (isUserLoggedIn) -Checks if a user is currently logged in under the single-user context. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isUserLoggedIn(); - if(result) MessageBox.show("A user is logged-in!"); - else MessageBox.show("No user is logged-in!"); - ``` - -###Is A Specific User Logged-In (isUserLoggedIn) -Checks if the specified user is currently logged in under the single-user context. -To check if a specific user is logged-in, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isUserLoggedIn("admin"); - if(result) MessageBox.show("Admin user is logged-in!"); - else MessageBox.show("Admin user is not logged-in!"); - ``` - -###Get Currently Logged-In User Session (getSession) -Retrieves the current session for the specified username, under the single-user context. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final Session currentSession = authManager.getSession(); - ``` - -###Get Specific User Session (getSession) -Retrieves the current session for the specified username, under the single-user context. - -To retrieve a specific user session, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final Session session = authManager.getSession("admin"); - ``` - -###Show Login Dialog (showLoginWindow) -Shows the login dialog window to log a user into the single-user context. -The method returns true if a user was logged in successfully. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.showLoginWindow(true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -###Login A Specific User (loginUser) -Logs in a user, under the single-user context, with the specified username, -without checking for valid credentials. - -To retrieve a specific user session, supply the following parameter: - -- Username - The username of the account to lookup - -!!! warning - This method does not validate credentials and should not be used except - in advanced use cases. A example case could be to login a user during unit testing. - The method showLoginWindow should be used instead. With this method - the user is immediately logged in as long as the user exists and other - checks pass (account unlocked, user role enabled and password not expired). - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.loginUser("admin"); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -###Logout Current Logged-In User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in. - - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.logoutUser(); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -###Logout Specific User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in or if the specified user does not exist. - -To logout a specific user, supply the following parameter: - -- Username - The username of the account to logout - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.logoutUser("admin"); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -###Get Currently Logged-In User's UserRole (getLoggedInUserRole) -Retrieves the user role of the currently logged in user under -the single user context. If no user is currently logged-in then this -method will return null. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final UserRole result = authManager.getLoggedInUserRole(); - ``` - -###Check If An Admin User Is Logged-In (isAdminLoggedIn) -Checks if an admin user is currently logged in under the single user context. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isAdminLoggedIn(); - if(result) MessageBox.show("An Admin user is logged-in!"); - else MessageBox.show("An Admin user is not logged-in!"); - ``` - -###Get Admin Login Override (getAdminOverride) -Requests an admin user to authenticate to override permissions by -showing the login dialog using the single session context. During this -process the admin user is not actually logged-in, instead just their -username, password and user role is verified. Returns true if -admin override succeeded and false if the cancel button was pressed -or if override failed. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.getAdminOverride(); - if(result) MessageBox.show("Admin override succedded!"); - else MessageBox.show("Admin override failed!"); - ``` - -###Get User Login Verification (getUserVerification) -Requests that the currently logged in username to re-login using -the single session context. During this process the user is not -actually logged-in again, instead just their username and password is -verified. Returns true if the user verification succeeded and false -if the cancel button was pressed or if override failed. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.getUserVerification(); - if(result) MessageBox.show("User verification succedded!"); - else MessageBox.show("User verification failed!"); - ``` - -###Require That Admin Is Logged-In (requireAdmin) -Checks that the logged-in user, under the single session context, -is an admin and if not, requests an admin override. -During this process the user is not actually logged-in again, -instead their username, password and user role is just verified. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.requireAdmin(); - if(result) MessageBox.show("Admin check passed!"); - else MessageBox.show("Admin check failed!"); - ``` - -###Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin) -Checks that the logged-in user, under the single session context, -is an admin, if true, prompts the admin to re-login and -if false, requests an admin override. -During this process the user is not actually logged-in again, -instead their username, password and user role is just verified. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.requireAdmin(); - if(result) MessageBox.show("Admin check passed!"); - else MessageBox.show("Admin check failed!"); - ``` - -##Multi-Session Methods - -###Is A Specific User Logged-In (isUserLoggedIn) -Checks if the specified user is currently logged in under the multi-user context. -To check if a specific user is logged-in, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isUserLoggedIn("admin", true); - if(result) MessageBox.show("Admin user is logged-in!"); - else MessageBox.show("Admin user is not logged-in!"); - ``` - -###Get Max Allowed Sessions (getMaxSessions) -Retrieves the maximum number of allowed sessions, -under the multi session context, before login is disabled. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final int result = authManager.getMaxSessions(); - MessageBox.show("The max number of allowed sessions is " + result + '!'); - ``` - -###Set Max Allowed Sessions (setMaxSessions) -Sets the maximum number of allowed sessions, -under the multi session context, before login is disabled. -To disable the limit set the value to a negative number. -To set the maximum number of allowed sessions, supply the following parameter: - -- value - The number of allowed sessions to set - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - //Set max sessions to 30. - authManager.setMaxSessions(30); - //Block all session creation by setting to 0 - authManager.setMaxSessions(0); - ``` - -!!! note - Setting this value to a negative number will disable the limit - because a negative amount of sessions can never be created. - When the SessionManager is initialized the value is initially set to -1. - -###Get Session Count (getSessionsCount) -Retrieves the current number of logged in sessions under the multi-user context. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final int result = authManager.getSessionsCount(); - MessageBox.show("The max number of logged-in sessions is " + result + '!'); - ``` - -###Get All Sessions (getSessions) -Retrieves the current logged in sessions as a HashMap under the multi session context. -The returned HashMap key is the session username and the value is the related Session object. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final Map sessions = authManager.getSessions(); - MessageBox.show("The max number of logged-in sessions is " + sessions.size() + '!'); - ``` - -###Get Specific User Session (getSession) -Retrieves the current session for the specified username, under the multi-user context. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final Session session = authManager.getSession("admin", true); - ``` - -###Login A Specific User (loginUser) -Logs in a user, under the multi-user context, with the specified username, -without checking for valid credentials. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! warning - This method does not validate credentials and should be used carefully. - With this method the user is immediately logged in as long as the user - exists and other checks pass (account unlocked, user role enabled and - password not expired). An example is listed below on how to implement this. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.loginUser("admin", true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -This example adds password checking to verify credentials before login: - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - if(authManager.checkPasswordMatches("admin", "1234")) { - final boolean result = authManager.loginUser("admin", true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - } else MessageBox.show("User login failed!"); - ``` - -###Logout Specific User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in or if the specified user does not exist. - -To logout a specific user, supply the following parameters: - -- Username - The username of the account to logout -- true - The true boolean is required to operate under the multi-user context - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.logoutUser("admin"); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -##Other Session Methods - -###Is New Session Allowed (isNewSessionAllowed) -Checks if creation of a new session for the specified username is allowed -under the specified context. This method checks to see if the specified user -is already logged-in and if the second parameter is true checks to see if the -max sessions limit has been reached. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true/false - The true for the multi-user context, false for the single-user context - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.isNewSessionAllowed("admin", true); - if(result) MessageBox.show("New User Session Is Allowed For Admin!"); - else MessageBox.show("New User Session Is Not Allowed For Admin!"); - ``` - -##User Role Methods - -###Create A New User Role (createRole) -To create a new user role use the createRole method supplying the following parameter: - -- Name - The name of the new user role - -!!! note - When using this method the UserRole object related to the new user role is returned. - If a user role already exists with the specified name the already existing UserRole - object is returned instead. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final var newRole = authManager.createRole("moderator"); - newRole.modify().add("edit", "create", "read"); - ``` - -###Add Existing User Role (addExistingRole) -You can manually create a new UserRole object and directly add that to the list. -To add an existing user role use the addExistingUserRole method supplying the following parameter: - -- UserRole - The UserRole object to add - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final UserRole role = new UserRole("moderator"); - role.modify().add("edit", "create", "read"); - authManager.addExistingRole(role); - ``` - -###Get List Of All Installed User Roles (getRoles) -Retrieves an unmodifiable list of all user roles. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final Map roles = authManager.getRoles(); - ``` - -###Get Specific User Role (getRole) -Retrieves the specified user role. - -To retrieve a user role use the getUserRole method supplying the following parameter: - -- Name - The name of the User Role to lookup - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final UserRole role = authManager.getRole("admin"); - ``` - -##Other Methods - -###Check If User Has Permission (hasPermission) -Checks if the current username has the specified permission. - -To check for the permission, supply the following parameter: - -- Permission - The name of the permission to check - -The permission manager has the following built in permissions: - -- admin -- edit -- create -- read - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.userHasPermission("admin"); - if(result) MessageBox.show("User Has Admin Permission!"); - else MessageBox.show("User Does Not Have Admin Permission!"); - ``` - -This can also be done with a list of permissions: - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final boolean result = authManager.userHasPermissions(new HashSet<>(Arrays.asList("admin", "edit"))); - if(result) MessageBox.show("User Has Specified Permissions!"); - else MessageBox.show("User Does Not Have Specified Permissions!"); - ``` - -###Get All Username Objects (getUsersList) -Retrieves a readonly immutable UserAccount object for each user -account and returns the list as a HashSet. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final HashSet users = authManager.getUsersList(); - ``` - -###Get List Of All Usernames (getUsernameList) -Retrieves a list of the user names in the database. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final HashSet users = authManager.getUsernameList(); - ``` \ No newline at end of file diff --git a/docs/AuthSystem/PermissionManager.md b/docs/AuthSystem/PermissionManager.md deleted file mode 100644 index a06e115..0000000 --- a/docs/AuthSystem/PermissionManager.md +++ /dev/null @@ -1,222 +0,0 @@ -#Permission Manager - -##Introduction -Package Name: [com.jgcomptech.tools.authz.PermissionManager](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authz/PermissionManager.html) - -The Permission Manager manages all role and user based permissions. -Permissions have a hierarchy and thus if a permission is assigned to a -user or role then all its child permissions are also assigned. - -The Permission Manager has the following built in permissions: - -- admin -- edit -- create -- read - -##Setup -The Permission Manager is a singleton class and on first use is initialized automatically. -The following code can be used to retrieve the instance: -``` java -final var manager = PermissionManager.getInstance(); -``` - -##Permission Methods - -###Add New Custom Permission (addCustomPermission) -Adds new permission with the specified name and parent name, disabled by default. - -To add a new custom permission, supply the following parameters: - -- Name - The name of the permission to lookup -- Parent Name - The name of the parent permission - -!!! note - If you want the new permission to not have a parent and want it to be root level - then set the Parent Name to null or an empty string. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.addCustomPermission("change_global_settings", "admin"); - ``` - -###Add And Enable New Custom Permission (addAndEnableCustomPermission) -Adds new permission with the specified name and parent name, enabled by default. - -To add a new custom permission, supply the following parameters: - -- Name - The name of the permission to lookup -- Parent Name - The name of the parent permission - -!!! note - If you want the new permission to not have a parent and want it to be root level - then set the Parent Name to null or an empty string. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.addAndEnableCustomPermission("change_global_settings", "admin"); - ``` - -###Load Permissions (loadPermissions) -Loading permissions enables or disables permissions in bulk. -There is 3 ways of doing this, enable all, disable all or apply a user role's permissions. - -####Enable All Permissions -Parameter must be true. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.loadPermissions(true); - ``` - -####Disable All Permissions -Parameter must be false. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.loadPermissions(false); - ``` - -####Enable/Disable Based On User Role -When run all permissions are disabled and then the permissions assigned to -the specified user role are enabled. - -Parameter must be the name of a user role. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.loadPermissions("admin"); - ``` - -###Remove Permission (removePermission) -Removes the specified permission. - -To remove a permission, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.removePermission("admin"); - ``` - -###Check If Permission Exists (doesPermissionExist) -Checks if the specified permission exists. - -To check if a permission exists, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final var result = permissionsManager.doesPermissionExist("admin"); - if(result) MessageBox.show("Permission Exists!"); - else MessageBox.show("Permission Not Found!"); - ``` - -###Enable Permission (enablePermission) -Enables the specified permission. - -To enable a permission, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.enablePermission("admin"); - ``` - -###Disable Permission (disablePermission) -Disables the specified permission. - -To disable a permission, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - permissionsManager.disablePermission("admin"); - ``` - -###Check If Permission Is Enabled (isPermissionEnabled) -Checks if the specified permission is enabled. - -To check if a permission is enabled, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final var result = permissionsManager.isPermissionEnabled("admin"); - if(result) MessageBox.show("Permission Is Enabled!"); - else MessageBox.show("Permission Is Disabled!"); - ``` - -###Check If Permission Is Disabled (isPermissionDisabled) -Checks if the specified permission is disabled. - -To check if a permission is disabled, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final var result = permissionsManager.isPermissionDisabled("admin"); - if(result) MessageBox.show("Permission Is Disabled!"); - else MessageBox.show("Permission Is Enabled!"); - ``` - -###Get List Of All Child Permissions (getPermissionChildren) -Retrieves an unmodifiable list of all the specified permission's child permissions. - -To retrieve a list of all child permissions, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final HashSet children = permissionsManager.getPermissionChildren("admin"); - ``` - -###Get List Of All Permissions (getPermissions) -Retrieves an unmodifiable list of all permissions. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final Map roles = permissionsManager.getPermissions(); - ``` - -###Get List Of All Permission Names (getPermissionNames) -Retrieves an unmodifiable list of names of all permissions. - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final Set names = permissionsManager.getPermissionNames(); - ``` - -###Get Specific Permission (getPermission) -Retrieves the specified permission. - -To retrieve a permission, supply the following parameter: - -- Name - The name of the permission to lookup - -!!! example - ``` java - final var permissionsManager = PermissionManager.getInstance(); - final UserRole role = permissionsManager.getPermission("admin"); - ``` diff --git a/docs/AuthSystem/SessionManager.md b/docs/AuthSystem/SessionManager.md deleted file mode 100644 index ad4248d..0000000 --- a/docs/AuthSystem/SessionManager.md +++ /dev/null @@ -1,481 +0,0 @@ -#Session Manager - -##Introduction -Package Name: [com.jgcomptech.tools.authc.SessionManager](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/SessionManager.html) - -!!! warning - This class is embedded in the [[../AuthManager | AuthManager]], - [[../Subject | Subject]], and [[../UserManager | UserManager]] classes - and is not meant to be accessed directly except in advanced use cases.

- To access the AuthManager's embedded SessionManager instance use the following code: - ``` java - final var authManager = AuthManager.getNewInstance(db); - final var sessionManager = authManager.getSessionManager(); - ``` - To access the UserManager's embedded SessionManager instance use the following code: - ``` java - final var userManager = new UserManager(db); - final var sessionManager = userManager.getSessionManager(); - ``` - -The Session Manager class contains all methods needed for managing -login sessions to allow users to login to your application. -This includes completing login via either using the UsernamePasswordToken -or requesting credentials from the user via a login dialog. - -##Setup -The Session Manager is not a singleton class so a new instance needs to be initialized. -Since the Session Manager is a low level class it also requires an instance -of the User Manager in addition to the database instance. -The following code can be used to create a new instance: - -!!! example - ``` java - try(final var db = new Database("./mydb.db", DatabaseType.H2)) { - final var userManager = new UserManager(db); - final var sessionManager = new SessionManager(userManager); - } - ``` - -An icon path and program name may also be optionally provided as parameters to change the -icon and program name for all login dialogs. - -##Session Explanation -A login Session is a temporary connection established by a user with a login, -until either the user or the application/service terminates the connection. - -The user must only provide credentials for authentication at the start -of a login session. The user is then authorized to use some or all of the services -offered by the application/service depending on the permissions assigned to the user. - -Within JUT there are two types of login sessions, single-user and multi-user. -All of the following documentation will be separated into two sections one -for each session type/context. - -###Single-User Session Context -Single-User sessions are meant for frontend login to an application. -These sessions can either be initiated via a UsernamePasswordToken or -via a login dialog. Only one user can be logged in at one time thus meaning -only one session can be open at a time. Some of the methods that are part -of the Session Manager can only be used under a Single-User context. - -###Multi-User Session Context -Multi-User sessions are meant for backend login to an application, usually -via a remote client software. These sessions can only be initiated -via a UsernamePasswordToken. Almost an unlimited amount of users can be logged in -at one time and is only dependant on system resources and can be limited -via the setMaxSessions method. Some of the methods that are part -of the Session Manager can only be used under a Multi-User context. - -##Single-Session Methods - -###Get Logged-In Username (getLoggedInUsername) -Returns the username of the currently logged in user under the single session context. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final String currentUsername = sessionManager.getLoggedInUsername(); - ``` - -###Is Any User Logged-In (isUserLoggedIn) -Checks if a user is currently logged in under the single-user context. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.isUserLoggedIn(); - if(result) MessageBox.show("A user is logged-in!"); - else MessageBox.show("No user is logged-in!"); - ``` - -###Is A Specific User Logged-In (isUserLoggedIn) -Checks if the specified user is currently logged in under the single-user context. -To check if a specific user is logged-in, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.isUserLoggedIn("admin"); - if(result) MessageBox.show("Admin user is logged-in!"); - else MessageBox.show("Admin user is not logged-in!"); - ``` - -###Get Currently Logged-In User Session (getSession) -Retrieves the current session for the specified username, under the single-user context. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final Session currentSession = sessionManager.getSession(); - ``` - -###Get Specific User Session (getSession) -Retrieves the current session for the specified username, under the single-user context. - -To retrieve a specific user session, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final Session session = sessionManager.getSession("admin"); - ``` - -###Show Login Dialog (showLoginWindow) -Shows the login dialog window to log a user into the single-user context. -The method returns true if a user was logged in successfully. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.showLoginWindow(true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -###Login A Specific User (loginUser) -Logs in a user, under the single-user context, with the specified username, -without checking for valid credentials. - -To retrieve a specific user session, supply the following parameter: - -- Username - The username of the account to lookup - -!!! warning - This method does not validate credentials and should not be used except - in advanced use cases. A example case could be to login a user during unit testing. - The method showLoginWindow should be used instead. With this method - the user is immediately logged in as long as the user exists and other - checks pass (account unlocked, user role enabled and password not expired). - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.loginUser("admin"); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -###Logout Current Logged-In User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in. - - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.logoutUser(); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -###Logout Specific User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in or if the specified user does not exist. - -To logout a specific user, supply the following parameter: - -- Username - The username of the account to logout - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.logoutUser("admin"); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -###Get Currently Logged-In User's UserRole (getLoggedInUserRole) -Retrieves the user role of the currently logged in user under -the single user context. If no user is currently logged-in then this -method will return null. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final UserRole result = sessionManager.getLoggedInUserRole(); - ``` - -###Check If An Admin User Is Logged-In (isAdminLoggedIn) -Checks if an admin user is currently logged in under the single user context. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.isAdminLoggedIn(); - if(result) MessageBox.show("An Admin user is logged-in!"); - else MessageBox.show("An Admin user is not logged-in!"); - ``` - -###Get Admin Login Override (getAdminOverride) -Requests an admin user to authenticate to override permissions by -showing the login dialog using the single session context. During this -process the admin user is not actually logged-in, instead just their -username, password and user role is verified. Returns true if -admin override succeeded and false if the cancel button was pressed -or if override failed. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.getAdminOverride(); - if(result) MessageBox.show("Admin override succedded!"); - else MessageBox.show("Admin override failed!"); - ``` - -###Get User Login Verification (getUserVerification) -Requests that the currently logged in username to re-login using -the single session context. During this process the user is not -actually logged-in again, instead just their username and password is -verified. Returns true if the user verification succeeded and false -if the cancel button was pressed or if override failed. -Fires either the sessionLoginSuccess or the sessionLoginFailure event -allowing the getUser method to be called by the assigned EventHandler. -If the user does not exist, getUser will return null. - -To show the login dialog, supply the following parameter: - -- true/false - If true, if during the login process an error occurs -the login dialog will show again listing the error text above the -username field. If false, if during the login process an error occurs -the entire method will return false. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.getUserVerification(); - if(result) MessageBox.show("User verification succedded!"); - else MessageBox.show("User verification failed!"); - ``` - -###Require That Admin Is Logged-In (requireAdmin) -Checks that the logged-in user, under the single session context, -is an admin and if not, requests an admin override. -During this process the user is not actually logged-in again, -instead their username, password and user role is just verified. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.requireAdmin(); - if(result) MessageBox.show("Admin check passed!"); - else MessageBox.show("Admin check failed!"); - ``` - -###Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin) -Checks that the logged-in user, under the single session context, -is an admin, if true, prompts the admin to re-login and -if false, requests an admin override. -During this process the user is not actually logged-in again, -instead their username, password and user role is just verified. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.requireAdmin(); - if(result) MessageBox.show("Admin check passed!"); - else MessageBox.show("Admin check failed!"); - ``` - -##Multi-Session Methods - -###Is A Specific User Logged-In (isUserLoggedIn) -Checks if the specified user is currently logged in under the multi-user context. -To check if a specific user is logged-in, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.isUserLoggedIn("admin", true); - if(result) MessageBox.show("Admin user is logged-in!"); - else MessageBox.show("Admin user is not logged-in!"); - ``` - -###Get Max Allowed Sessions (getMaxSessions) -Retrieves the maximum number of allowed sessions, -under the multi session context, before login is disabled. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final int result = sessionManager.getMaxSessions(); - MessageBox.show("The max number of allowed sessions is " + result + '!'); - ``` - -###Set Max Allowed Sessions (setMaxSessions) -Sets the maximum number of allowed sessions, -under the multi session context, before login is disabled. -To disable the limit set the value to a negative number. -To set the maximum number of allowed sessions, supply the following parameter: - -- value - The number of allowed sessions to set - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - //Set max sessions to 30. - sessionManager.setMaxSessions(30); - //Block all session creation by setting to 0 - sessionManager.setMaxSessions(0); - ``` - -!!! note - Setting this value to a negative number will disable the limit - because a negative amount of sessions can never be created. - When the SessionManager is initialized the value is initially set to -1. - -###Get Session Count (getSessionsCount) -Retrieves the current number of logged in sessions under the multi-user context. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final int result = sessionManager.getSessionsCount(); - MessageBox.show("The max number of logged-in sessions is " + result + '!'); - ``` - -###Get All Sessions (getSessions) -Retrieves the current logged in sessions as a HashMap under the multi session context. -The returned HashMap key is the session username and the value is the related Session object. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final Map sessions = sessionManager.getSessions(); - MessageBox.show("The max number of logged-in sessions is " + sessions.size() + '!'); - ``` - -###Get Specific User Session (getSession) -Retrieves the current session for the specified username, under the multi-user context. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final Session session = sessionManager.getSession("admin", true); - ``` - -###Login A Specific User (loginUser) -Logs in a user, under the multi-user context, with the specified username, -without checking for valid credentials. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true - The true boolean is required to operate under the multi-user context - -!!! warning - This method does not validate credentials and should be used carefully. - With this method the user is immediately logged in as long as the user - exists and other checks pass (account unlocked, user role enabled and - password not expired). An example is listed below on how to implement this. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.loginUser("admin", true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - ``` - -This example adds password checking to verify credentials before login: - -!!! example - ``` java - final var userManager = new UserManager(db); - final var sessionManager = new SessionManager(userManager); - if(userManager.checkPasswordMatches("admin", "1234")) { - final boolean result = sessionManager.loginUser("admin", true); - if(result) MessageBox.show("User was logged-in successfully!"); - else MessageBox.show("User login failed!"); - } else MessageBox.show("User login failed!"); - ``` - -###Logout Specific User (logout) -Logs out the specified user from the single session context -and clears any set permissions. This method will return false -if no user is currently logged-in or if the specified user does not exist. - -To logout a specific user, supply the following parameters: - -- Username - The username of the account to logout -- true - The true boolean is required to operate under the multi-user context - -!!! caution - If the user was deleted from the database while logged in, then - the getUser event method that is accessible from the - assigned event handler will return null. - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.logoutUser("admin"); - if(result) MessageBox.show("User was logged-out successfully!"); - else MessageBox.show("User logout failed!"); - ``` - -##Other Methods - -###Is New Session Allowed (isNewSessionAllowed) -Checks if creation of a new session for the specified username is allowed -under the specified context. This method checks to see if the specified user -is already logged-in and if the second parameter is true checks to see if the -max sessions limit has been reached. - -To retrieve a specific user session, supply the following parameters: - -- Username - The username of the account to lookup -- true/false - The true for the multi-user context, false for the single-user context - -!!! example - ``` java - final var sessionManager = new SessionManager(userManager); - final boolean result = sessionManager.isNewSessionAllowed("admin", true); - if(result) MessageBox.show("New User Session Is Allowed For Admin!"); - else MessageBox.show("New User Session Is Not Allowed For Admin!"); - ``` - -*[JUT]: Java Ultimate Tools \ No newline at end of file diff --git a/docs/AuthSystem/Subject.md b/docs/AuthSystem/Subject.md deleted file mode 100644 index 15112d5..0000000 --- a/docs/AuthSystem/Subject.md +++ /dev/null @@ -1,512 +0,0 @@ -#Subject - -##Introduction -Package Name: [com.jgcomptech.tools.authc.Subject](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/Subject.html) - -A Subject is just fancy security term that basically means a security-specific ‘view’ of an application user. -In JUT the Subject object handles the management of one specific user account. -The subject allows management of the user settings, role, permissions, and sessions. - -##Setup -A Subject object instance can be created by providing an instance of the Auth Manager or by -calling the getSubject method on the Auth Manager. Multiple subject instances can exist but multiple -instances are only useful if using the multi-user context. - -####Create New Instance Via AuthManager -``` java -final var manager = AuthManager.getInstance(); -final Subject subject = manager.getSubject(); -``` - -####Create New Instance Via New Subject Object -``` java -final var manager = AuthManager.getInstance(); -final Subject subject = new Subject(manager); -``` - -##General Subject Methods - -###Login User (login) -A new instance of a subject is considered anonymous until a user is logged-in. -A subject login requires a UsernamePasswordToken to pass in the user's credentials. -For security reasons, passwords supplied to the UsernamePasswordToken must be converted to a char array. - -There is 4 methods supplied for logging in a user: - -####Login Under Single-User Context -To login a user, supply the following parameter: - -- Token - The UsernamePasswordToken containing user credentials - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final var token = new UsernamePasswordToken("admin", "1234".toCharArray()); - final boolean result = subject.login(token); - if(result) MessageBox.show("Login Succeeded!"); - else MessageBox.show("Login Failed!"); - ``` - -####Login Under Either Context -To login a user, supply the following parameters: - -- Token - The UsernamePasswordToken containing user credentials -- True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context - -Multi-User Context Example: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final var token = new UsernamePasswordToken("admin", "1234".toCharArray()); - final boolean result = subject.login(token, true); - if(result) MessageBox.show("Login Succeeded!"); - else MessageBox.show("Login Failed!"); - ``` - -####Login Under Single-User Context With Previous Token -For previous token to be saved, setRememberMe needs to be set to true during token creation. -Also if no token is saved CredentialsException will be thrown. -To login a user, no parameters are needed. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final var token = new UsernamePasswordToken("admin", "1234".toCharArray()); - final boolean result = subject.login(); - if(result) MessageBox.show("Login Succeeded!"); - else MessageBox.show("Login Failed!"); - ``` - -####Login Under Either Context With Previous Token -For previous token to be saved, setRememberMe needs to be set to true during token creation. -Also if no token is saved CredentialsException will be thrown. -To login a user, supply the following parameters: - -- True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context - -Multi-User Context Example: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final var token = new UsernamePasswordToken("admin", "1234".toCharArray()); - final boolean result = subject.login(true); - if(result) MessageBox.show("Login Succeeded!"); - else MessageBox.show("Login Failed!"); - ``` - -###Logout User (logout) -When logging out a user, unless the setRememberMe is set to true during the token -creation, the subject username and token are cleared thus making the subject anonymous again. -This method will return false if the user is not already logged-in. - -There is 4 methods supplied for logging out a user: - -####Logout Under Single-User Context -To logout a user, no parameters are needed. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.logout(); - if(result) MessageBox.show("Logout Succeeded!"); - else MessageBox.show("Logout Failed!"); - ``` - -####Logout Under Either Context -To logout a user, supply the following parameter: - -- True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context - -Multi-User Context Example: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.login(true); - if(result) MessageBox.show("Logout Succeeded!"); - else MessageBox.show("Logout Failed!"); - ``` - -###Get Last Session Duration Time (getLastSessionDuration) -When a session is opened a timer starts recording the duration the session was open. -This duration can be retrieved after a session is closed with the subject. - -There is 3 methods supplied for returning this value: - -####Return Duration Object - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final Duration duration = subject.getLastSessionDuration(); - ``` - -####Return Text String With Milliseconds - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final String duration = subject.getLastSessionDurationStringFull(); - ``` - -####Return Text String Without Milliseconds - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final String duration = subject.getLastSessionDurationString(); - ``` - -###Check If Subject Is Anonymous (isAnonymous) -Checks if the subject is anonymous. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isAnonymous(); - if(result) MessageBox.show("Subject Is Anonymous!"); - else MessageBox.show("Subject Is Not Anonymous!"); - ``` - -###Check If Subject Is Authenticated Under Single-User Context (isAuthenticated) -Checks if the subject is anonymous. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isAuthenticated(); - if(result) MessageBox.show("Subject Is Anonymous!"); - else MessageBox.show("Subject Is Not Anonymous!"); - ``` - -###Check If Subject Is Authenticated Under Either Context (isAuthenticated) -Checks if the subject is anonymous. - -To check status, supply the following parameter: - -- True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context - -Multi-User Context Example: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isAuthenticated(true); - if(result) MessageBox.show("Subject Is Anonymous!"); - else MessageBox.show("Subject Is Not Anonymous!"); - ``` - -###Get Current Logged-In Session Under Single-User Context (getSession) -Retrieves the current logged in session or returns null if no session is open. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final Session session = subject.getSession(); - ``` - -###Get Current Logged-In Session Under Either Context (getSession) -Retrieves the current logged in session or returns null if no session is open. - -To retrieve the current session, supply the following parameter: - -- True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context - -Multi-User Context Example: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final Session session = subject.getSession(true); - ``` - -###Check If Username And Token Are Remembered (isRemembered) -Checks to see if the username and token are set to be saved after logout. -For credentials to be saved, setRememberMe needs to be set to true during token creation. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isRemembered(); - if(result) MessageBox.show("Subject Credentials Is Remembered!"); - else MessageBox.show("Subject Credentials Is Not Remembered!"); - ``` - -##User Management Methods - -###Get Current Username (getUsername) -Retrieves the current username. Returns null if the subject is anonymous. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.getUsername(); - MessageBox.show("The Current Username Is " + result + '!'); - ``` - -###Set New Password (setPassword) -Sets a new password for the current user. - -To set a new password, supply the following parameter: - -- Password - The new password to set - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - subject.setPassword("pass"); - ``` - -###Get Current User Role (getUserRole) -Retrieves the UserRole object assigned to the current user. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final UserRole role = subject.getUserRole(); - ``` - -###Set User Role (setUserRole) -Sets the user role assigned to the specified user. -To set the user role, supply the following parameter: - -- User Role - The user role of the new account - -The user role can be a text string or one of the -items from the UserRoleManager.SystemUserRoles enum. - -The UserRoleManager.SystemUserRoles list contains: - -- ADMIN -- AUTHOR -- EDITOR -- BASIC -- NONE - -!!! note - The NONE user role can never have permissions assigned to it. - Using the NONE user role is a quick way to remove all permissions from a user. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - subject.setUserRole(UserRoleManager.SystemUserRoles.ADMIN); - ``` - -###Check If User Has Permission (hasPermission) -Checks if the current username has the specified permission. - -To check for the permission, supply the following parameter: - -- Permission - The name of the permission to check - -The permission manager has the following built in permissions: - -- admin -- edit -- create -- read - -####Single Permission - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.hasPermission("admin"); - if(result) MessageBox.show("User Has Admin Permission!"); - else MessageBox.show("User Does Not Have Admin Permission!"); - ``` - -####HashSet Of Permissions - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final HashSet list = new HashSet<>(Arrays.asList("admin", "edit")); - final boolean result = subject.hasPermissions(list); - if(result) MessageBox.show("User Has Specified Permissions!"); - else MessageBox.show("User Does Not Have Specified Permissions!"); - ``` - -####Comma Separated list Of Permissions: - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.hasPermissions("admin", "edit"); - if(result) MessageBox.show("User Has Specified Permissions!"); - else MessageBox.show("User Does Not Have Specified Permissions!"); - ``` - -###Get Account Creation Date (getUserCreationDate) -Returns the date and time the user was initially created. - -There is two methods to retrieving the user creation date. -The date can either be returned as a LocalDateTime object or as a formatted string. - -####LocalDateTime Object - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - final LocalDateTime result = subject.getUserCreationDate(); - MessageBox.show("Account Was Created On " + result.format(formatter)); - ``` - -####Formatted String Object -To retrieve the user creation date, supply the following parameter: - -- Format - The string that represents the format to return the date - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final String result = subject.getUserCreationDate("yyyy-MM-dd HH:mm"); - MessageBox.show("Account Was Created On " + result); - ``` - -###Check If User Is Locked (isUserLocked) -A locked user account prevents login and prevents any new sessions -to be opened for the user. Locking an user account may be needed for numerous reasons. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isUserLocked(); - if(result) MessageBox.show("Admin Account Is Locked!"); - else MessageBox.show("Admin Account Is Unlocked!"); - ``` - -###Lock/Unlock A User (lockUser and unlockUser) -A locked user account prevents login and prevents any new sessions -to be opened for the user. Locking an user account may be needed for numerous reasons. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - //Lock The Account - subject.lockUser(); - //Unlock The Account - subject.unlockUser(); - ``` - -###Check If Password Is Expired (isPasswordExpired) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isPasswordExpired(); - if(result) MessageBox.show("Admin Account Password Is Expired!"); - else MessageBox.show("Admin Account Password Is Not Expired!"); - ``` - -###Check If Password Has Expiration Date (isPasswordSetToExpire) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.isPasswordSetToExpire(); - if(result) MessageBox.show("Admin Account Password Has An Expiration Date!"); - else MessageBox.show("Admin Account Password Does Not Have An Expiration Date!"); - ``` - -###Get Password Expiration Date (getPasswordExpirationDate) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -There is two methods to retrieving the password expiration date. -The date can either be returned as a LocalDateTime object or as a formatted string. - -!!! note - If the expiration date has been disabled or was never enabled this method will - still return an expiration date. For logistical database reasons a date still - has to be set. So the date will be set to 1000 years after the user account - was created or 1000 years after the date when the password expiration date - was last disabled. This number can be updated if any bugs occur but it seems - like 1000 years is far enough in the future to not cause any problems. - -####LocalDateTime Object - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - final LocalDateTime result = subject.getPasswordExpirationDate(); - MessageBox.show("Admin Account Password Expires At " + result.format(formatter)); - ``` - -####Formatted String Object -To retrieve the password expiration date, supply the following parameter: - -- Format - The string that represents the format to return the date - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final String result = subject.getPasswordExpirationDate("yyyy-MM-dd HH:mm"); - MessageBox.show("Admin Account Password Expires At " + result); - ``` - -###Set Password Expiration Date (setPasswordExpirationDate) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To set a password expiration date, supply the following parameter: - -- Expiration Date - A LocalDateTime object representing the expiration date - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - //Sets the date to now - subject.setPasswordExpirationDate(LocalDateTime.now()); - //Sets the date to 30 days from today - subject.setPasswordExpirationDate(LocalDateTime.now().plusDays(30)); - //First Method To Set the date to January 1st, 2019 at 8am - subject.setPasswordExpirationDate(LocalDateTime.of(2019, 1, 1, 8, 0)); - //Second Method To Set the date to January 1st of 2019 at 8am - subject.setPasswordExpirationDate(LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0)); - //Third Method To Set the date to January 1st of 2019 at 8am - final String str = "2019-01-01 08:00"; - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - subject.setPasswordExpirationDate(LocalDateTime.parse(str, formatter)); - ``` - -###Disable Password Expiration (disablePasswordExpiration) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - authManager.disablePasswordExpiration(); - ``` - -###Check If Password Matches (checkPasswordMatches) -This method allows you to check if the supplied password matches -the user's stored password in the database. -To verify the password, supply the following parameter: - -- Password - The password to verify - -!!! example - ``` java - final var subject = AuthManager.getInstance().getSubject(); - final boolean result = subject.checkPasswordMatches("1234"); - if(result) MessageBox.show("Password Matches!"); - else MessageBox.show("Password Does Not Match!"); - ``` - -*[JUT]: Java Ultimate Tools \ No newline at end of file diff --git a/docs/AuthSystem/UserManager.md b/docs/AuthSystem/UserManager.md deleted file mode 100644 index 40b1c06..0000000 --- a/docs/AuthSystem/UserManager.md +++ /dev/null @@ -1,258 +0,0 @@ -#User Manager - -##Introduction -Package Name: [com.jgcomptech.tools.authc.UserManager](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/UserManager.html) - -!!! warning - This class is embedded in the [[../AuthManager | AuthManager]] - and [[../Subject | Subject]] classes and is not meant to be - accessed directly except in advanced use cases.

- To access the AuthManager's embedded UserManager instance use the following code: - ``` java - final var authManager = AuthManager.getNewInstance(db); - final var userManager = authManager.getUserManager(); - ``` - -The User Manager manages all user accounts in the database. -This is where all the native SQL code is automatically -generated using the Database Builder classes. - -##Setup -The User Manager is not a singleton class so a new instance needs to be initialized. -When a new instance is created a "users" table is automatically created in the specified database. -The following code can be used to create a new instance: - -!!! example - ``` java - try(final var db = new Database("./mydb.db", DatabaseType.H2)) { - final var userManager = new UserManager(db); - } - ``` - -An icon path and program name may also be optionally provided as parameters to change the -icon and program name for all login dialogs. - -##User Account Methods - -###Create A New User (createUser) -To create a new user use the createUser method supplying the following parameters: - -- Username - The username of the new account -- Password - The password of the new account -- User Role - The user role of the new account - -The user role can be a text string or one of the -items from the UserRoleManager.SystemUserRoles enum. - -The UserRoleManager.SystemUserRoles list contains: - -- ADMIN -- AUTHOR -- EDITOR -- BASIC -- NONE - -!!! note - The NONE user role can never have permissions assigned to it. - Using the NONE user role is a quick way to remove all permissions from a user. - -!!! example - ``` java - final var userManager = new UserManager(db); - userManager.createUser("admin", "1234", UserRoleManager.SystemUserRoles.ADMIN); - userManager.createUser("editor", "1234", UserRoleManager.SystemUserRoles.EDITOR); - ``` - -###Delete An Existing User (deleteUser) -To delete an existing user use the deleteUser method supplying the following parameter: - -- Username - The username of the account to delete - -!!! example - ``` java - final var userManager = new UserManager(db); - userManager.deleteUser("admin"); - ``` - -###Get Username Object (getUser) -Retrieves a readonly immutable UserAccount object. -To retrieve the object, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var userManager = new UserManager(db); - final UserAccount user = userManager.getUser("admin"); - ``` - -###Check If User Exists (userExists) -Checks to see if the specified user account exists. -To check a user account, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var userManager = new UserManager(db); - final boolean result = userManager.userExists("admin"); - if(result) MessageBox.show("Admin User Exists!"); - else MessageBox.show("Admin User Does Not Exist!"); - ``` - -###Get User Role (getUserRole) -Retrieves the UserRole object assigned to the specified user. -To retrieve the object, supply the following parameter: - -- Username - The username of the account to lookup - -!!! example - ``` java - final var userManager = new UserManager(db); - final UserRole userRole = userManager.getUserRole("admin"); - ``` - -###Set User Role (getUserRole) -Sets the user role assigned to the specified user. -To set the user role, supply the following parameters: - -- Username - The username of the account to lookup -- User Role - The user role of the new account - -The user role can be a text string or one of the -items from the UserRoleManager.SystemUserRoles enum. - -The UserRoleManager.SystemUserRoles list contains: - -- ADMIN -- AUTHOR -- EDITOR -- BASIC -- NONE - -!!! note - The NONE user role can never have permissions assigned to it. - Using the NONE user role is a quick way to remove all permissions from a user. - -!!! example - ``` java - final var userManager = new UserManager(db); - userManager.setUserRole("admin", UserRoleManager.SystemUserRoles.ADMIN); - ``` - -###Set User Password (setPassword) -Sets the password assigned to the specified user. -To set the new password, supply the following parameters: - -- Username - The username of the account to lookup -- Password - The new password to set - -!!! note - If you want to prevent a user from setting an empty password - or to check for password complexity requirements those checks need - to be implemented separately. This method allows empty passwords. - Even if the password is empty, the empty password is still encrypted - with a random secure salt just like any supplied password would be. - -!!! example - ``` java - final var userManager = new UserManager(db); - userManager.setPassword("admin", "newPass"); - ``` - -###Check If Password Matches (checkPasswordMatches) -This method allows you to check if the supplied password matches -the user's stored password in the database. -To verify the password, supply the following parameters: - -- Username - The username of the account to lookup -- Password - The password to verify - -!!! example - ``` java - final var userManager = new UserManager(db); - final boolean result = userManager.checkPasswordMatches("admin", "1234"); - if(result) MessageBox.show("Password Matches!"); - else MessageBox.show("Password Does Not Match!"); - ``` - -###Lock/Unlock A User Account(setLockStatus) -A locked user account prevents login and prevents any new sessions -to be opened for the user. Locking an user account may be needed for numerous reasons. - -To lock and unlock an account, supply the following parameters: - -- Username - The username of the account to lock/unlock -- true/false - The value to set, true to lock, false to unlock - -!!! example - ``` java - final var userManager = new UserManager(db); - //Lock The Account - userManager.setLockStatus("admin", true); - //Unlock The Account - userManager.setLockStatus("admin", false); - ``` - -###Set User Password Expiration Date (setPasswordExpirationDate) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To set a password expiration date, supply the following parameters: - -- Username - The username of the account to update -- Expiration Date - A LocalDateTime object representing the expiration date - -!!! example - ``` java - final var userManager = new UserManager(db); - //Sets the date to now - userManager.setPasswordExpirationDate("admin", LocalDateTime.now()); - //Sets the date to 30 days from today - userManager.setPasswordExpirationDate("admin", LocalDateTime.now().plusDays(30)); - //First Method To Set the date to January 1st, 2019 at 8am - userManager.setPasswordExpirationDate("admin", LocalDateTime.of(2019, 1, 1, 8, 0)); - //Second Method To Set the date to January 1st of 2019 at 8am - userManager.setPasswordExpirationDate("admin", LocalDateTime.of(2018, Month.JANUARY, 1, 8, 0)); - //Third Method To Set the date to January 1st of 2019 at 8am - final String str = "2019-01-01 08:00"; - final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - userManager.setPasswordExpirationDate("admin", LocalDateTime.parse(str, formatter)); - ``` - -###Disable Password Expiration (disablePasswordExpiration) -Setting a password to expire after a specified date allows the prevention of login and -new session creation if the password is expired. Setting a password to expire could -be used to force regular password changes or allow for temporary accounts to be made. - -To disable password expiration for a user, supply the following parameter: - -- Username - The username of the account to update - -!!! example - ``` java - final var userManager = new UserManager(db); - userManager.disablePasswordExpiration("admin"); - ``` - -##Other Methods - -###Get All Username Objects (getUsersList) -The getUsersList method retrieves a readonly immutable UserAccount object for each user -account and returns the list as a HashSet. - -!!! example - ``` java - final var userManager = new UserManager(db); - final HashMap users = userManager.getUsersList(); - ``` - -###Get List Of All Usernames (getUsernameList) -Retrieves a list of the user names in the database. - -!!! example - ``` java - final var authManager = AuthManager.getInstance(); - final HashSet users = authManager.getUsernameList(); - ``` \ No newline at end of file diff --git a/docs/AuthSystem/UserRoleManager.md b/docs/AuthSystem/UserRoleManager.md deleted file mode 100644 index 908af25..0000000 --- a/docs/AuthSystem/UserRoleManager.md +++ /dev/null @@ -1,99 +0,0 @@ -#User Role Manager - -##Introduction -Package Name: [com.jgcomptech.tools.authc.UserRoleManager](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/UserRoleManager.html) - -The User Role Manager class contains all methods needed for managing -User Roles that can be assigned to a User Account. - -##User Role Explanation -Role-based Access Control (RBAC) is a common approach to restricting system access to authorized users. -A user role defines permissions for a user to perform a group of tasks. -Although every role has a predefined set of permissions, -new permissions can be added and removed from each role. -New custom roles can also be created as a new role or a copy of an existing role. - -The base permissions are (Descriptions are based on a CMS implementation and are just examples): - -* Admin - Allows changes to system settings. -* Edit - Allows editing of all content even other user's content. -* Create - Allows creation of new content and editing of own content. -* Read - Allows viewing of all content. - -The base user roles are (Descriptions are based on a CMS implementation and are just examples): - -* Admin(Admin, Edit, Create, Read) - Has all permissions. -* Editor(Edit, Create, Read) - Can create and edit all content but not change system settings. -* Author(Create, Read) - Can create new content but not edit other users content. -* Basic(Read) - Can read all content but not create or edit content. -* None() - Has no permissions. - -!!! note - Currently JUT is designed to allow a user to be assigned only one user role. - This will be changing in future releases to allow for assignment of multiple roles. - -##Setup -The User Role Manager is a singleton class and on first use is initialized automatically. -The following code can be used to retrieve the instance: -``` java -final var manager = UserRoleManager.getInstance(); -``` - -##User Role Manager Methods - -###Create A New User Role (createUserRole) -To create a new user role use the createUserRole method supplying the following parameter: - -- Name - The name of the new user role - -!!! note - When using this method the UserRole object related to the new user role is returned. - If a user role already exists with the specified name the already existing UserRole - object is returned instead. - -!!! example - ``` java - final var userRoleManager = UserRoleManager.getInstance(); - final var newRole = userRoleManager.createUserRole("moderator"); - newRole.modify().add("edit", "create", "read"); - ``` - -###Add Existing User Role (addExistingUserRole) -You can manually create a new UserRole object and directly add that to the list. -To add an existing user role use the addExistingUserRole method supplying the following parameter: - -- UserRole - The UserRole object to add - -!!! example - ``` java - final var userRoleManager = UserRoleManager.getInstance(); - final UserRole role = new UserRole("moderator"); - role.modify().add("edit", "create", "read"); - userRoleManager.addExistingUserRole(role); - ``` - -###Get List Of All Installed User Roles (getUserRoles) -Retrieves an unmodifiable list of all user roles. - -!!! example - ``` java - final var userRoleManager = UserRoleManager.getInstance(); - final Map roles = userRoleManager.getUserRoles(); - ``` - -###Get Specific User Role (getUserRole) -Retrieves the specified user role. - -To retrieve a user role use the getUserRole method supplying the following parameter: - -- Name - The name of the User Role to lookup - -!!! example - ``` java - final var userRoleManager = UserRoleManager.getInstance(); - final UserRole role = userRoleManager.getUserRole("admin"); - ``` - -*[JUT]: Java Ultimate Tools -*[CMS]: Content Management System -*[RBAC]: Role-based Access Control \ No newline at end of file diff --git a/docs/AuthSystem/index.md b/docs/AuthSystem/index.md deleted file mode 100644 index 2b3e2c7..0000000 --- a/docs/AuthSystem/index.md +++ /dev/null @@ -1,26 +0,0 @@ -#Auth System Documentation - -##Introduction -Package Names: - -* [com.jgcomptech.tools.authc](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authc/package-summary.html) -* [com.jgcomptech.tools.authz](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/authz/package-summary.html) - -The JUT Auth System is a set of classes that allow for authentication and authorization. -This system uses the Database class to connect to a database to store all account info. - -##Features -- [[AuthManager | Auth Manager]] - * Contains all methods needed for controlling the Auth System. -- [[PermissionManager | Permission Manager]] - * Manages permissions to be used to enable or disable parts of your application. -- [[Subject]] - * Manages all tasks related to the currently logged in user account. -- [[SessionManager | Session Manager]] - * Manages all login sessions to allow users to login to your application. -- [[UserManager | User Manager]] - * Manages all user accounts in the database. -- [[UserRoleManager | User Role Manager]] - * Manages all user account roles. - -*[JUT]: Java Ultimate Tools \ No newline at end of file diff --git a/docs/DatabaseTools/index.md b/docs/DatabaseTools/index.md deleted file mode 100644 index e349e5b..0000000 --- a/docs/DatabaseTools/index.md +++ /dev/null @@ -1,44 +0,0 @@ -#Database Tools Documentation - -##Introduction -Package Names: - -* [com.jgcomptech.tools.databasetools.jdbc](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/databasetools/jdbc/package-summary.html) -* [com.jgcomptech.tools.databasetools.jdbc.builders](https://static.javadoc.io/com.jgcomptech.tools/java-ultimate-tools/1.5.0/com/jgcomptech/tools/databasetools/jdbc/builders/package-summary.html) - -Contains tools to communicate with a database using JDBC. -The goal behind this class is to allow connection with the -database and creation of auto-generated SQL statements so manually -creating native SQL code is not needed. This includes initial table creation -which is not normally included in most database frameworks. - -##Supported Databases -- [H2](http://www.h2database.com/) -- [HyperSQL](http://hsqldb.org/) -- [SQLite](https://www.sqlite.org/) - -##SQL Statement Builders -- ColumnBuilder - * Used for creating a database table column. -- DeleteBuilder - * Used for creating a DELETE sql statement to delete a row from a table. -- IndexBuilder - * Used for creating a CREATE sql statement to create a new table index. -- InsertBuilder - * Used for creating an INSERT sql statement to add a row to a table. -- QueryBuilder - * Used for creating a SELECT sql statement to query the database. -- TableBuilder - * Used for creating an CREATE sql statement to create a new table. -- UpdateBuilder - * Used for creating an UPDATE sql statement to update a row in a table. -- WhereBuilder - * Used for creating a WHERE sql statement to set a constraint on another statement. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[JDBC]: Java Database Connectivity -*[SQL]: Structured Query Language -*[sql]: Structured Query Language -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/Dialogs/index.md b/docs/Dialogs/index.md deleted file mode 100644 index 8b31d98..0000000 --- a/docs/Dialogs/index.md +++ /dev/null @@ -1,28 +0,0 @@ -#Dialogs Documentation - -##Introduction -Package Name: com.jgcomptech.tools.dialogs - -Contains JavaFX dialogs to use in your application. -Platform.runLater is not needed to be called since all dialogs use a -wrapper class that automatically calls runLater if it is needed. - -##Features -- LoginDialog - * Creates a Login Dialog for use to authenticate passwords. - Allows for display of error message in case of login failure. -- MessageBox - * Displays message box with specified options. -- FXMLDialogWrapper - * Allows custom creation of a dialog using a specified JavaFX - fxml file. - -!!! note - The MessageBox.Show() method is used throughout this documentation to show messages - for demo example purposes. These code statements are not required for the example - to function. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/EventManagement/index.md b/docs/EventManagement/index.md deleted file mode 100644 index 86dc2df..0000000 --- a/docs/EventManagement/index.md +++ /dev/null @@ -1,22 +0,0 @@ -#Event Management Documentation - -##Introduction -Package Name: com.jgcomptech.tools.events - -Contains classes to manage custom events. -All events are managed through the Event Manager class. - -!!! note - The JavaFX EventHandler class is not the same as the included - EventHandler class and is not compatible with the JUT event system. - -##Features -- Registration and firing events -- Creation of event handlers to handle fired events -- The ability to pass arguments to event handlers - -!!! info - This page is a WIP and more documentation is coming soon. - -*[JUT]: Java Ultimate Tools -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/HWInfo/index.md b/docs/HWInfo/index.md deleted file mode 100644 index cb1d2cc..0000000 --- a/docs/HWInfo/index.md +++ /dev/null @@ -1,25 +0,0 @@ -#HWInfo Documentation - -##Introduction -Package Name: com.jgcomptech.tools.HWInfo - -The HWInfo class returns information about the currently installed hardware. - -##Features -- BIOS - * Returns information about the system BIOS. -- Network - * Returns information about the current network. -- OEM - * Returns information about the system manufacturer. -- Processor - * Returns information about the system processor. -- RAM - * Returns information about the system RAM. -- Storage - * Returns information about the system storage. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/OSInfo/index.md b/docs/OSInfo/index.md deleted file mode 100644 index 6fcd3a9..0000000 --- a/docs/OSInfo/index.md +++ /dev/null @@ -1,28 +0,0 @@ -#OSInfo Documentation - -##Introduction -Package Name: com.jgcomptech.tools.OSInfo - -The OSInfo class returns information about the current operating system. - -##Features -- Architecture - * Determines if the current application is 32 or 64-bit. -- Name - * Returns the name of the operating system running on this Computer. - * ComputerNameActive and ComputerNamePending returns the computer network name. -- Windows - * Returns information about the current Windows installation. -- CheckIf - * Returns boolean value checks. - * is32BitOS - Identifies if OS is a 32 Bit OS. - * is64BitOS - Identifies if OS is a 64 Bit OS. - * isLinux - Identifies if OS is a distro of Linux. - * isMac - Identifies if OS is MacOSX. - * isSolaris - Identifies if OS is Solaris. - * isWindows - Identifies if OS is Windows. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/SecurityTools/index.md b/docs/SecurityTools/index.md deleted file mode 100644 index 48a08c9..0000000 --- a/docs/SecurityTools/index.md +++ /dev/null @@ -1,21 +0,0 @@ -#Security Tools Documentation - -##Introduction -Package Name: com.jgcomptech.tools.SecurityTools - -Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384, SHA512 and BCrypt. Also includes encryption/decryption with RSA. - -##Features -- FileHashes - * Contains methods dealing with hashing files. -- PasswordHashes - * Contains methods dealing with hashing passwords. -- RSAFiles - * Contains methods dealing with RSA key files. -- RSAHashes - * Contains methods dealing with RSA encryption and decryption. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/Utils/index.md b/docs/Utils/index.md deleted file mode 100644 index a23a98f..0000000 --- a/docs/Utils/index.md +++ /dev/null @@ -1,20 +0,0 @@ -#Utils Documentation - -##Introduction -JUT contains many utils classes to allow for extension and simplification of many aspects of Java. - -##Features -- CollectionUtils - * Contains methods for dealing with collections. -- ExceptionUtils - * Contains methods for dealing with exceptions. -- NumberUtils - * Contains methods dealing with numbers and math. -- StringUtils - * Contains methods dealing with strings. - -!!! info - This page is a WIP and more documentation is coming soon. - -*[JUT]: Java Ultimate Tools -*[WIP]: Work In Progress \ No newline at end of file diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index 642943b..0000000 --- a/docs/changelog.md +++ /dev/null @@ -1,90 +0,0 @@ -#JUT Version Changelog - -###Version 1.5.1 changes (10/13/2018): -* Added new userHasPermissions method overload to AuthManager -* Added new userHasPermissions method overload to Subject -* Fixed bugs and missing methods in Subject -* Fixed deprecated methods in NativeMethods -* Fixed other small bugs - -###Version 1.5.0 changes (10/07/2018): -* **Updated JDK to Java 10** -* Login Dialogs now don't require the use of Platform.runLater() -* Message Boxes now don't require the use of Platform.runLater() -* Message Box Default button is now in the right order. -* Massive changes to authentication and permissions system -* Renamed jbdc to jdbc -* Removed all deprecated methods from 1.4.0 -* Updated javadoc -* Replaced some loops with streams -* Added trim to all string isEmpty checks -* Added UTF_8 protection -* Added ExceptionUtils class for use in junit tests -* All password hashing now uses BCrypt replacing SHA-512 -* Other minor fixes - -###Version 1.4.2 changes (1/23/2018): -* Fixed fatal error with isUserLoggedIn method - -###Version 1.4.1 changes (1/22/2018): -* Added UserManagerException -* Added PasswordHashingFailedException -* Added isAdminLoggedIn method -* Added getAdminOverride and getUserVerification methods -* Added requireAdmin and requireAndVerifyAdmin methods -* Added isLoggedIn method -* Fixed rare bugs with loginUser and logoutUser methods -* Fixed exception that was thrown if user did not exist on login dialog -* Limited number of SQLException and GeneralSecurityException checked exceptions -* Changed Session Manager dialogs to use instance vars for parameters(old methods deprecated) - -###Version 1.4.0 changes (1/19/2018): -* Added User Management Classes (UserManager, UserAccount, UserRoleManager and UserRole) -* Added Permission Management Classes (Permission Manager and Permission) -* Added Session Management Classes (Session Manager, MultiSessionManager and Session) -* Added Database Builder Classes For Building SQL Code -* Added HyperSQL Database Support -* Added Custom Event/Event Handler System -* Added New Utilities Classes (StringUtils, NumberUtils and CollectionUtils) - -NOTE: Some API changes have occurred: -* Moved Database.Users class to UsersManager class -* Made Database class constructor auto-connect to database -* Deprecated DatabaseConnectionInfo fields and replaced with getters/setters -* Made all utility classes final and have private constructors -* Made all method parameters and most existing classes final -* Added period to first line of all javadoc comments -* Updated SecurityTools.getFileHash to use Apache Commons Codec Library (Java 9 Fix) -* Renamed ReInitalizeHW to ReInitializeHW -* Renamed ReInitalizeOS to ReInitializeOS - -###Version 1.3.1 changes (4/5/2017): -* Added FXML Dialog Wrapper -* JavaDocs documentation is improved -* Pom file is improved and updated -* Now hosted on Maven Central - -###Version 1.3.0 changes (3/31/2017): -* Added MessageBox and Login dialog objects -* Added Static Class Instantiation Protection -* Added Database Tools classes (Includes SQLite and H2 databases) -* All dependencies are now included in jar file -* JavaDocs documentation is improved - -###Version 1.2.0 changes (02/22/2017): -* Fixed ComputerNameActive and ComputerNamePending not returning accurate value -* Added ComputerInfo Class -* Fixed a naming bug since version 1.1 that caused an infinite loop -* Fixed the java.IO.File.delete calls to now use the java.nio.file.Files.delete -* Created a demo if the library is run directly -* Fixed error with RSA generate key pair, it didn't check if save to files was true -* Fixed error with ConvertBytes function not returning accurate value - -###Version 1.1.0 changes (02/18/2017): -* Created OSInfo, HWInfo, SecurityTools and WebTools classes instead of packages to improve importing. -* Renamed StringExpanded2 to StringExpandedFromRegistry. -* Moved tools.osinfo.Enums to just tools.Enums. -* Finalized JavaDocs. Everything is documented correctly now. - -###Version 1.0.0 changes (02/13/2017): -* Initial Release \ No newline at end of file diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 59124c2..0000000 --- a/docs/index.md +++ /dev/null @@ -1,86 +0,0 @@ - - -# Welcome to Java Ultimate Tools Docs -[![Build Status](https://travis-ci.org/JGCompTech/JavaUltimateTools.svg?branch=master)](https://travis-ci.org/JGCompTech/JavaUltimateTools) [![CircleCI](https://circleci.com/gh/JGCompTech/JavaUltimateTools.svg?style=svg)](https://circleci.com/gh/JGCompTech/JavaUltimateTools) [![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/JGCompTech/JavaUltimateTools.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/JGCompTech/JavaUltimateTools/context:java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.jgcomptech.tools/java-ultimate-tools/badge.svg?style=flat-square)](https://maven-badges.herokuapp.com/maven-central/com.jgcomptech.tools/java-ultimate-tools/) [![Javadocs](http://www.javadoc.io/badge/com.jgcomptech.tools/java-ultimate-tools.svg?style=flat-square)](http://www.javadoc.io/doc/com.jgcomptech.tools/java-ultimate-tools) - -## What is Java Ultimate Tools? - -Java Ultimate Tools, or JUT for short, is a large powerful and flexible open-source repository for use in any Java program. - -## Java Ultimate Tools Features -- OSInfo - Contains many classes that return information about the current Windows installation. This includes Architecture, Edition, Name, Product Key, Service Pack, User Info and Version. -- HWInfo - Contains many classes that return information about the current computer hardware. This includes BIOS, Network, OEM, Processor, RAM and Storage. -- SecurityTools - Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384 and SHA512. Also includes encryption/decryption with RSA. -- CommandInfo - Allows you to run any console command and will return the result to a string to use within your program. You can also run the command elevated and it will open in a new cmd window and show the results. Note: If elevated, result cannot be returned as a string. -- MessageBox and Login dialogs - Dialogs to use in JavaFX applications -- FXML Dialog Wrapper - Class to wrap a FXML dialog object, reducing the amount of required code -- DatabaseTools - Allows communication with H2, HyperSQL and SQLite databases -- SQL Statement Builders - Allows for using methods instead of native SQL code to generate Prepared Statements -- User Account Management Tools - Includes User Roles, Sessions and Permissions -- Custom Event Manager System - Creates Events similar to the JavaFX Events but not using any JavaFX classes -- Utility Classes - Includes classes for managing collections, numbers and strings -- And Much More! - -**NOTE: This Project Has Now Been Updated To Use Java 10!!!** - -## Development -Want to contribute? Great! -Any help with development is greatly appreciated. If you want to add something or fix any issues please submit a pull request and if it is helpful it may be merged. Please check out our [Code of Conduct for Contributors](https://github.com/JGCompTech/JavaUltimateTools/blob/master/code-of-conduct.md). - -## Documentation -The documentation for JUT is currently a work in progress and new changes will be occurring soon. - -## JavaDoc -The JavaDoc info is hosted at the following 2 locations: -
[github.io(Current GitHub Branch)](https://jgcomptech.github.io/JavaUltimateTools/) - stored in the doc folder in the project repository on Github -
[javadoc.io(Current Maven Release)](http://www.javadoc.io/doc/com.jgcomptech.tools/java-ultimate-tools) - the released JavaDoc jar on Maven Central - -## Download JAR -**[ Download v1.5.1](https://github.com/JGCompTech/JavaUltimateTools/releases/tag/v1.5.1)** - -The changelog can be found [[Changelog | here]]. - -## Using with Maven -If you are familiar with [Maven](http://maven.apache.org), add the following XML -fragments into your pom.xml file. With those settings, your Maven will automatically download our library into your local Maven repository, since our libraries are synchronized with the [Maven central repository](http://repo1.maven.org/maven2/com/jgcomptech/tools/java-ultimate-tools/). - -``` tab="Maven" - - - com.jgcomptech.tools - java-ultimate-tools - 1.5.1 - - -``` - -``` tab="Gradle Groovy DSL" -compile 'com.jgcomptech.tools:java-ultimate-tools:1.5.1' -``` - -``` tab="Gradle Kotlin DSL" -compile(group = "com.jgcomptech.tools", name = "java-ultimate-tools", version = "1.5.1") -``` - -``` tab="Scala SBT" -libraryDependencies += "com.jgcomptech.tools" % "java-ultimate-tools" % "1.5.1" -``` - -``` tab="Apache Ivy" - -``` - -``` tab="Groovy Grape" -@Grapes( - @Grab(group='com.jgcomptech.tools', module='java-ultimate-tools', version='1.5.1') -) -``` - -## License -[![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/) - -JavaUltimateTools by J&G CompTech is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). - -©2018 J&G CompTech - -*[JUT]: Java Ultimate Tools \ No newline at end of file diff --git a/index.html b/index.html new file mode 100755 index 0000000..5dbb8bc --- /dev/null +++ b/index.html @@ -0,0 +1,851 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Java Ultimate Tools Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + +
+ +
+ +
+ + + + +
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + +

+

Welcome to Java Ultimate Tools DocsLink

+

Build Status CircleCI Language grade: Java Maven Central Javadocs

+

What is Java Ultimate Tools?Link

+

Java Ultimate Tools, or JUT for short, is a large powerful and flexible open-source repository for use in any Java program.

+

Java Ultimate Tools FeaturesLink

+
    +
  • OSInfo - Contains many classes that return information about the current Windows installation. This includes Architecture, Edition, Name, Product Key, Service Pack, User Info and Version.
  • +
  • HWInfo - Contains many classes that return information about the current computer hardware. This includes BIOS, Network, OEM, Processor, RAM and Storage.
  • +
  • SecurityTools - Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384 and SHA512. Also includes encryption/decryption with RSA.
  • +
  • CommandInfo - Allows you to run any console command and will return the result to a string to use within your program. You can also run the command elevated and it will open in a new cmd window and show the results. Note: If elevated, result cannot be returned as a string.
  • +
  • MessageBox and Login dialogs - Dialogs to use in JavaFX applications
  • +
  • FXML Dialog Wrapper - Class to wrap a FXML dialog object, reducing the amount of required code
  • +
  • DatabaseTools - Allows communication with H2, HyperSQL and SQLite databases
  • +
  • SQL Statement Builders - Allows for using methods instead of native SQL code to generate Prepared Statements
  • +
  • User Account Management Tools - Includes User Roles, Sessions and Permissions
  • +
  • Custom Event Manager System - Creates Events similar to the JavaFX Events but not using any JavaFX classes
  • +
  • Utility Classes - Includes classes for managing collections, numbers and strings
  • +
  • And Much More!
  • +
+

NOTE: This Project Has Now Been Updated To Use Java 10!!!

+

DevelopmentLink

+

Want to contribute? Great! +Any help with development is greatly appreciated. If you want to add something or fix any issues please submit a pull request and if it is helpful it may be merged. Please check out our Code of Conduct for Contributors.

+

DocumentationLink

+

The documentation for JUT is currently a work in progress and new changes will be occurring soon.

+

JavaDocLink

+

The JavaDoc info is hosted at the following 2 locations: +
github.io(Current GitHub Branch) - stored in the doc folder in the project repository on Github +
javadoc.io(Current Maven Release) - the released JavaDoc jar on Maven Central

+

Download JARLink

+

Download v1.5.1

+

The changelog can be found here.

+

Using with MavenLink

+

If you are familiar with Maven, add the following XML +fragments into your pom.xml file. With those settings, your Maven will automatically download our library into your local Maven repository, since our libraries are synchronized with the Maven central repository.

+
+ + +
1
+2
+3
+4
+5
+6
+7
<dependencies>
+    <dependency>
+        <groupId>com.jgcomptech.tools</groupId>
+        <artifactId>java-ultimate-tools</artifactId>
+        <version>1.5.1</version>
+    </dependency>
+</dependencies>
+
+
+ + +
1
compile 'com.jgcomptech.tools:java-ultimate-tools:1.5.1'
+
+
+ + +
1
compile(group = "com.jgcomptech.tools", name = "java-ultimate-tools", version = "1.5.1")
+
+
+ + +
1
libraryDependencies += "com.jgcomptech.tools" % "java-ultimate-tools" % "1.5.1"
+
+
+ + +
1
<dependency org="com.jgcomptech.tools" name="java-ultimate-tools" rev="1.5.1" />
+
+
+ + +
1
+2
+3
@Grapes(
+  @Grab(group='com.jgcomptech.tools', module='java-ultimate-tools', version='1.5.1')
+)
+
+
+
+

LicenseLink

+

Creative Commons License

+

JavaUltimateTools by J&G CompTech is licensed under a Creative Commons Attribution 4.0 International License.

+

©2018 J&G CompTech

+ + + + + + + + + +
+
+
+
+ + + + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 86edec9..0000000 --- a/mkdocs.yml +++ /dev/null @@ -1,71 +0,0 @@ -site_name: Java Ultimate Tools Documentation -site_description: The Official Documentation For The Java Ultimate Tools Library - -theme: - name: material - palette: - primary: 'blue grey' - accent: 'amber' - font: - text: 'Ubuntu' - code: 'Ubuntu Mono' - logo: - icon: 'settings_applications' - -site_author: Joshua Gager - -repo_name: 'JavaUltimateTools-Docs' -repo_url: 'https://github.com/JGCompTech/JavaUltimateTools-Docs' - -extra: - social: - - type: 'github' - link: 'https://github.com/JGCompTech' - - type: 'globe' - link: 'https://jgcomptech.com' - -markdown_extensions: - - admonition - - codehilite: - linenums: true - - footnotes - - abbr - - sane_lists - - mdx_semanticwikilinks - - toc: - permalink: Link - - pymdownx.betterem: - smart_enable: all - - pymdownx.caret - - pymdownx.critic - - pymdownx.details - - pymdownx.inlinehilite - - pymdownx.magiclink - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.superfences - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.tilde - -nav: - - Home: index.md - - Classes: - - Auth System: - - Intoduction: AuthSystem/index.md - - Auth Manager: AuthSystem/AuthManager.md - - Permission Manager: AuthSystem/PermissionManager.md - - Session Manager: AuthSystem/SessionManager.md - - Subject: AuthSystem/Subject.md - - User Manager: AuthSystem/UserManager.md - - User Role Manager: AuthSystem/UserRoleManager.md - - Database Tools: DatabaseTools/index.md - - Dialogs: Dialogs/index.md - - Event Management: EventManagement/index.md - - HWInfo : HWInfo/index.md - - OSInfo: OSInfo/index.md - - Security Tools: SecurityTools/index.md - - Utils : Utils/index.md - - Changelog: changelog.md - - JavaDoc: http://www.javadoc.io/doc/com.jgcomptech.tools/java-ultimate-tools - - GitHub: https://github.com/JGCompTech/JavaUltimateTools \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100755 index 0000000..ba9f6bd --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Welcome to Java Ultimate Tools Docs Link What is Java Ultimate Tools? Link Java Ultimate Tools, or JUT for short, is a large powerful and flexible open-source repository for use in any Java program. Java Ultimate Tools Features Link OSInfo - Contains many classes that return information about the current Windows installation. This includes Architecture, Edition, Name, Product Key, Service Pack, User Info and Version. HWInfo - Contains many classes that return information about the current computer hardware. This includes BIOS, Network, OEM, Processor, RAM and Storage. SecurityTools - Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384 and SHA512. Also includes encryption/decryption with RSA. CommandInfo - Allows you to run any console command and will return the result to a string to use within your program. You can also run the command elevated and it will open in a new cmd window and show the results. Note: If elevated, result cannot be returned as a string. MessageBox and Login dialogs - Dialogs to use in JavaFX applications FXML Dialog Wrapper - Class to wrap a FXML dialog object, reducing the amount of required code DatabaseTools - Allows communication with H2, HyperSQL and SQLite databases SQL Statement Builders - Allows for using methods instead of native SQL code to generate Prepared Statements User Account Management Tools - Includes User Roles, Sessions and Permissions Custom Event Manager System - Creates Events similar to the JavaFX Events but not using any JavaFX classes Utility Classes - Includes classes for managing collections, numbers and strings And Much More! NOTE: This Project Has Now Been Updated To Use Java 10!!! Development Link Want to contribute? Great! Any help with development is greatly appreciated. If you want to add something or fix any issues please submit a pull request and if it is helpful it may be merged. Please check out our Code of Conduct for Contributors . Documentation Link The documentation for JUT is currently a work in progress and new changes will be occurring soon. JavaDoc Link The JavaDoc info is hosted at the following 2 locations: github.io(Current GitHub Branch) - stored in the doc folder in the project repository on Github javadoc.io(Current Maven Release) - the released JavaDoc jar on Maven Central Download JAR Link Download v1.5.1 The changelog can be found here . Using with Maven Link If you are familiar with Maven , add the following XML fragments into your pom.xml file. With those settings, your Maven will automatically download our library into your local Maven repository, since our libraries are synchronized with the Maven central repository . Maven 1 2 3 4 5 6 7 com.jgcomptech.tools java-ultimate-tools 1.5.1 Gradle Groovy DSL 1 compile 'com.jgcomptech.tools:java-ultimate-tools:1.5.1' Gradle Kotlin DSL 1 compile(group = \"com.jgcomptech.tools\", name = \"java-ultimate-tools\", version = \"1.5.1\") Scala SBT 1 libraryDependencies += \"com.jgcomptech.tools\" % \"java-ultimate-tools\" % \"1.5.1\" Apache Ivy 1 Groovy Grape 1 2 3 @Grapes( @Grab(group='com.jgcomptech.tools', module='java-ultimate-tools', version='1.5.1') ) License Link JavaUltimateTools by J&G CompTech is licensed under a Creative Commons Attribution 4.0 International License . \u00a92018 J&G CompTech","title":"Home"},{"location":"#welcome-to-java-ultimate-tools-docs","text":"","title":"Welcome to Java Ultimate Tools Docs"},{"location":"#what-is-java-ultimate-tools","text":"Java Ultimate Tools, or JUT for short, is a large powerful and flexible open-source repository for use in any Java program.","title":"What is Java Ultimate Tools?"},{"location":"#java-ultimate-tools-features","text":"OSInfo - Contains many classes that return information about the current Windows installation. This includes Architecture, Edition, Name, Product Key, Service Pack, User Info and Version. HWInfo - Contains many classes that return information about the current computer hardware. This includes BIOS, Network, OEM, Processor, RAM and Storage. SecurityTools - Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384 and SHA512. Also includes encryption/decryption with RSA. CommandInfo - Allows you to run any console command and will return the result to a string to use within your program. You can also run the command elevated and it will open in a new cmd window and show the results. Note: If elevated, result cannot be returned as a string. MessageBox and Login dialogs - Dialogs to use in JavaFX applications FXML Dialog Wrapper - Class to wrap a FXML dialog object, reducing the amount of required code DatabaseTools - Allows communication with H2, HyperSQL and SQLite databases SQL Statement Builders - Allows for using methods instead of native SQL code to generate Prepared Statements User Account Management Tools - Includes User Roles, Sessions and Permissions Custom Event Manager System - Creates Events similar to the JavaFX Events but not using any JavaFX classes Utility Classes - Includes classes for managing collections, numbers and strings And Much More! NOTE: This Project Has Now Been Updated To Use Java 10!!!","title":"Java Ultimate Tools Features"},{"location":"#development","text":"Want to contribute? Great! Any help with development is greatly appreciated. If you want to add something or fix any issues please submit a pull request and if it is helpful it may be merged. Please check out our Code of Conduct for Contributors .","title":"Development"},{"location":"#documentation","text":"The documentation for JUT is currently a work in progress and new changes will be occurring soon.","title":"Documentation"},{"location":"#javadoc","text":"The JavaDoc info is hosted at the following 2 locations: github.io(Current GitHub Branch) - stored in the doc folder in the project repository on Github javadoc.io(Current Maven Release) - the released JavaDoc jar on Maven Central","title":"JavaDoc"},{"location":"#download-jar","text":"Download v1.5.1 The changelog can be found here .","title":"Download JAR"},{"location":"#using-with-maven","text":"If you are familiar with Maven , add the following XML fragments into your pom.xml file. With those settings, your Maven will automatically download our library into your local Maven repository, since our libraries are synchronized with the Maven central repository . Maven 1 2 3 4 5 6 7 com.jgcomptech.tools java-ultimate-tools 1.5.1 Gradle Groovy DSL 1 compile 'com.jgcomptech.tools:java-ultimate-tools:1.5.1' Gradle Kotlin DSL 1 compile(group = \"com.jgcomptech.tools\", name = \"java-ultimate-tools\", version = \"1.5.1\") Scala SBT 1 libraryDependencies += \"com.jgcomptech.tools\" % \"java-ultimate-tools\" % \"1.5.1\" Apache Ivy 1 Groovy Grape 1 2 3 @Grapes( @Grab(group='com.jgcomptech.tools', module='java-ultimate-tools', version='1.5.1') )","title":"Using with Maven"},{"location":"#license","text":"JavaUltimateTools by J&G CompTech is licensed under a Creative Commons Attribution 4.0 International License . \u00a92018 J&G CompTech","title":"License"},{"location":"changelog/","text":"JUT Version Changelog Link Version 1.5.1 changes (10/13/2018): Link Added new userHasPermissions method overload to AuthManager Added new userHasPermissions method overload to Subject Fixed bugs and missing methods in Subject Fixed deprecated methods in NativeMethods Fixed other small bugs Version 1.5.0 changes (10/07/2018): Link Updated JDK to Java 10 Login Dialogs now don't require the use of Platform.runLater() Message Boxes now don't require the use of Platform.runLater() Message Box Default button is now in the right order. Massive changes to authentication and permissions system Renamed jbdc to jdbc Removed all deprecated methods from 1.4.0 Updated javadoc Replaced some loops with streams Added trim to all string isEmpty checks Added UTF_8 protection Added ExceptionUtils class for use in junit tests All password hashing now uses BCrypt replacing SHA-512 Other minor fixes Version 1.4.2 changes (1/23/2018): Link Fixed fatal error with isUserLoggedIn method Version 1.4.1 changes (1/22/2018): Link Added UserManagerException Added PasswordHashingFailedException Added isAdminLoggedIn method Added getAdminOverride and getUserVerification methods Added requireAdmin and requireAndVerifyAdmin methods Added isLoggedIn method Fixed rare bugs with loginUser and logoutUser methods Fixed exception that was thrown if user did not exist on login dialog Limited number of SQLException and GeneralSecurityException checked exceptions Changed Session Manager dialogs to use instance vars for parameters(old methods deprecated) Version 1.4.0 changes (1/19/2018): Link Added User Management Classes (UserManager, UserAccount, UserRoleManager and UserRole) Added Permission Management Classes (Permission Manager and Permission) Added Session Management Classes (Session Manager, MultiSessionManager and Session) Added Database Builder Classes For Building SQL Code Added HyperSQL Database Support Added Custom Event/Event Handler System Added New Utilities Classes (StringUtils, NumberUtils and CollectionUtils) NOTE: Some API changes have occurred: * Moved Database.Users class to UsersManager class * Made Database class constructor auto-connect to database * Deprecated DatabaseConnectionInfo fields and replaced with getters/setters * Made all utility classes final and have private constructors * Made all method parameters and most existing classes final * Added period to first line of all javadoc comments * Updated SecurityTools.getFileHash to use Apache Commons Codec Library (Java 9 Fix) * Renamed ReInitalizeHW to ReInitializeHW * Renamed ReInitalizeOS to ReInitializeOS Version 1.3.1 changes (\u2158/2017): Link Added FXML Dialog Wrapper JavaDocs documentation is improved Pom file is improved and updated Now hosted on Maven Central Version 1.3.0 changes (3/31/2017): Link Added MessageBox and Login dialog objects Added Static Class Instantiation Protection Added Database Tools classes (Includes SQLite and H2 databases) All dependencies are now included in jar file JavaDocs documentation is improved Version 1.2.0 changes (02/22/2017): Link Fixed ComputerNameActive and ComputerNamePending not returning accurate value Added ComputerInfo Class Fixed a naming bug since version 1.1 that caused an infinite loop Fixed the java.IO.File.delete calls to now use the java.nio.file.Files.delete Created a demo if the library is run directly Fixed error with RSA generate key pair, it didn't check if save to files was true Fixed error with ConvertBytes function not returning accurate value Version 1.1.0 changes (02/18/2017): Link Created OSInfo, HWInfo, SecurityTools and WebTools classes instead of packages to improve importing. Renamed StringExpanded2 to StringExpandedFromRegistry. Moved tools.osinfo.Enums to just tools.Enums. Finalized JavaDocs. Everything is documented correctly now. Version 1.0.0 changes (02/13/2017): Link Initial Release","title":"Changelog"},{"location":"changelog/#jut-version-changelog","text":"","title":"JUT Version Changelog"},{"location":"changelog/#version-151-changes-10132018","text":"Added new userHasPermissions method overload to AuthManager Added new userHasPermissions method overload to Subject Fixed bugs and missing methods in Subject Fixed deprecated methods in NativeMethods Fixed other small bugs","title":"Version 1.5.1 changes (10/13/2018):"},{"location":"changelog/#version-150-changes-10072018","text":"Updated JDK to Java 10 Login Dialogs now don't require the use of Platform.runLater() Message Boxes now don't require the use of Platform.runLater() Message Box Default button is now in the right order. Massive changes to authentication and permissions system Renamed jbdc to jdbc Removed all deprecated methods from 1.4.0 Updated javadoc Replaced some loops with streams Added trim to all string isEmpty checks Added UTF_8 protection Added ExceptionUtils class for use in junit tests All password hashing now uses BCrypt replacing SHA-512 Other minor fixes","title":"Version 1.5.0 changes (10/07/2018):"},{"location":"changelog/#version-142-changes-1232018","text":"Fixed fatal error with isUserLoggedIn method","title":"Version 1.4.2 changes (1/23/2018):"},{"location":"changelog/#version-141-changes-1222018","text":"Added UserManagerException Added PasswordHashingFailedException Added isAdminLoggedIn method Added getAdminOverride and getUserVerification methods Added requireAdmin and requireAndVerifyAdmin methods Added isLoggedIn method Fixed rare bugs with loginUser and logoutUser methods Fixed exception that was thrown if user did not exist on login dialog Limited number of SQLException and GeneralSecurityException checked exceptions Changed Session Manager dialogs to use instance vars for parameters(old methods deprecated)","title":"Version 1.4.1 changes (1/22/2018):"},{"location":"changelog/#version-140-changes-1192018","text":"Added User Management Classes (UserManager, UserAccount, UserRoleManager and UserRole) Added Permission Management Classes (Permission Manager and Permission) Added Session Management Classes (Session Manager, MultiSessionManager and Session) Added Database Builder Classes For Building SQL Code Added HyperSQL Database Support Added Custom Event/Event Handler System Added New Utilities Classes (StringUtils, NumberUtils and CollectionUtils) NOTE: Some API changes have occurred: * Moved Database.Users class to UsersManager class * Made Database class constructor auto-connect to database * Deprecated DatabaseConnectionInfo fields and replaced with getters/setters * Made all utility classes final and have private constructors * Made all method parameters and most existing classes final * Added period to first line of all javadoc comments * Updated SecurityTools.getFileHash to use Apache Commons Codec Library (Java 9 Fix) * Renamed ReInitalizeHW to ReInitializeHW * Renamed ReInitalizeOS to ReInitializeOS","title":"Version 1.4.0 changes (1/19/2018):"},{"location":"changelog/#version-131-changes-452017","text":"Added FXML Dialog Wrapper JavaDocs documentation is improved Pom file is improved and updated Now hosted on Maven Central","title":"Version 1.3.1 changes (4/5/2017):"},{"location":"changelog/#version-130-changes-3312017","text":"Added MessageBox and Login dialog objects Added Static Class Instantiation Protection Added Database Tools classes (Includes SQLite and H2 databases) All dependencies are now included in jar file JavaDocs documentation is improved","title":"Version 1.3.0 changes (3/31/2017):"},{"location":"changelog/#version-120-changes-02222017","text":"Fixed ComputerNameActive and ComputerNamePending not returning accurate value Added ComputerInfo Class Fixed a naming bug since version 1.1 that caused an infinite loop Fixed the java.IO.File.delete calls to now use the java.nio.file.Files.delete Created a demo if the library is run directly Fixed error with RSA generate key pair, it didn't check if save to files was true Fixed error with ConvertBytes function not returning accurate value","title":"Version 1.2.0 changes (02/22/2017):"},{"location":"changelog/#version-110-changes-02182017","text":"Created OSInfo, HWInfo, SecurityTools and WebTools classes instead of packages to improve importing. Renamed StringExpanded2 to StringExpandedFromRegistry. Moved tools.osinfo.Enums to just tools.Enums. Finalized JavaDocs. Everything is documented correctly now.","title":"Version 1.1.0 changes (02/18/2017):"},{"location":"changelog/#version-100-changes-02132017","text":"Initial Release","title":"Version 1.0.0 changes (02/13/2017):"},{"location":"AuthSystem/","text":"Auth System Documentation Link Introduction Link Package Names: com.jgcomptech.tools.authc com.jgcomptech.tools.authz The JUT Auth System is a set of classes that allow for authentication and authorization. This system uses the Database class to connect to a database to store all account info. Features Link Auth Manager Contains all methods needed for controlling the Auth System. Permission Manager Manages permissions to be used to enable or disable parts of your application. Subject Manages all tasks related to the currently logged in user account. Session Manager Manages all login sessions to allow users to login to your application. User Manager Manages all user accounts in the database. User Role Manager Manages all user account roles.","title":"Intoduction"},{"location":"AuthSystem/#auth-system-documentation","text":"","title":"Auth System Documentation"},{"location":"AuthSystem/#introduction","text":"Package Names: com.jgcomptech.tools.authc com.jgcomptech.tools.authz The JUT Auth System is a set of classes that allow for authentication and authorization. This system uses the Database class to connect to a database to store all account info.","title":"Introduction"},{"location":"AuthSystem/#features","text":"Auth Manager Contains all methods needed for controlling the Auth System. Permission Manager Manages permissions to be used to enable or disable parts of your application. Subject Manages all tasks related to the currently logged in user account. Session Manager Manages all login sessions to allow users to login to your application. User Manager Manages all user accounts in the database. User Role Manager Manages all user account roles.","title":"Features"},{"location":"AuthSystem/AuthManager/","text":"Auth Manager Link Introduction Link Package Name: com.jgcomptech.tools.authc.AuthManager The Auth Manager class contains all methods needed for controlling the Auth System. This includes methods to manage user accounts, login sessions, user roles and user permissions. Setup Link The Auth Manager is a singleton class but a new instance still needs to be initialized upon first use. When a new instance is created a \"users\" table is automatically created in the specified database. The following code can be used to create a new instance: 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var manager = AuthManager . getNewInstance ( db ); } After the new instance has been created you can use the following to retrieve the instance again: 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var manager = AuthManager . getInstance (); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs. User Account Methods Link Create A New User (createUser) Link To create a new user use the createUser method supplying the following parameters: Username - The username of the new account Password - The password of the new account User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 3 final var authManager = AuthManager . getInstance (); authManager . createUser ( \"admin\" , \"1234\" , UserRoleManager . SystemUserRoles . ADMIN ); authManager . createUser ( \"editor\" , \"1234\" , UserRoleManager . SystemUserRoles . EDITOR ); Delete An Existing User (deleteUser) Link To delete an existing user use the deleteUser method supplying the following parameter: Username - The username of the account to delete Example 1 2 final var authManager = AuthManager . getInstance (); authManager . deleteUser ( \"admin\" ); Get Username Object (getUser) Link Retrieves a readonly immutable UserAccount object. To retrieve the object supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserAccount user = authManager . getUser ( \"admin\" ); Check If User Exists (userExists) Link Checks to see if the specified user account exists. To check a user account, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userExists ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin User Exists!\" ); else MessageBox . show ( \"Admin User Does Not Exist!\" ); Get Account Creation Date (getUserCreationDate) Link Returns the date and time the user was initially created. There is two methods to retrieving the user creation date. The date can either be returned as a LocalDateTime object or as a formatted string. LocalDateTime Object Link To retrieve the user creation date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = authManager . getUserCreationDate ( \"admin\" ); MessageBox . show ( \"Account Was Created On \" + result . format ( formatter )); Formatted String Object Link To retrieve the user creation date, supply the following parameters: Username - The username of the account to lookup Format - The string that represents the format to return the date Example 1 2 3 final var authManager = AuthManager . getInstance (); final String result = authManager . getUserCreationDate ( \"admin\" , \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Account Was Created On \" + result ); Get User Role (getUserRole) Link Retrieves the UserRole object assigned to the specified user. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole userRole = authManager . getUserRole ( \"admin\" ); Set User Role (getUserRole) Link Sets the user role assigned to the specified user. To set the user role, supply the following parameters: Username - The username of the account to lookup User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var authManager = AuthManager . getInstance (); userManager . setUserRole ( \"admin\" , UserRoleManager . SystemUserRoles . ADMIN ); Set User Password (setPassword) Link Sets the password assigned to the specified user. To set the new password, supply the following parameters: Username - The username of the account to lookup Password - The new password to set Note If you want to prevent a user from setting an empty password or to check for password complexity requirements those checks need to be implemented separately. This method allows empty passwords. Even if the password is empty, the empty password is still encrypted with a random secure salt just like any supplied password would be. Example 1 2 final var authManager = AuthManager . getInstance (); authManager . setPassword ( \"admin\" , \"newPass\" ); Check If Password Matches (checkPasswordMatches) Link This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameters: Username - The username of the account to lookup Password - The password to verify Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . checkPasswordMatches ( \"admin\" , \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" ); Lock/Unlock A User (lockUser and unlockUser) Link A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To lock and unlock an account, supply the following parameter: Username - The username of the account to lock/unlock Example 1 2 3 4 5 final var authManager = AuthManager . getInstance (); //Lock The Account authManager . lockUser ( \"admin\" ); //Unlock The Account authManager . unlockUser ( \"admin\" ); Check If A User Is Locked (isUserLocked) Link A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To check if an account is locked, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLocked ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Is Locked!\" ); else MessageBox . show ( \"Admin Account Is Unlocked!\" ); Set User Password Expiration Date (setPasswordExpirationDate) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameters: Username - The username of the account to update Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var authManager = AuthManager . getInstance (); //Sets the date to now authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now ()); //Sets the date to 30 days from today authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . parse ( str , formatter )); Disable Password Expiration (disablePasswordExpiration) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To disable password expiration for a user, supply the following parameter: Username - The username of the account to update Example 1 2 final var authManager = AuthManager . getInstance (); authManager . disablePasswordExpiration ( \"admin\" ); Check If User Password Is Expired (isPasswordExpired) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To check if a user's password is expired, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isPasswordExpired ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Password Is Expired!\" ); else MessageBox . show ( \"Admin Account Password Is Not Expired!\" ); Check If User Password Has Expiration Date (isPasswordSetToExpire) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To check if a user's password has an expiration date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isPasswordSetToExpire ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Password Has An Expiration Date!\" ); else MessageBox . show ( \"Admin Account Password Does Not Have An Expiration Date!\" ); Get User Password Expiration Date (getPasswordExpirationDate) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. There is two methods to retrieving the password expiration date. The date can either be returned as a LocalDateTime object or as a formatted string. Note If the expiration date has been disabled or was never enabled this method will still return an expiration date. For logistical database reasons a date still has to be set. So the date will be set to 1000 years after the user account was created or 1000 years after the date when the password expiration date was last disabled. This number can be updated if any bugs occur but it seems like 1000 years is far enough in the future to not cause any problems. LocalDateTime Object Link To retrieve the password expiration date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = authManager . getPasswordExpirationDate ( \"admin\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result . format ( formatter )); Formatted String Object Link To retrieve the password expiration date, supply the following parameters: Username - The username of the account to lookup Format - The string that represents the format to return the date Example 1 2 3 final var authManager = AuthManager . getInstance (); final String result = authManager . getPasswordExpirationDate ( \"admin\" , \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result ); Single-Session Methods Link Get Logged-In Username (getLoggedInUsername) Link Returns the username of the currently logged in user under the single session context. Example 1 2 final var authManager = AuthManager . getInstance (); final String currentUsername = authManager . getLoggedInUsername (); Is Any User Logged-In (isUserLoggedIn) Link Checks if a user is currently logged in under the single-user context. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn (); if ( result ) MessageBox . show ( \"A user is logged-in!\" ); else MessageBox . show ( \"No user is logged-in!\" ); Is A Specific User Logged-In (isUserLoggedIn) Link Checks if the specified user is currently logged in under the single-user context. To check if a specific user is logged-in, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" ); Get Currently Logged-In User Session (getSession) Link Retrieves the current session for the specified username, under the single-user context. Example 1 2 final var authManager = AuthManager . getInstance (); final Session currentSession = authManager . getSession (); Get Specific User Session (getSession) Link Retrieves the current session for the specified username, under the single-user context. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final Session session = authManager . getSession ( \"admin\" ); Show Login Dialog (showLoginWindow) Link Shows the login dialog window to log a user into the single-user context. The method returns true if a user was logged in successfully. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . showLoginWindow ( true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); Login A Specific User (loginUser) Link Logs in a user, under the single-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Warning This method does not validate credentials and should not be used except in advanced use cases. A example case could be to login a user during unit testing. The method showLoginWindow should be used instead. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . loginUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); Logout Current Logged-In User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in. Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser (); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Logout Specific User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameter: Username - The username of the account to logout Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Get Currently Logged-In User's UserRole (getLoggedInUserRole) Link Retrieves the user role of the currently logged in user under the single user context. If no user is currently logged-in then this method will return null. Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole result = authManager . getLoggedInUserRole (); Check If An Admin User Is Logged-In (isAdminLoggedIn) Link Checks if an admin user is currently logged in under the single user context. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isAdminLoggedIn (); if ( result ) MessageBox . show ( \"An Admin user is logged-in!\" ); else MessageBox . show ( \"An Admin user is not logged-in!\" ); Get Admin Login Override (getAdminOverride) Link Requests an admin user to authenticate to override permissions by showing the login dialog using the single session context. During this process the admin user is not actually logged-in, instead just their username, password and user role is verified. Returns true if admin override succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . getAdminOverride (); if ( result ) MessageBox . show ( \"Admin override succedded!\" ); else MessageBox . show ( \"Admin override failed!\" ); Get User Login Verification (getUserVerification) Link Requests that the currently logged in username to re-login using the single session context. During this process the user is not actually logged-in again, instead just their username and password is verified. Returns true if the user verification succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . getUserVerification (); if ( result ) MessageBox . show ( \"User verification succedded!\" ); else MessageBox . show ( \"User verification failed!\" ); Require That Admin Is Logged-In (requireAdmin) Link Checks that the logged-in user, under the single session context, is an admin and if not, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" ); Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin) Link Checks that the logged-in user, under the single session context, is an admin, if true, prompts the admin to re-login and if false, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" ); Multi-Session Methods Link Is A Specific User Logged-In (isUserLoggedIn) Link Checks if the specified user is currently logged in under the multi-user context. To check if a specific user is logged-in, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn ( \"admin\" , true ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" ); Get Max Allowed Sessions (getMaxSessions) Link Retrieves the maximum number of allowed sessions, under the multi session context, before login is disabled. Example 1 2 3 final var authManager = AuthManager . getInstance (); final int result = authManager . getMaxSessions (); MessageBox . show ( \"The max number of allowed sessions is \" + result + '!' ); Set Max Allowed Sessions (setMaxSessions) Link Sets the maximum number of allowed sessions, under the multi session context, before login is disabled. To disable the limit set the value to a negative number. To set the maximum number of allowed sessions, supply the following parameter: value - The number of allowed sessions to set Example 1 2 3 4 5 final var authManager = AuthManager . getInstance (); //Set max sessions to 30. authManager . setMaxSessions ( 30 ); //Block all session creation by setting to 0 authManager . setMaxSessions ( 0 ); Note Setting this value to a negative number will disable the limit because a negative amount of sessions can never be created. When the SessionManager is initialized the value is initially set to -1. Get Session Count (getSessionsCount) Link Retrieves the current number of logged in sessions under the multi-user context. Example 1 2 3 final var authManager = AuthManager . getInstance (); final int result = authManager . getSessionsCount (); MessageBox . show ( \"The max number of logged-in sessions is \" + result + '!' ); Get All Sessions (getSessions) Link Retrieves the current logged in sessions as a HashMap under the multi session context. The returned HashMap key is the session username and the value is the related Session object. Example 1 2 3 final var authManager = AuthManager . getInstance (); final Map < String , Session > sessions = authManager . getSessions (); MessageBox . show ( \"The max number of logged-in sessions is \" + sessions . size () + '!' ); Get Specific User Session (getSession) Link Retrieves the current session for the specified username, under the multi-user context. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 final var authManager = AuthManager . getInstance (); final Session session = authManager . getSession ( \"admin\" , true ); Login A Specific User (loginUser) Link Logs in a user, under the multi-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Warning This method does not validate credentials and should be used carefully. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). An example is listed below on how to implement this. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); This example adds password checking to verify credentials before login: Example 1 2 3 4 5 6 final var authManager = AuthManager . getInstance (); if ( authManager . checkPasswordMatches ( \"admin\" , \"1234\" )) { final boolean result = authManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); } else MessageBox . show ( \"User login failed!\" ); Logout Specific User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameters: Username - The username of the account to logout true - The true boolean is required to operate under the multi-user context Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Other Session Methods Link Is New Session Allowed (isNewSessionAllowed) Link Checks if creation of a new session for the specified username is allowed under the specified context. This method checks to see if the specified user is already logged-in and if the second parameter is true checks to see if the max sessions limit has been reached. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true/false - The true for the multi-user context, false for the single-user context Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isNewSessionAllowed ( \"admin\" , true ); if ( result ) MessageBox . show ( \"New User Session Is Allowed For Admin!\" ); else MessageBox . show ( \"New User Session Is Not Allowed For Admin!\" ); User Role Methods Link Create A New User Role (createRole) Link To create a new user role use the createRole method supplying the following parameter: Name - The name of the new user role Note When using this method the UserRole object related to the new user role is returned. If a user role already exists with the specified name the already existing UserRole object is returned instead. Example 1 2 3 final var authManager = AuthManager . getInstance (); final var newRole = authManager . createRole ( \"moderator\" ); newRole . modify (). add ( \"edit\" , \"create\" , \"read\" ); Add Existing User Role (addExistingRole) Link You can manually create a new UserRole object and directly add that to the list. To add an existing user role use the addExistingUserRole method supplying the following parameter: UserRole - The UserRole object to add Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final UserRole role = new UserRole ( \"moderator\" ); role . modify (). add ( \"edit\" , \"create\" , \"read\" ); authManager . addExistingRole ( role ); Get List Of All Installed User Roles (getRoles) Link Retrieves an unmodifiable list of all user roles. Example 1 2 final var authManager = AuthManager . getInstance (); final Map < String , UserRole > roles = authManager . getRoles (); Get Specific User Role (getRole) Link Retrieves the specified user role. To retrieve a user role use the getUserRole method supplying the following parameter: Name - The name of the User Role to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole role = authManager . getRole ( \"admin\" ); Other Methods Link Check If User Has Permission (hasPermission) Link Checks if the current username has the specified permission. To check for the permission, supply the following parameter: Permission - The name of the permission to check The permission manager has the following built in permissions: admin edit create read Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userHasPermission ( \"admin\" ); if ( result ) MessageBox . show ( \"User Has Admin Permission!\" ); else MessageBox . show ( \"User Does Not Have Admin Permission!\" ); This can also be done with a list of permissions: Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userHasPermissions ( new HashSet <>( Arrays . asList ( \"admin\" , \"edit\" ))); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" ); Get All Username Objects (getUsersList) Link Retrieves a readonly immutable UserAccount object for each user account and returns the list as a HashSet. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < UserAccount > users = authManager . getUsersList (); Get List Of All Usernames (getUsernameList) Link Retrieves a list of the user names in the database. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < String > users = authManager . getUsernameList ();","title":"Auth Manager"},{"location":"AuthSystem/AuthManager/#auth-manager","text":"","title":"Auth Manager"},{"location":"AuthSystem/AuthManager/#introduction","text":"Package Name: com.jgcomptech.tools.authc.AuthManager The Auth Manager class contains all methods needed for controlling the Auth System. This includes methods to manage user accounts, login sessions, user roles and user permissions.","title":"Introduction"},{"location":"AuthSystem/AuthManager/#setup","text":"The Auth Manager is a singleton class but a new instance still needs to be initialized upon first use. When a new instance is created a \"users\" table is automatically created in the specified database. The following code can be used to create a new instance: 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var manager = AuthManager . getNewInstance ( db ); } After the new instance has been created you can use the following to retrieve the instance again: 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var manager = AuthManager . getInstance (); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs.","title":"Setup"},{"location":"AuthSystem/AuthManager/#user-account-methods","text":"","title":"User Account Methods"},{"location":"AuthSystem/AuthManager/#create-a-new-user-createuser","text":"To create a new user use the createUser method supplying the following parameters: Username - The username of the new account Password - The password of the new account User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 3 final var authManager = AuthManager . getInstance (); authManager . createUser ( \"admin\" , \"1234\" , UserRoleManager . SystemUserRoles . ADMIN ); authManager . createUser ( \"editor\" , \"1234\" , UserRoleManager . SystemUserRoles . EDITOR );","title":"Create A New User (createUser)"},{"location":"AuthSystem/AuthManager/#delete-an-existing-user-deleteuser","text":"To delete an existing user use the deleteUser method supplying the following parameter: Username - The username of the account to delete Example 1 2 final var authManager = AuthManager . getInstance (); authManager . deleteUser ( \"admin\" );","title":"Delete An Existing User (deleteUser)"},{"location":"AuthSystem/AuthManager/#get-username-object-getuser","text":"Retrieves a readonly immutable UserAccount object. To retrieve the object supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserAccount user = authManager . getUser ( \"admin\" );","title":"Get Username Object (getUser)"},{"location":"AuthSystem/AuthManager/#check-if-user-exists-userexists","text":"Checks to see if the specified user account exists. To check a user account, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userExists ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin User Exists!\" ); else MessageBox . show ( \"Admin User Does Not Exist!\" );","title":"Check If User Exists (userExists)"},{"location":"AuthSystem/AuthManager/#get-account-creation-date-getusercreationdate","text":"Returns the date and time the user was initially created. There is two methods to retrieving the user creation date. The date can either be returned as a LocalDateTime object or as a formatted string.","title":"Get Account Creation Date (getUserCreationDate)"},{"location":"AuthSystem/AuthManager/#localdatetime-object","text":"To retrieve the user creation date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = authManager . getUserCreationDate ( \"admin\" ); MessageBox . show ( \"Account Was Created On \" + result . format ( formatter ));","title":"LocalDateTime Object"},{"location":"AuthSystem/AuthManager/#formatted-string-object","text":"To retrieve the user creation date, supply the following parameters: Username - The username of the account to lookup Format - The string that represents the format to return the date Example 1 2 3 final var authManager = AuthManager . getInstance (); final String result = authManager . getUserCreationDate ( \"admin\" , \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Account Was Created On \" + result );","title":"Formatted String Object"},{"location":"AuthSystem/AuthManager/#get-user-role-getuserrole","text":"Retrieves the UserRole object assigned to the specified user. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole userRole = authManager . getUserRole ( \"admin\" );","title":"Get User Role (getUserRole)"},{"location":"AuthSystem/AuthManager/#set-user-role-getuserrole","text":"Sets the user role assigned to the specified user. To set the user role, supply the following parameters: Username - The username of the account to lookup User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var authManager = AuthManager . getInstance (); userManager . setUserRole ( \"admin\" , UserRoleManager . SystemUserRoles . ADMIN );","title":"Set User Role (getUserRole)"},{"location":"AuthSystem/AuthManager/#set-user-password-setpassword","text":"Sets the password assigned to the specified user. To set the new password, supply the following parameters: Username - The username of the account to lookup Password - The new password to set Note If you want to prevent a user from setting an empty password or to check for password complexity requirements those checks need to be implemented separately. This method allows empty passwords. Even if the password is empty, the empty password is still encrypted with a random secure salt just like any supplied password would be. Example 1 2 final var authManager = AuthManager . getInstance (); authManager . setPassword ( \"admin\" , \"newPass\" );","title":"Set User Password (setPassword)"},{"location":"AuthSystem/AuthManager/#check-if-password-matches-checkpasswordmatches","text":"This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameters: Username - The username of the account to lookup Password - The password to verify Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . checkPasswordMatches ( \"admin\" , \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" );","title":"Check If Password Matches (checkPasswordMatches)"},{"location":"AuthSystem/AuthManager/#lockunlock-a-user-lockuser-and-unlockuser","text":"A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To lock and unlock an account, supply the following parameter: Username - The username of the account to lock/unlock Example 1 2 3 4 5 final var authManager = AuthManager . getInstance (); //Lock The Account authManager . lockUser ( \"admin\" ); //Unlock The Account authManager . unlockUser ( \"admin\" );","title":"Lock/Unlock A User (lockUser and unlockUser)"},{"location":"AuthSystem/AuthManager/#check-if-a-user-is-locked-isuserlocked","text":"A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To check if an account is locked, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLocked ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Is Locked!\" ); else MessageBox . show ( \"Admin Account Is Unlocked!\" );","title":"Check If A User Is Locked (isUserLocked)"},{"location":"AuthSystem/AuthManager/#set-user-password-expiration-date-setpasswordexpirationdate","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameters: Username - The username of the account to update Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var authManager = AuthManager . getInstance (); //Sets the date to now authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now ()); //Sets the date to 30 days from today authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); authManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . parse ( str , formatter ));","title":"Set User Password Expiration Date (setPasswordExpirationDate)"},{"location":"AuthSystem/AuthManager/#disable-password-expiration-disablepasswordexpiration","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To disable password expiration for a user, supply the following parameter: Username - The username of the account to update Example 1 2 final var authManager = AuthManager . getInstance (); authManager . disablePasswordExpiration ( \"admin\" );","title":"Disable Password Expiration (disablePasswordExpiration)"},{"location":"AuthSystem/AuthManager/#check-if-user-password-is-expired-ispasswordexpired","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To check if a user's password is expired, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isPasswordExpired ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Password Is Expired!\" ); else MessageBox . show ( \"Admin Account Password Is Not Expired!\" );","title":"Check If User Password Is Expired (isPasswordExpired)"},{"location":"AuthSystem/AuthManager/#check-if-user-password-has-expiration-date-ispasswordsettoexpire","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To check if a user's password has an expiration date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isPasswordSetToExpire ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin Account Password Has An Expiration Date!\" ); else MessageBox . show ( \"Admin Account Password Does Not Have An Expiration Date!\" );","title":"Check If User Password Has Expiration Date (isPasswordSetToExpire)"},{"location":"AuthSystem/AuthManager/#get-user-password-expiration-date-getpasswordexpirationdate","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. There is two methods to retrieving the password expiration date. The date can either be returned as a LocalDateTime object or as a formatted string. Note If the expiration date has been disabled or was never enabled this method will still return an expiration date. For logistical database reasons a date still has to be set. So the date will be set to 1000 years after the user account was created or 1000 years after the date when the password expiration date was last disabled. This number can be updated if any bugs occur but it seems like 1000 years is far enough in the future to not cause any problems.","title":"Get User Password Expiration Date (getPasswordExpirationDate)"},{"location":"AuthSystem/AuthManager/#localdatetime-object_1","text":"To retrieve the password expiration date, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = authManager . getPasswordExpirationDate ( \"admin\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result . format ( formatter ));","title":"LocalDateTime Object"},{"location":"AuthSystem/AuthManager/#formatted-string-object_1","text":"To retrieve the password expiration date, supply the following parameters: Username - The username of the account to lookup Format - The string that represents the format to return the date Example 1 2 3 final var authManager = AuthManager . getInstance (); final String result = authManager . getPasswordExpirationDate ( \"admin\" , \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result );","title":"Formatted String Object"},{"location":"AuthSystem/AuthManager/#single-session-methods","text":"","title":"Single-Session Methods"},{"location":"AuthSystem/AuthManager/#get-logged-in-username-getloggedinusername","text":"Returns the username of the currently logged in user under the single session context. Example 1 2 final var authManager = AuthManager . getInstance (); final String currentUsername = authManager . getLoggedInUsername ();","title":"Get Logged-In Username (getLoggedInUsername)"},{"location":"AuthSystem/AuthManager/#is-any-user-logged-in-isuserloggedin","text":"Checks if a user is currently logged in under the single-user context. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn (); if ( result ) MessageBox . show ( \"A user is logged-in!\" ); else MessageBox . show ( \"No user is logged-in!\" );","title":"Is Any User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/AuthManager/#is-a-specific-user-logged-in-isuserloggedin","text":"Checks if the specified user is currently logged in under the single-user context. To check if a specific user is logged-in, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" );","title":"Is A Specific User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/AuthManager/#get-currently-logged-in-user-session-getsession","text":"Retrieves the current session for the specified username, under the single-user context. Example 1 2 final var authManager = AuthManager . getInstance (); final Session currentSession = authManager . getSession ();","title":"Get Currently Logged-In User Session (getSession)"},{"location":"AuthSystem/AuthManager/#get-specific-user-session-getsession","text":"Retrieves the current session for the specified username, under the single-user context. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final Session session = authManager . getSession ( \"admin\" );","title":"Get Specific User Session (getSession)"},{"location":"AuthSystem/AuthManager/#show-login-dialog-showloginwindow","text":"Shows the login dialog window to log a user into the single-user context. The method returns true if a user was logged in successfully. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . showLoginWindow ( true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" );","title":"Show Login Dialog (showLoginWindow)"},{"location":"AuthSystem/AuthManager/#login-a-specific-user-loginuser","text":"Logs in a user, under the single-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Warning This method does not validate credentials and should not be used except in advanced use cases. A example case could be to login a user during unit testing. The method showLoginWindow should be used instead. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . loginUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" );","title":"Login A Specific User (loginUser)"},{"location":"AuthSystem/AuthManager/#logout-current-logged-in-user-logout","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in. Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser (); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Current Logged-In User (logout)"},{"location":"AuthSystem/AuthManager/#logout-specific-user-logout","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameter: Username - The username of the account to logout Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Specific User (logout)"},{"location":"AuthSystem/AuthManager/#get-currently-logged-in-users-userrole-getloggedinuserrole","text":"Retrieves the user role of the currently logged in user under the single user context. If no user is currently logged-in then this method will return null. Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole result = authManager . getLoggedInUserRole ();","title":"Get Currently Logged-In User's UserRole (getLoggedInUserRole)"},{"location":"AuthSystem/AuthManager/#check-if-an-admin-user-is-logged-in-isadminloggedin","text":"Checks if an admin user is currently logged in under the single user context. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isAdminLoggedIn (); if ( result ) MessageBox . show ( \"An Admin user is logged-in!\" ); else MessageBox . show ( \"An Admin user is not logged-in!\" );","title":"Check If An Admin User Is Logged-In (isAdminLoggedIn)"},{"location":"AuthSystem/AuthManager/#get-admin-login-override-getadminoverride","text":"Requests an admin user to authenticate to override permissions by showing the login dialog using the single session context. During this process the admin user is not actually logged-in, instead just their username, password and user role is verified. Returns true if admin override succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . getAdminOverride (); if ( result ) MessageBox . show ( \"Admin override succedded!\" ); else MessageBox . show ( \"Admin override failed!\" );","title":"Get Admin Login Override (getAdminOverride)"},{"location":"AuthSystem/AuthManager/#get-user-login-verification-getuserverification","text":"Requests that the currently logged in username to re-login using the single session context. During this process the user is not actually logged-in again, instead just their username and password is verified. Returns true if the user verification succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . getUserVerification (); if ( result ) MessageBox . show ( \"User verification succedded!\" ); else MessageBox . show ( \"User verification failed!\" );","title":"Get User Login Verification (getUserVerification)"},{"location":"AuthSystem/AuthManager/#require-that-admin-is-logged-in-requireadmin","text":"Checks that the logged-in user, under the single session context, is an admin and if not, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" );","title":"Require That Admin Is Logged-In (requireAdmin)"},{"location":"AuthSystem/AuthManager/#require-that-admin-is-logged-in-and-request-verification-requireandverifyadmin","text":"Checks that the logged-in user, under the single session context, is an admin, if true, prompts the admin to re-login and if false, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" );","title":"Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin)"},{"location":"AuthSystem/AuthManager/#multi-session-methods","text":"","title":"Multi-Session Methods"},{"location":"AuthSystem/AuthManager/#is-a-specific-user-logged-in-isuserloggedin_1","text":"Checks if the specified user is currently logged in under the multi-user context. To check if a specific user is logged-in, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isUserLoggedIn ( \"admin\" , true ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" );","title":"Is A Specific User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/AuthManager/#get-max-allowed-sessions-getmaxsessions","text":"Retrieves the maximum number of allowed sessions, under the multi session context, before login is disabled. Example 1 2 3 final var authManager = AuthManager . getInstance (); final int result = authManager . getMaxSessions (); MessageBox . show ( \"The max number of allowed sessions is \" + result + '!' );","title":"Get Max Allowed Sessions (getMaxSessions)"},{"location":"AuthSystem/AuthManager/#set-max-allowed-sessions-setmaxsessions","text":"Sets the maximum number of allowed sessions, under the multi session context, before login is disabled. To disable the limit set the value to a negative number. To set the maximum number of allowed sessions, supply the following parameter: value - The number of allowed sessions to set Example 1 2 3 4 5 final var authManager = AuthManager . getInstance (); //Set max sessions to 30. authManager . setMaxSessions ( 30 ); //Block all session creation by setting to 0 authManager . setMaxSessions ( 0 ); Note Setting this value to a negative number will disable the limit because a negative amount of sessions can never be created. When the SessionManager is initialized the value is initially set to -1.","title":"Set Max Allowed Sessions (setMaxSessions)"},{"location":"AuthSystem/AuthManager/#get-session-count-getsessionscount","text":"Retrieves the current number of logged in sessions under the multi-user context. Example 1 2 3 final var authManager = AuthManager . getInstance (); final int result = authManager . getSessionsCount (); MessageBox . show ( \"The max number of logged-in sessions is \" + result + '!' );","title":"Get Session Count (getSessionsCount)"},{"location":"AuthSystem/AuthManager/#get-all-sessions-getsessions","text":"Retrieves the current logged in sessions as a HashMap under the multi session context. The returned HashMap key is the session username and the value is the related Session object. Example 1 2 3 final var authManager = AuthManager . getInstance (); final Map < String , Session > sessions = authManager . getSessions (); MessageBox . show ( \"The max number of logged-in sessions is \" + sessions . size () + '!' );","title":"Get All Sessions (getSessions)"},{"location":"AuthSystem/AuthManager/#get-specific-user-session-getsession_1","text":"Retrieves the current session for the specified username, under the multi-user context. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 final var authManager = AuthManager . getInstance (); final Session session = authManager . getSession ( \"admin\" , true );","title":"Get Specific User Session (getSession)"},{"location":"AuthSystem/AuthManager/#login-a-specific-user-loginuser_1","text":"Logs in a user, under the multi-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Warning This method does not validate credentials and should be used carefully. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). An example is listed below on how to implement this. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); This example adds password checking to verify credentials before login: Example 1 2 3 4 5 6 final var authManager = AuthManager . getInstance (); if ( authManager . checkPasswordMatches ( \"admin\" , \"1234\" )) { final boolean result = authManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); } else MessageBox . show ( \"User login failed!\" );","title":"Login A Specific User (loginUser)"},{"location":"AuthSystem/AuthManager/#logout-specific-user-logout_1","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameters: Username - The username of the account to logout true - The true boolean is required to operate under the multi-user context Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Specific User (logout)"},{"location":"AuthSystem/AuthManager/#other-session-methods","text":"","title":"Other Session Methods"},{"location":"AuthSystem/AuthManager/#is-new-session-allowed-isnewsessionallowed","text":"Checks if creation of a new session for the specified username is allowed under the specified context. This method checks to see if the specified user is already logged-in and if the second parameter is true checks to see if the max sessions limit has been reached. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true/false - The true for the multi-user context, false for the single-user context Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . isNewSessionAllowed ( \"admin\" , true ); if ( result ) MessageBox . show ( \"New User Session Is Allowed For Admin!\" ); else MessageBox . show ( \"New User Session Is Not Allowed For Admin!\" );","title":"Is New Session Allowed (isNewSessionAllowed)"},{"location":"AuthSystem/AuthManager/#user-role-methods","text":"","title":"User Role Methods"},{"location":"AuthSystem/AuthManager/#create-a-new-user-role-createrole","text":"To create a new user role use the createRole method supplying the following parameter: Name - The name of the new user role Note When using this method the UserRole object related to the new user role is returned. If a user role already exists with the specified name the already existing UserRole object is returned instead. Example 1 2 3 final var authManager = AuthManager . getInstance (); final var newRole = authManager . createRole ( \"moderator\" ); newRole . modify (). add ( \"edit\" , \"create\" , \"read\" );","title":"Create A New User Role (createRole)"},{"location":"AuthSystem/AuthManager/#add-existing-user-role-addexistingrole","text":"You can manually create a new UserRole object and directly add that to the list. To add an existing user role use the addExistingUserRole method supplying the following parameter: UserRole - The UserRole object to add Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final UserRole role = new UserRole ( \"moderator\" ); role . modify (). add ( \"edit\" , \"create\" , \"read\" ); authManager . addExistingRole ( role );","title":"Add Existing User Role (addExistingRole)"},{"location":"AuthSystem/AuthManager/#get-list-of-all-installed-user-roles-getroles","text":"Retrieves an unmodifiable list of all user roles. Example 1 2 final var authManager = AuthManager . getInstance (); final Map < String , UserRole > roles = authManager . getRoles ();","title":"Get List Of All Installed User Roles (getRoles)"},{"location":"AuthSystem/AuthManager/#get-specific-user-role-getrole","text":"Retrieves the specified user role. To retrieve a user role use the getUserRole method supplying the following parameter: Name - The name of the User Role to lookup Example 1 2 final var authManager = AuthManager . getInstance (); final UserRole role = authManager . getRole ( \"admin\" );","title":"Get Specific User Role (getRole)"},{"location":"AuthSystem/AuthManager/#other-methods","text":"","title":"Other Methods"},{"location":"AuthSystem/AuthManager/#check-if-user-has-permission-haspermission","text":"Checks if the current username has the specified permission. To check for the permission, supply the following parameter: Permission - The name of the permission to check The permission manager has the following built in permissions: admin edit create read Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userHasPermission ( \"admin\" ); if ( result ) MessageBox . show ( \"User Has Admin Permission!\" ); else MessageBox . show ( \"User Does Not Have Admin Permission!\" ); This can also be done with a list of permissions: Example 1 2 3 4 final var authManager = AuthManager . getInstance (); final boolean result = authManager . userHasPermissions ( new HashSet <>( Arrays . asList ( \"admin\" , \"edit\" ))); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" );","title":"Check If User Has Permission (hasPermission)"},{"location":"AuthSystem/AuthManager/#get-all-username-objects-getuserslist","text":"Retrieves a readonly immutable UserAccount object for each user account and returns the list as a HashSet. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < UserAccount > users = authManager . getUsersList ();","title":"Get All Username Objects (getUsersList)"},{"location":"AuthSystem/AuthManager/#get-list-of-all-usernames-getusernamelist","text":"Retrieves a list of the user names in the database. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < String > users = authManager . getUsernameList ();","title":"Get List Of All Usernames (getUsernameList)"},{"location":"AuthSystem/PermissionManager/","text":"Permission Manager Link Introduction Link Package Name: com.jgcomptech.tools.authz.PermissionManager The Permission Manager manages all role and user based permissions. Permissions have a hierarchy and thus if a permission is assigned to a user or role then all its child permissions are also assigned. The Permission Manager has the following built in permissions: admin edit create read Setup Link The Permission Manager is a singleton class and on first use is initialized automatically. The following code can be used to retrieve the instance: 1 final var manager = PermissionManager . getInstance (); Permission Methods Link Add New Custom Permission (addCustomPermission) Link Adds new permission with the specified name and parent name, disabled by default. To add a new custom permission, supply the following parameters: Name - The name of the permission to lookup Parent Name - The name of the parent permission Note If you want the new permission to not have a parent and want it to be root level then set the Parent Name to null or an empty string. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . addCustomPermission ( \"change_global_settings\" , \"admin\" ); Add And Enable New Custom Permission (addAndEnableCustomPermission) Link Adds new permission with the specified name and parent name, enabled by default. To add a new custom permission, supply the following parameters: Name - The name of the permission to lookup Parent Name - The name of the parent permission Note If you want the new permission to not have a parent and want it to be root level then set the Parent Name to null or an empty string. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . addAndEnableCustomPermission ( \"change_global_settings\" , \"admin\" ); Load Permissions (loadPermissions) Link Loading permissions enables or disables permissions in bulk. There is 3 ways of doing this, enable all, disable all or apply a user role's permissions. Enable All Permissions Link Parameter must be true. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( true ); Disable All Permissions Link Parameter must be false. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( false ); Enable/Disable Based On User Role Link When run all permissions are disabled and then the permissions assigned to the specified user role are enabled. Parameter must be the name of a user role. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( \"admin\" ); Remove Permission (removePermission) Link Removes the specified permission. To remove a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . removePermission ( \"admin\" ); Check If Permission Exists (doesPermissionExist) Link Checks if the specified permission exists. To check if a permission exists, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . doesPermissionExist ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Exists!\" ); else MessageBox . show ( \"Permission Not Found!\" ); Enable Permission (enablePermission) Link Enables the specified permission. To enable a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . enablePermission ( \"admin\" ); Disable Permission (disablePermission) Link Disables the specified permission. To disable a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . disablePermission ( \"admin\" ); Check If Permission Is Enabled (isPermissionEnabled) Link Checks if the specified permission is enabled. To check if a permission is enabled, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . isPermissionEnabled ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Is Enabled!\" ); else MessageBox . show ( \"Permission Is Disabled!\" ); Check If Permission Is Disabled (isPermissionDisabled) Link Checks if the specified permission is disabled. To check if a permission is disabled, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . isPermissionDisabled ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Is Disabled!\" ); else MessageBox . show ( \"Permission Is Enabled!\" ); Get List Of All Child Permissions (getPermissionChildren) Link Retrieves an unmodifiable list of all the specified permission's child permissions. To retrieve a list of all child permissions, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final HashSet < String > children = permissionsManager . getPermissionChildren ( \"admin\" ); Get List Of All Permissions (getPermissions) Link Retrieves an unmodifiable list of all permissions. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final Map < String , Permission > roles = permissionsManager . getPermissions (); Get List Of All Permission Names (getPermissionNames) Link Retrieves an unmodifiable list of names of all permissions. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final Set < String > names = permissionsManager . getPermissionNames (); Get Specific Permission (getPermission) Link Retrieves the specified permission. To retrieve a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final UserRole role = permissionsManager . getPermission ( \"admin\" );","title":"Permission Manager"},{"location":"AuthSystem/PermissionManager/#permission-manager","text":"","title":"Permission Manager"},{"location":"AuthSystem/PermissionManager/#introduction","text":"Package Name: com.jgcomptech.tools.authz.PermissionManager The Permission Manager manages all role and user based permissions. Permissions have a hierarchy and thus if a permission is assigned to a user or role then all its child permissions are also assigned. The Permission Manager has the following built in permissions: admin edit create read","title":"Introduction"},{"location":"AuthSystem/PermissionManager/#setup","text":"The Permission Manager is a singleton class and on first use is initialized automatically. The following code can be used to retrieve the instance: 1 final var manager = PermissionManager . getInstance ();","title":"Setup"},{"location":"AuthSystem/PermissionManager/#permission-methods","text":"","title":"Permission Methods"},{"location":"AuthSystem/PermissionManager/#add-new-custom-permission-addcustompermission","text":"Adds new permission with the specified name and parent name, disabled by default. To add a new custom permission, supply the following parameters: Name - The name of the permission to lookup Parent Name - The name of the parent permission Note If you want the new permission to not have a parent and want it to be root level then set the Parent Name to null or an empty string. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . addCustomPermission ( \"change_global_settings\" , \"admin\" );","title":"Add New Custom Permission (addCustomPermission)"},{"location":"AuthSystem/PermissionManager/#add-and-enable-new-custom-permission-addandenablecustompermission","text":"Adds new permission with the specified name and parent name, enabled by default. To add a new custom permission, supply the following parameters: Name - The name of the permission to lookup Parent Name - The name of the parent permission Note If you want the new permission to not have a parent and want it to be root level then set the Parent Name to null or an empty string. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . addAndEnableCustomPermission ( \"change_global_settings\" , \"admin\" );","title":"Add And Enable New Custom Permission (addAndEnableCustomPermission)"},{"location":"AuthSystem/PermissionManager/#load-permissions-loadpermissions","text":"Loading permissions enables or disables permissions in bulk. There is 3 ways of doing this, enable all, disable all or apply a user role's permissions.","title":"Load Permissions (loadPermissions)"},{"location":"AuthSystem/PermissionManager/#enable-all-permissions","text":"Parameter must be true. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( true );","title":"Enable All Permissions"},{"location":"AuthSystem/PermissionManager/#disable-all-permissions","text":"Parameter must be false. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( false );","title":"Disable All Permissions"},{"location":"AuthSystem/PermissionManager/#enabledisable-based-on-user-role","text":"When run all permissions are disabled and then the permissions assigned to the specified user role are enabled. Parameter must be the name of a user role. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . loadPermissions ( \"admin\" );","title":"Enable/Disable Based On User Role"},{"location":"AuthSystem/PermissionManager/#remove-permission-removepermission","text":"Removes the specified permission. To remove a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . removePermission ( \"admin\" );","title":"Remove Permission (removePermission)"},{"location":"AuthSystem/PermissionManager/#check-if-permission-exists-doespermissionexist","text":"Checks if the specified permission exists. To check if a permission exists, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . doesPermissionExist ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Exists!\" ); else MessageBox . show ( \"Permission Not Found!\" );","title":"Check If Permission Exists (doesPermissionExist)"},{"location":"AuthSystem/PermissionManager/#enable-permission-enablepermission","text":"Enables the specified permission. To enable a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . enablePermission ( \"admin\" );","title":"Enable Permission (enablePermission)"},{"location":"AuthSystem/PermissionManager/#disable-permission-disablepermission","text":"Disables the specified permission. To disable a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); permissionsManager . disablePermission ( \"admin\" );","title":"Disable Permission (disablePermission)"},{"location":"AuthSystem/PermissionManager/#check-if-permission-is-enabled-ispermissionenabled","text":"Checks if the specified permission is enabled. To check if a permission is enabled, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . isPermissionEnabled ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Is Enabled!\" ); else MessageBox . show ( \"Permission Is Disabled!\" );","title":"Check If Permission Is Enabled (isPermissionEnabled)"},{"location":"AuthSystem/PermissionManager/#check-if-permission-is-disabled-ispermissiondisabled","text":"Checks if the specified permission is disabled. To check if a permission is disabled, supply the following parameter: Name - The name of the permission to lookup Example 1 2 3 4 final var permissionsManager = PermissionManager . getInstance (); final var result = permissionsManager . isPermissionDisabled ( \"admin\" ); if ( result ) MessageBox . show ( \"Permission Is Disabled!\" ); else MessageBox . show ( \"Permission Is Enabled!\" );","title":"Check If Permission Is Disabled (isPermissionDisabled)"},{"location":"AuthSystem/PermissionManager/#get-list-of-all-child-permissions-getpermissionchildren","text":"Retrieves an unmodifiable list of all the specified permission's child permissions. To retrieve a list of all child permissions, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final HashSet < String > children = permissionsManager . getPermissionChildren ( \"admin\" );","title":"Get List Of All Child Permissions (getPermissionChildren)"},{"location":"AuthSystem/PermissionManager/#get-list-of-all-permissions-getpermissions","text":"Retrieves an unmodifiable list of all permissions. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final Map < String , Permission > roles = permissionsManager . getPermissions ();","title":"Get List Of All Permissions (getPermissions)"},{"location":"AuthSystem/PermissionManager/#get-list-of-all-permission-names-getpermissionnames","text":"Retrieves an unmodifiable list of names of all permissions. Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final Set < String > names = permissionsManager . getPermissionNames ();","title":"Get List Of All Permission Names (getPermissionNames)"},{"location":"AuthSystem/PermissionManager/#get-specific-permission-getpermission","text":"Retrieves the specified permission. To retrieve a permission, supply the following parameter: Name - The name of the permission to lookup Example 1 2 final var permissionsManager = PermissionManager . getInstance (); final UserRole role = permissionsManager . getPermission ( \"admin\" );","title":"Get Specific Permission (getPermission)"},{"location":"AuthSystem/SessionManager/","text":"Session Manager Link Introduction Link Package Name: com.jgcomptech.tools.authc.SessionManager Warning This class is embedded in the AuthManager , Subject , and UserManager classes and is not meant to be accessed directly except in advanced use cases. To access the AuthManager's embedded SessionManager instance use the following code: 1 2 final var authManager = AuthManager . getNewInstance ( db ); final var sessionManager = authManager . getSessionManager (); To access the UserManager's embedded SessionManager instance use the following code: 1 2 final var userManager = new UserManager ( db ); final var sessionManager = userManager . getSessionManager (); The Session Manager class contains all methods needed for managing login sessions to allow users to login to your application. This includes completing login via either using the UsernamePasswordToken or requesting credentials from the user via a login dialog. Setup Link The Session Manager is not a singleton class so a new instance needs to be initialized. Since the Session Manager is a low level class it also requires an instance of the User Manager in addition to the database instance. The following code can be used to create a new instance: Example 1 2 3 4 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var userManager = new UserManager ( db ); final var sessionManager = new SessionManager ( userManager ); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs. Session Explanation Link A login Session is a temporary connection established by a user with a login, until either the user or the application/service terminates the connection. The user must only provide credentials for authentication at the start of a login session. The user is then authorized to use some or all of the services offered by the application/service depending on the permissions assigned to the user. Within JUT there are two types of login sessions, single-user and multi-user. All of the following documentation will be separated into two sections one for each session type/context. Single-User Session Context Link Single-User sessions are meant for frontend login to an application. These sessions can either be initiated via a UsernamePasswordToken or via a login dialog. Only one user can be logged in at one time thus meaning only one session can be open at a time. Some of the methods that are part of the Session Manager can only be used under a Single-User context. Multi-User Session Context Link Multi-User sessions are meant for backend login to an application, usually via a remote client software. These sessions can only be initiated via a UsernamePasswordToken. Almost an unlimited amount of users can be logged in at one time and is only dependant on system resources and can be limited via the setMaxSessions method. Some of the methods that are part of the Session Manager can only be used under a Multi-User context. Single-Session Methods Link Get Logged-In Username (getLoggedInUsername) Link Returns the username of the currently logged in user under the single session context. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final String currentUsername = sessionManager . getLoggedInUsername (); Is Any User Logged-In (isUserLoggedIn) Link Checks if a user is currently logged in under the single-user context. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn (); if ( result ) MessageBox . show ( \"A user is logged-in!\" ); else MessageBox . show ( \"No user is logged-in!\" ); Is A Specific User Logged-In (isUserLoggedIn) Link Checks if the specified user is currently logged in under the single-user context. To check if a specific user is logged-in, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" ); Get Currently Logged-In User Session (getSession) Link Retrieves the current session for the specified username, under the single-user context. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session currentSession = sessionManager . getSession (); Get Specific User Session (getSession) Link Retrieves the current session for the specified username, under the single-user context. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session session = sessionManager . getSession ( \"admin\" ); Show Login Dialog (showLoginWindow) Link Shows the login dialog window to log a user into the single-user context. The method returns true if a user was logged in successfully. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . showLoginWindow ( true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); Login A Specific User (loginUser) Link Logs in a user, under the single-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Warning This method does not validate credentials and should not be used except in advanced use cases. A example case could be to login a user during unit testing. The method showLoginWindow should be used instead. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . loginUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); Logout Current Logged-In User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in. Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser (); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Logout Specific User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameter: Username - The username of the account to logout Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Get Currently Logged-In User's UserRole (getLoggedInUserRole) Link Retrieves the user role of the currently logged in user under the single user context. If no user is currently logged-in then this method will return null. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final UserRole result = sessionManager . getLoggedInUserRole (); Check If An Admin User Is Logged-In (isAdminLoggedIn) Link Checks if an admin user is currently logged in under the single user context. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isAdminLoggedIn (); if ( result ) MessageBox . show ( \"An Admin user is logged-in!\" ); else MessageBox . show ( \"An Admin user is not logged-in!\" ); Get Admin Login Override (getAdminOverride) Link Requests an admin user to authenticate to override permissions by showing the login dialog using the single session context. During this process the admin user is not actually logged-in, instead just their username, password and user role is verified. Returns true if admin override succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . getAdminOverride (); if ( result ) MessageBox . show ( \"Admin override succedded!\" ); else MessageBox . show ( \"Admin override failed!\" ); Get User Login Verification (getUserVerification) Link Requests that the currently logged in username to re-login using the single session context. During this process the user is not actually logged-in again, instead just their username and password is verified. Returns true if the user verification succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . getUserVerification (); if ( result ) MessageBox . show ( \"User verification succedded!\" ); else MessageBox . show ( \"User verification failed!\" ); Require That Admin Is Logged-In (requireAdmin) Link Checks that the logged-in user, under the single session context, is an admin and if not, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" ); Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin) Link Checks that the logged-in user, under the single session context, is an admin, if true, prompts the admin to re-login and if false, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" ); Multi-Session Methods Link Is A Specific User Logged-In (isUserLoggedIn) Link Checks if the specified user is currently logged in under the multi-user context. To check if a specific user is logged-in, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn ( \"admin\" , true ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" ); Get Max Allowed Sessions (getMaxSessions) Link Retrieves the maximum number of allowed sessions, under the multi session context, before login is disabled. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final int result = sessionManager . getMaxSessions (); MessageBox . show ( \"The max number of allowed sessions is \" + result + '!' ); Set Max Allowed Sessions (setMaxSessions) Link Sets the maximum number of allowed sessions, under the multi session context, before login is disabled. To disable the limit set the value to a negative number. To set the maximum number of allowed sessions, supply the following parameter: value - The number of allowed sessions to set Example 1 2 3 4 5 final var sessionManager = new SessionManager ( userManager ); //Set max sessions to 30. sessionManager . setMaxSessions ( 30 ); //Block all session creation by setting to 0 sessionManager . setMaxSessions ( 0 ); Note Setting this value to a negative number will disable the limit because a negative amount of sessions can never be created. When the SessionManager is initialized the value is initially set to -1. Get Session Count (getSessionsCount) Link Retrieves the current number of logged in sessions under the multi-user context. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final int result = sessionManager . getSessionsCount (); MessageBox . show ( \"The max number of logged-in sessions is \" + result + '!' ); Get All Sessions (getSessions) Link Retrieves the current logged in sessions as a HashMap under the multi session context. The returned HashMap key is the session username and the value is the related Session object. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final Map < String , Session > sessions = sessionManager . getSessions (); MessageBox . show ( \"The max number of logged-in sessions is \" + sessions . size () + '!' ); Get Specific User Session (getSession) Link Retrieves the current session for the specified username, under the multi-user context. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session session = sessionManager . getSession ( \"admin\" , true ); Login A Specific User (loginUser) Link Logs in a user, under the multi-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Warning This method does not validate credentials and should be used carefully. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). An example is listed below on how to implement this. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); This example adds password checking to verify credentials before login: Example 1 2 3 4 5 6 7 final var userManager = new UserManager ( db ); final var sessionManager = new SessionManager ( userManager ); if ( userManager . checkPasswordMatches ( \"admin\" , \"1234\" )) { final boolean result = sessionManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); } else MessageBox . show ( \"User login failed!\" ); Logout Specific User (logout) Link Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameters: Username - The username of the account to logout true - The true boolean is required to operate under the multi-user context Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" ); Other Methods Link Is New Session Allowed (isNewSessionAllowed) Link Checks if creation of a new session for the specified username is allowed under the specified context. This method checks to see if the specified user is already logged-in and if the second parameter is true checks to see if the max sessions limit has been reached. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true/false - The true for the multi-user context, false for the single-user context Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isNewSessionAllowed ( \"admin\" , true ); if ( result ) MessageBox . show ( \"New User Session Is Allowed For Admin!\" ); else MessageBox . show ( \"New User Session Is Not Allowed For Admin!\" );","title":"Session Manager"},{"location":"AuthSystem/SessionManager/#session-manager","text":"","title":"Session Manager"},{"location":"AuthSystem/SessionManager/#introduction","text":"Package Name: com.jgcomptech.tools.authc.SessionManager Warning This class is embedded in the AuthManager , Subject , and UserManager classes and is not meant to be accessed directly except in advanced use cases. To access the AuthManager's embedded SessionManager instance use the following code: 1 2 final var authManager = AuthManager . getNewInstance ( db ); final var sessionManager = authManager . getSessionManager (); To access the UserManager's embedded SessionManager instance use the following code: 1 2 final var userManager = new UserManager ( db ); final var sessionManager = userManager . getSessionManager (); The Session Manager class contains all methods needed for managing login sessions to allow users to login to your application. This includes completing login via either using the UsernamePasswordToken or requesting credentials from the user via a login dialog.","title":"Introduction"},{"location":"AuthSystem/SessionManager/#setup","text":"The Session Manager is not a singleton class so a new instance needs to be initialized. Since the Session Manager is a low level class it also requires an instance of the User Manager in addition to the database instance. The following code can be used to create a new instance: Example 1 2 3 4 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var userManager = new UserManager ( db ); final var sessionManager = new SessionManager ( userManager ); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs.","title":"Setup"},{"location":"AuthSystem/SessionManager/#session-explanation","text":"A login Session is a temporary connection established by a user with a login, until either the user or the application/service terminates the connection. The user must only provide credentials for authentication at the start of a login session. The user is then authorized to use some or all of the services offered by the application/service depending on the permissions assigned to the user. Within JUT there are two types of login sessions, single-user and multi-user. All of the following documentation will be separated into two sections one for each session type/context.","title":"Session Explanation"},{"location":"AuthSystem/SessionManager/#single-user-session-context","text":"Single-User sessions are meant for frontend login to an application. These sessions can either be initiated via a UsernamePasswordToken or via a login dialog. Only one user can be logged in at one time thus meaning only one session can be open at a time. Some of the methods that are part of the Session Manager can only be used under a Single-User context.","title":"Single-User Session Context"},{"location":"AuthSystem/SessionManager/#multi-user-session-context","text":"Multi-User sessions are meant for backend login to an application, usually via a remote client software. These sessions can only be initiated via a UsernamePasswordToken. Almost an unlimited amount of users can be logged in at one time and is only dependant on system resources and can be limited via the setMaxSessions method. Some of the methods that are part of the Session Manager can only be used under a Multi-User context.","title":"Multi-User Session Context"},{"location":"AuthSystem/SessionManager/#single-session-methods","text":"","title":"Single-Session Methods"},{"location":"AuthSystem/SessionManager/#get-logged-in-username-getloggedinusername","text":"Returns the username of the currently logged in user under the single session context. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final String currentUsername = sessionManager . getLoggedInUsername ();","title":"Get Logged-In Username (getLoggedInUsername)"},{"location":"AuthSystem/SessionManager/#is-any-user-logged-in-isuserloggedin","text":"Checks if a user is currently logged in under the single-user context. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn (); if ( result ) MessageBox . show ( \"A user is logged-in!\" ); else MessageBox . show ( \"No user is logged-in!\" );","title":"Is Any User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/SessionManager/#is-a-specific-user-logged-in-isuserloggedin","text":"Checks if the specified user is currently logged in under the single-user context. To check if a specific user is logged-in, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" );","title":"Is A Specific User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/SessionManager/#get-currently-logged-in-user-session-getsession","text":"Retrieves the current session for the specified username, under the single-user context. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session currentSession = sessionManager . getSession ();","title":"Get Currently Logged-In User Session (getSession)"},{"location":"AuthSystem/SessionManager/#get-specific-user-session-getsession","text":"Retrieves the current session for the specified username, under the single-user context. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session session = sessionManager . getSession ( \"admin\" );","title":"Get Specific User Session (getSession)"},{"location":"AuthSystem/SessionManager/#show-login-dialog-showloginwindow","text":"Shows the login dialog window to log a user into the single-user context. The method returns true if a user was logged in successfully. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . showLoginWindow ( true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" );","title":"Show Login Dialog (showLoginWindow)"},{"location":"AuthSystem/SessionManager/#login-a-specific-user-loginuser","text":"Logs in a user, under the single-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameter: Username - The username of the account to lookup Warning This method does not validate credentials and should not be used except in advanced use cases. A example case could be to login a user during unit testing. The method showLoginWindow should be used instead. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . loginUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" );","title":"Login A Specific User (loginUser)"},{"location":"AuthSystem/SessionManager/#logout-current-logged-in-user-logout","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in. Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser (); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Current Logged-In User (logout)"},{"location":"AuthSystem/SessionManager/#logout-specific-user-logout","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameter: Username - The username of the account to logout Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Specific User (logout)"},{"location":"AuthSystem/SessionManager/#get-currently-logged-in-users-userrole-getloggedinuserrole","text":"Retrieves the user role of the currently logged in user under the single user context. If no user is currently logged-in then this method will return null. Example 1 2 final var sessionManager = new SessionManager ( userManager ); final UserRole result = sessionManager . getLoggedInUserRole ();","title":"Get Currently Logged-In User's UserRole (getLoggedInUserRole)"},{"location":"AuthSystem/SessionManager/#check-if-an-admin-user-is-logged-in-isadminloggedin","text":"Checks if an admin user is currently logged in under the single user context. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isAdminLoggedIn (); if ( result ) MessageBox . show ( \"An Admin user is logged-in!\" ); else MessageBox . show ( \"An Admin user is not logged-in!\" );","title":"Check If An Admin User Is Logged-In (isAdminLoggedIn)"},{"location":"AuthSystem/SessionManager/#get-admin-login-override-getadminoverride","text":"Requests an admin user to authenticate to override permissions by showing the login dialog using the single session context. During this process the admin user is not actually logged-in, instead just their username, password and user role is verified. Returns true if admin override succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . getAdminOverride (); if ( result ) MessageBox . show ( \"Admin override succedded!\" ); else MessageBox . show ( \"Admin override failed!\" );","title":"Get Admin Login Override (getAdminOverride)"},{"location":"AuthSystem/SessionManager/#get-user-login-verification-getuserverification","text":"Requests that the currently logged in username to re-login using the single session context. During this process the user is not actually logged-in again, instead just their username and password is verified. Returns true if the user verification succeeded and false if the cancel button was pressed or if override failed. Fires either the sessionLoginSuccess or the sessionLoginFailure event allowing the getUser method to be called by the assigned EventHandler. If the user does not exist, getUser will return null. To show the login dialog, supply the following parameter: true/false - If true, if during the login process an error occurs the login dialog will show again listing the error text above the username field. If false, if during the login process an error occurs the entire method will return false. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . getUserVerification (); if ( result ) MessageBox . show ( \"User verification succedded!\" ); else MessageBox . show ( \"User verification failed!\" );","title":"Get User Login Verification (getUserVerification)"},{"location":"AuthSystem/SessionManager/#require-that-admin-is-logged-in-requireadmin","text":"Checks that the logged-in user, under the single session context, is an admin and if not, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" );","title":"Require That Admin Is Logged-In (requireAdmin)"},{"location":"AuthSystem/SessionManager/#require-that-admin-is-logged-in-and-request-verification-requireandverifyadmin","text":"Checks that the logged-in user, under the single session context, is an admin, if true, prompts the admin to re-login and if false, requests an admin override. During this process the user is not actually logged-in again, instead their username, password and user role is just verified. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . requireAdmin (); if ( result ) MessageBox . show ( \"Admin check passed!\" ); else MessageBox . show ( \"Admin check failed!\" );","title":"Require That Admin Is Logged-In And Request Verification (requireAndVerifyAdmin)"},{"location":"AuthSystem/SessionManager/#multi-session-methods","text":"","title":"Multi-Session Methods"},{"location":"AuthSystem/SessionManager/#is-a-specific-user-logged-in-isuserloggedin_1","text":"Checks if the specified user is currently logged in under the multi-user context. To check if a specific user is logged-in, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isUserLoggedIn ( \"admin\" , true ); if ( result ) MessageBox . show ( \"Admin user is logged-in!\" ); else MessageBox . show ( \"Admin user is not logged-in!\" );","title":"Is A Specific User Logged-In (isUserLoggedIn)"},{"location":"AuthSystem/SessionManager/#get-max-allowed-sessions-getmaxsessions","text":"Retrieves the maximum number of allowed sessions, under the multi session context, before login is disabled. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final int result = sessionManager . getMaxSessions (); MessageBox . show ( \"The max number of allowed sessions is \" + result + '!' );","title":"Get Max Allowed Sessions (getMaxSessions)"},{"location":"AuthSystem/SessionManager/#set-max-allowed-sessions-setmaxsessions","text":"Sets the maximum number of allowed sessions, under the multi session context, before login is disabled. To disable the limit set the value to a negative number. To set the maximum number of allowed sessions, supply the following parameter: value - The number of allowed sessions to set Example 1 2 3 4 5 final var sessionManager = new SessionManager ( userManager ); //Set max sessions to 30. sessionManager . setMaxSessions ( 30 ); //Block all session creation by setting to 0 sessionManager . setMaxSessions ( 0 ); Note Setting this value to a negative number will disable the limit because a negative amount of sessions can never be created. When the SessionManager is initialized the value is initially set to -1.","title":"Set Max Allowed Sessions (setMaxSessions)"},{"location":"AuthSystem/SessionManager/#get-session-count-getsessionscount","text":"Retrieves the current number of logged in sessions under the multi-user context. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final int result = sessionManager . getSessionsCount (); MessageBox . show ( \"The max number of logged-in sessions is \" + result + '!' );","title":"Get Session Count (getSessionsCount)"},{"location":"AuthSystem/SessionManager/#get-all-sessions-getsessions","text":"Retrieves the current logged in sessions as a HashMap under the multi session context. The returned HashMap key is the session username and the value is the related Session object. Example 1 2 3 final var sessionManager = new SessionManager ( userManager ); final Map < String , Session > sessions = sessionManager . getSessions (); MessageBox . show ( \"The max number of logged-in sessions is \" + sessions . size () + '!' );","title":"Get All Sessions (getSessions)"},{"location":"AuthSystem/SessionManager/#get-specific-user-session-getsession_1","text":"Retrieves the current session for the specified username, under the multi-user context. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Example 1 2 final var sessionManager = new SessionManager ( userManager ); final Session session = sessionManager . getSession ( \"admin\" , true );","title":"Get Specific User Session (getSession)"},{"location":"AuthSystem/SessionManager/#login-a-specific-user-loginuser_1","text":"Logs in a user, under the multi-user context, with the specified username, without checking for valid credentials. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true - The true boolean is required to operate under the multi-user context Warning This method does not validate credentials and should be used carefully. With this method the user is immediately logged in as long as the user exists and other checks pass (account unlocked, user role enabled and password not expired). An example is listed below on how to implement this. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); This example adds password checking to verify credentials before login: Example 1 2 3 4 5 6 7 final var userManager = new UserManager ( db ); final var sessionManager = new SessionManager ( userManager ); if ( userManager . checkPasswordMatches ( \"admin\" , \"1234\" )) { final boolean result = sessionManager . loginUser ( \"admin\" , true ); if ( result ) MessageBox . show ( \"User was logged-in successfully!\" ); else MessageBox . show ( \"User login failed!\" ); } else MessageBox . show ( \"User login failed!\" );","title":"Login A Specific User (loginUser)"},{"location":"AuthSystem/SessionManager/#logout-specific-user-logout_1","text":"Logs out the specified user from the single session context and clears any set permissions. This method will return false if no user is currently logged-in or if the specified user does not exist. To logout a specific user, supply the following parameters: Username - The username of the account to logout true - The true boolean is required to operate under the multi-user context Caution If the user was deleted from the database while logged in, then the getUser event method that is accessible from the assigned event handler will return null. Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . logoutUser ( \"admin\" ); if ( result ) MessageBox . show ( \"User was logged-out successfully!\" ); else MessageBox . show ( \"User logout failed!\" );","title":"Logout Specific User (logout)"},{"location":"AuthSystem/SessionManager/#other-methods","text":"","title":"Other Methods"},{"location":"AuthSystem/SessionManager/#is-new-session-allowed-isnewsessionallowed","text":"Checks if creation of a new session for the specified username is allowed under the specified context. This method checks to see if the specified user is already logged-in and if the second parameter is true checks to see if the max sessions limit has been reached. To retrieve a specific user session, supply the following parameters: Username - The username of the account to lookup true/false - The true for the multi-user context, false for the single-user context Example 1 2 3 4 final var sessionManager = new SessionManager ( userManager ); final boolean result = sessionManager . isNewSessionAllowed ( \"admin\" , true ); if ( result ) MessageBox . show ( \"New User Session Is Allowed For Admin!\" ); else MessageBox . show ( \"New User Session Is Not Allowed For Admin!\" );","title":"Is New Session Allowed (isNewSessionAllowed)"},{"location":"AuthSystem/Subject/","text":"Subject Link Introduction Link Package Name: com.jgcomptech.tools.authc.Subject A Subject is just fancy security term that basically means a security-specific \u2018view\u2019 of an application user. In JUT the Subject object handles the management of one specific user account. The subject allows management of the user settings, role, permissions, and sessions. Setup Link A Subject object instance can be created by providing an instance of the Auth Manager or by calling the getSubject method on the Auth Manager. Multiple subject instances can exist but multiple instances are only useful if using the multi-user context. Create New Instance Via AuthManager Link 1 2 final var manager = AuthManager . getInstance (); final Subject subject = manager . getSubject (); Create New Instance Via New Subject Object Link 1 2 final var manager = AuthManager . getInstance (); final Subject subject = new Subject ( manager ); General Subject Methods Link Login User (login) Link A new instance of a subject is considered anonymous until a user is logged-in. A subject login requires a UsernamePasswordToken to pass in the user's credentials. For security reasons, passwords supplied to the UsernamePasswordToken must be converted to a char array. There is 4 methods supplied for logging in a user: Login Under Single-User Context Link To login a user, supply the following parameter: Token - The UsernamePasswordToken containing user credentials Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( token ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" ); Login Under Either Context Link To login a user, supply the following parameters: Token - The UsernamePasswordToken containing user credentials True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( token , true ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" ); Login Under Single-User Context With Previous Token Link For previous token to be saved, setRememberMe needs to be set to true during token creation. Also if no token is saved CredentialsException will be thrown. To login a user, no parameters are needed. Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login (); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" ); Login Under Either Context With Previous Token Link For previous token to be saved, setRememberMe needs to be set to true during token creation. Also if no token is saved CredentialsException will be thrown. To login a user, supply the following parameters: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( true ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" ); Logout User (logout) Link When logging out a user, unless the setRememberMe is set to true during the token creation, the subject username and token are cleared thus making the subject anonymous again. This method will return false if the user is not already logged-in. There is 4 methods supplied for logging out a user: Logout Under Single-User Context Link To logout a user, no parameters are needed. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . logout (); if ( result ) MessageBox . show ( \"Logout Succeeded!\" ); else MessageBox . show ( \"Logout Failed!\" ); Logout Under Either Context Link To logout a user, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . login ( true ); if ( result ) MessageBox . show ( \"Logout Succeeded!\" ); else MessageBox . show ( \"Logout Failed!\" ); Get Last Session Duration Time (getLastSessionDuration) Link When a session is opened a timer starts recording the duration the session was open. This duration can be retrieved after a session is closed with the subject. There is 3 methods supplied for returning this value: Return Duration Object Link Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Duration duration = subject . getLastSessionDuration (); Return Text String With Milliseconds Link Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final String duration = subject . getLastSessionDurationStringFull (); Return Text String Without Milliseconds Link Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final String duration = subject . getLastSessionDurationString (); Check If Subject Is Anonymous (isAnonymous) Link Checks if the subject is anonymous. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAnonymous (); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" ); Check If Subject Is Authenticated Under Single-User Context (isAuthenticated) Link Checks if the subject is anonymous. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAuthenticated (); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" ); Check If Subject Is Authenticated Under Either Context (isAuthenticated) Link Checks if the subject is anonymous. To check status, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAuthenticated ( true ); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" ); Get Current Logged-In Session Under Single-User Context (getSession) Link Retrieves the current logged in session or returns null if no session is open. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Session session = subject . getSession (); Get Current Logged-In Session Under Either Context (getSession) Link Retrieves the current logged in session or returns null if no session is open. To retrieve the current session, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Session session = subject . getSession ( true ); Check If Username And Token Are Remembered (isRemembered) Link Checks to see if the username and token are set to be saved after logout. For credentials to be saved, setRememberMe needs to be set to true during token creation. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isRemembered (); if ( result ) MessageBox . show ( \"Subject Credentials Is Remembered!\" ); else MessageBox . show ( \"Subject Credentials Is Not Remembered!\" ); User Management Methods Link Get Current Username (getUsername) Link Retrieves the current username. Returns null if the subject is anonymous. Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . getUsername (); MessageBox . show ( \"The Current Username Is \" + result + '!' ); Set New Password (setPassword) Link Sets a new password for the current user. To set a new password, supply the following parameter: Password - The new password to set Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); subject . setPassword ( \"pass\" ); Get Current User Role (getUserRole) Link Retrieves the UserRole object assigned to the current user. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final UserRole role = subject . getUserRole (); Set User Role (setUserRole) Link Sets the user role assigned to the specified user. To set the user role, supply the following parameter: User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); subject . setUserRole ( UserRoleManager . SystemUserRoles . ADMIN ); Check If User Has Permission (hasPermission) Link Checks if the current username has the specified permission. To check for the permission, supply the following parameter: Permission - The name of the permission to check The permission manager has the following built in permissions: admin edit create read Single Permission Link Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . hasPermission ( \"admin\" ); if ( result ) MessageBox . show ( \"User Has Admin Permission!\" ); else MessageBox . show ( \"User Does Not Have Admin Permission!\" ); HashSet Of Permissions Link Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final HashSet < String > list = new HashSet <>( Arrays . asList ( \"admin\" , \"edit\" )); final boolean result = subject . hasPermissions ( list ); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" ); Comma Separated list Of Permissions: Link Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . hasPermissions ( \"admin\" , \"edit\" ); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" ); Get Account Creation Date (getUserCreationDate) Link Returns the date and time the user was initially created. There is two methods to retrieving the user creation date. The date can either be returned as a LocalDateTime object or as a formatted string. LocalDateTime Object Link Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = subject . getUserCreationDate (); MessageBox . show ( \"Account Was Created On \" + result . format ( formatter )); Formatted String Object Link To retrieve the user creation date, supply the following parameter: Format - The string that represents the format to return the date Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final String result = subject . getUserCreationDate ( \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Account Was Created On \" + result ); Check If User Is Locked (isUserLocked) Link A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isUserLocked (); if ( result ) MessageBox . show ( \"Admin Account Is Locked!\" ); else MessageBox . show ( \"Admin Account Is Unlocked!\" ); Lock/Unlock A User (lockUser and unlockUser) Link A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); //Lock The Account subject . lockUser (); //Unlock The Account subject . unlockUser (); Check If Password Is Expired (isPasswordExpired) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isPasswordExpired (); if ( result ) MessageBox . show ( \"Admin Account Password Is Expired!\" ); else MessageBox . show ( \"Admin Account Password Is Not Expired!\" ); Check If Password Has Expiration Date (isPasswordSetToExpire) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isPasswordSetToExpire (); if ( result ) MessageBox . show ( \"Admin Account Password Has An Expiration Date!\" ); else MessageBox . show ( \"Admin Account Password Does Not Have An Expiration Date!\" ); Get Password Expiration Date (getPasswordExpirationDate) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. There is two methods to retrieving the password expiration date. The date can either be returned as a LocalDateTime object or as a formatted string. Note If the expiration date has been disabled or was never enabled this method will still return an expiration date. For logistical database reasons a date still has to be set. So the date will be set to 1000 years after the user account was created or 1000 years after the date when the password expiration date was last disabled. This number can be updated if any bugs occur but it seems like 1000 years is far enough in the future to not cause any problems. LocalDateTime Object Link Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = subject . getPasswordExpirationDate (); MessageBox . show ( \"Admin Account Password Expires At \" + result . format ( formatter )); Formatted String Object Link To retrieve the password expiration date, supply the following parameter: Format - The string that represents the format to return the date Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final String result = subject . getPasswordExpirationDate ( \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result ); Set Password Expiration Date (setPasswordExpirationDate) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameter: Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var subject = AuthManager . getInstance (). getSubject (); //Sets the date to now subject . setPasswordExpirationDate ( LocalDateTime . now ()); //Sets the date to 30 days from today subject . setPasswordExpirationDate ( LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am subject . setPasswordExpirationDate ( LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am subject . setPasswordExpirationDate ( LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); subject . setPasswordExpirationDate ( LocalDateTime . parse ( str , formatter )); Disable Password Expiration (disablePasswordExpiration) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); authManager . disablePasswordExpiration (); Check If Password Matches (checkPasswordMatches) Link This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameter: Password - The password to verify Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . checkPasswordMatches ( \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" );","title":"Subject"},{"location":"AuthSystem/Subject/#subject","text":"","title":"Subject"},{"location":"AuthSystem/Subject/#introduction","text":"Package Name: com.jgcomptech.tools.authc.Subject A Subject is just fancy security term that basically means a security-specific \u2018view\u2019 of an application user. In JUT the Subject object handles the management of one specific user account. The subject allows management of the user settings, role, permissions, and sessions.","title":"Introduction"},{"location":"AuthSystem/Subject/#setup","text":"A Subject object instance can be created by providing an instance of the Auth Manager or by calling the getSubject method on the Auth Manager. Multiple subject instances can exist but multiple instances are only useful if using the multi-user context.","title":"Setup"},{"location":"AuthSystem/Subject/#create-new-instance-via-authmanager","text":"1 2 final var manager = AuthManager . getInstance (); final Subject subject = manager . getSubject ();","title":"Create New Instance Via AuthManager"},{"location":"AuthSystem/Subject/#create-new-instance-via-new-subject-object","text":"1 2 final var manager = AuthManager . getInstance (); final Subject subject = new Subject ( manager );","title":"Create New Instance Via New Subject Object"},{"location":"AuthSystem/Subject/#general-subject-methods","text":"","title":"General Subject Methods"},{"location":"AuthSystem/Subject/#login-user-login","text":"A new instance of a subject is considered anonymous until a user is logged-in. A subject login requires a UsernamePasswordToken to pass in the user's credentials. For security reasons, passwords supplied to the UsernamePasswordToken must be converted to a char array. There is 4 methods supplied for logging in a user:","title":"Login User (login)"},{"location":"AuthSystem/Subject/#login-under-single-user-context","text":"To login a user, supply the following parameter: Token - The UsernamePasswordToken containing user credentials Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( token ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" );","title":"Login Under Single-User Context"},{"location":"AuthSystem/Subject/#login-under-either-context","text":"To login a user, supply the following parameters: Token - The UsernamePasswordToken containing user credentials True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( token , true ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" );","title":"Login Under Either Context"},{"location":"AuthSystem/Subject/#login-under-single-user-context-with-previous-token","text":"For previous token to be saved, setRememberMe needs to be set to true during token creation. Also if no token is saved CredentialsException will be thrown. To login a user, no parameters are needed. Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login (); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" );","title":"Login Under Single-User Context With Previous Token"},{"location":"AuthSystem/Subject/#login-under-either-context-with-previous-token","text":"For previous token to be saved, setRememberMe needs to be set to true during token creation. Also if no token is saved CredentialsException will be thrown. To login a user, supply the following parameters: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final var token = new UsernamePasswordToken ( \"admin\" , \"1234\" . toCharArray ()); final boolean result = subject . login ( true ); if ( result ) MessageBox . show ( \"Login Succeeded!\" ); else MessageBox . show ( \"Login Failed!\" );","title":"Login Under Either Context With Previous Token"},{"location":"AuthSystem/Subject/#logout-user-logout","text":"When logging out a user, unless the setRememberMe is set to true during the token creation, the subject username and token are cleared thus making the subject anonymous again. This method will return false if the user is not already logged-in. There is 4 methods supplied for logging out a user:","title":"Logout User (logout)"},{"location":"AuthSystem/Subject/#logout-under-single-user-context","text":"To logout a user, no parameters are needed. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . logout (); if ( result ) MessageBox . show ( \"Logout Succeeded!\" ); else MessageBox . show ( \"Logout Failed!\" );","title":"Logout Under Single-User Context"},{"location":"AuthSystem/Subject/#logout-under-either-context","text":"To logout a user, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . login ( true ); if ( result ) MessageBox . show ( \"Logout Succeeded!\" ); else MessageBox . show ( \"Logout Failed!\" );","title":"Logout Under Either Context"},{"location":"AuthSystem/Subject/#get-last-session-duration-time-getlastsessionduration","text":"When a session is opened a timer starts recording the duration the session was open. This duration can be retrieved after a session is closed with the subject. There is 3 methods supplied for returning this value:","title":"Get Last Session Duration Time (getLastSessionDuration)"},{"location":"AuthSystem/Subject/#return-duration-object","text":"Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Duration duration = subject . getLastSessionDuration ();","title":"Return Duration Object"},{"location":"AuthSystem/Subject/#return-text-string-with-milliseconds","text":"Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final String duration = subject . getLastSessionDurationStringFull ();","title":"Return Text String With Milliseconds"},{"location":"AuthSystem/Subject/#return-text-string-without-milliseconds","text":"Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final String duration = subject . getLastSessionDurationString ();","title":"Return Text String Without Milliseconds"},{"location":"AuthSystem/Subject/#check-if-subject-is-anonymous-isanonymous","text":"Checks if the subject is anonymous. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAnonymous (); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" );","title":"Check If Subject Is Anonymous (isAnonymous)"},{"location":"AuthSystem/Subject/#check-if-subject-is-authenticated-under-single-user-context-isauthenticated","text":"Checks if the subject is anonymous. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAuthenticated (); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" );","title":"Check If Subject Is Authenticated Under Single-User Context (isAuthenticated)"},{"location":"AuthSystem/Subject/#check-if-subject-is-authenticated-under-either-context-isauthenticated","text":"Checks if the subject is anonymous. To check status, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isAuthenticated ( true ); if ( result ) MessageBox . show ( \"Subject Is Anonymous!\" ); else MessageBox . show ( \"Subject Is Not Anonymous!\" );","title":"Check If Subject Is Authenticated Under Either Context (isAuthenticated)"},{"location":"AuthSystem/Subject/#get-current-logged-in-session-under-single-user-context-getsession","text":"Retrieves the current logged in session or returns null if no session is open. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Session session = subject . getSession ();","title":"Get Current Logged-In Session Under Single-User Context (getSession)"},{"location":"AuthSystem/Subject/#get-current-logged-in-session-under-either-context-getsession","text":"Retrieves the current logged in session or returns null if no session is open. To retrieve the current session, supply the following parameter: True/False - If true, login occurs under the Multi-User Context, if false, Single-User Context Multi-User Context Example: Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final Session session = subject . getSession ( true );","title":"Get Current Logged-In Session Under Either Context (getSession)"},{"location":"AuthSystem/Subject/#check-if-username-and-token-are-remembered-isremembered","text":"Checks to see if the username and token are set to be saved after logout. For credentials to be saved, setRememberMe needs to be set to true during token creation. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isRemembered (); if ( result ) MessageBox . show ( \"Subject Credentials Is Remembered!\" ); else MessageBox . show ( \"Subject Credentials Is Not Remembered!\" );","title":"Check If Username And Token Are Remembered (isRemembered)"},{"location":"AuthSystem/Subject/#user-management-methods","text":"","title":"User Management Methods"},{"location":"AuthSystem/Subject/#get-current-username-getusername","text":"Retrieves the current username. Returns null if the subject is anonymous. Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . getUsername (); MessageBox . show ( \"The Current Username Is \" + result + '!' );","title":"Get Current Username (getUsername)"},{"location":"AuthSystem/Subject/#set-new-password-setpassword","text":"Sets a new password for the current user. To set a new password, supply the following parameter: Password - The new password to set Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); subject . setPassword ( \"pass\" );","title":"Set New Password (setPassword)"},{"location":"AuthSystem/Subject/#get-current-user-role-getuserrole","text":"Retrieves the UserRole object assigned to the current user. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); final UserRole role = subject . getUserRole ();","title":"Get Current User Role (getUserRole)"},{"location":"AuthSystem/Subject/#set-user-role-setuserrole","text":"Sets the user role assigned to the specified user. To set the user role, supply the following parameter: User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); subject . setUserRole ( UserRoleManager . SystemUserRoles . ADMIN );","title":"Set User Role (setUserRole)"},{"location":"AuthSystem/Subject/#check-if-user-has-permission-haspermission","text":"Checks if the current username has the specified permission. To check for the permission, supply the following parameter: Permission - The name of the permission to check The permission manager has the following built in permissions: admin edit create read","title":"Check If User Has Permission (hasPermission)"},{"location":"AuthSystem/Subject/#single-permission","text":"Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . hasPermission ( \"admin\" ); if ( result ) MessageBox . show ( \"User Has Admin Permission!\" ); else MessageBox . show ( \"User Does Not Have Admin Permission!\" );","title":"Single Permission"},{"location":"AuthSystem/Subject/#hashset-of-permissions","text":"Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); final HashSet < String > list = new HashSet <>( Arrays . asList ( \"admin\" , \"edit\" )); final boolean result = subject . hasPermissions ( list ); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" );","title":"HashSet Of Permissions"},{"location":"AuthSystem/Subject/#comma-separated-list-of-permissions","text":"Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . hasPermissions ( \"admin\" , \"edit\" ); if ( result ) MessageBox . show ( \"User Has Specified Permissions!\" ); else MessageBox . show ( \"User Does Not Have Specified Permissions!\" );","title":"Comma Separated list Of Permissions:"},{"location":"AuthSystem/Subject/#get-account-creation-date-getusercreationdate","text":"Returns the date and time the user was initially created. There is two methods to retrieving the user creation date. The date can either be returned as a LocalDateTime object or as a formatted string.","title":"Get Account Creation Date (getUserCreationDate)"},{"location":"AuthSystem/Subject/#localdatetime-object","text":"Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = subject . getUserCreationDate (); MessageBox . show ( \"Account Was Created On \" + result . format ( formatter ));","title":"LocalDateTime Object"},{"location":"AuthSystem/Subject/#formatted-string-object","text":"To retrieve the user creation date, supply the following parameter: Format - The string that represents the format to return the date Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final String result = subject . getUserCreationDate ( \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Account Was Created On \" + result );","title":"Formatted String Object"},{"location":"AuthSystem/Subject/#check-if-user-is-locked-isuserlocked","text":"A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isUserLocked (); if ( result ) MessageBox . show ( \"Admin Account Is Locked!\" ); else MessageBox . show ( \"Admin Account Is Unlocked!\" );","title":"Check If User Is Locked (isUserLocked)"},{"location":"AuthSystem/Subject/#lockunlock-a-user-lockuser-and-unlockuser","text":"A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. Example 1 2 3 4 5 final var subject = AuthManager . getInstance (). getSubject (); //Lock The Account subject . lockUser (); //Unlock The Account subject . unlockUser ();","title":"Lock/Unlock A User (lockUser and unlockUser)"},{"location":"AuthSystem/Subject/#check-if-password-is-expired-ispasswordexpired","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isPasswordExpired (); if ( result ) MessageBox . show ( \"Admin Account Password Is Expired!\" ); else MessageBox . show ( \"Admin Account Password Is Not Expired!\" );","title":"Check If Password Is Expired (isPasswordExpired)"},{"location":"AuthSystem/Subject/#check-if-password-has-expiration-date-ispasswordsettoexpire","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . isPasswordSetToExpire (); if ( result ) MessageBox . show ( \"Admin Account Password Has An Expiration Date!\" ); else MessageBox . show ( \"Admin Account Password Does Not Have An Expiration Date!\" );","title":"Check If Password Has Expiration Date (isPasswordSetToExpire)"},{"location":"AuthSystem/Subject/#get-password-expiration-date-getpasswordexpirationdate","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. There is two methods to retrieving the password expiration date. The date can either be returned as a LocalDateTime object or as a formatted string. Note If the expiration date has been disabled or was never enabled this method will still return an expiration date. For logistical database reasons a date still has to be set. So the date will be set to 1000 years after the user account was created or 1000 years after the date when the password expiration date was last disabled. This number can be updated if any bugs occur but it seems like 1000 years is far enough in the future to not cause any problems.","title":"Get Password Expiration Date (getPasswordExpirationDate)"},{"location":"AuthSystem/Subject/#localdatetime-object_1","text":"Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); final LocalDateTime result = subject . getPasswordExpirationDate (); MessageBox . show ( \"Admin Account Password Expires At \" + result . format ( formatter ));","title":"LocalDateTime Object"},{"location":"AuthSystem/Subject/#formatted-string-object_1","text":"To retrieve the password expiration date, supply the following parameter: Format - The string that represents the format to return the date Example 1 2 3 final var subject = AuthManager . getInstance (). getSubject (); final String result = subject . getPasswordExpirationDate ( \"yyyy-MM-dd HH:mm\" ); MessageBox . show ( \"Admin Account Password Expires At \" + result );","title":"Formatted String Object"},{"location":"AuthSystem/Subject/#set-password-expiration-date-setpasswordexpirationdate","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameter: Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var subject = AuthManager . getInstance (). getSubject (); //Sets the date to now subject . setPasswordExpirationDate ( LocalDateTime . now ()); //Sets the date to 30 days from today subject . setPasswordExpirationDate ( LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am subject . setPasswordExpirationDate ( LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am subject . setPasswordExpirationDate ( LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); subject . setPasswordExpirationDate ( LocalDateTime . parse ( str , formatter ));","title":"Set Password Expiration Date (setPasswordExpirationDate)"},{"location":"AuthSystem/Subject/#disable-password-expiration-disablepasswordexpiration","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. Example 1 2 final var subject = AuthManager . getInstance (). getSubject (); authManager . disablePasswordExpiration ();","title":"Disable Password Expiration (disablePasswordExpiration)"},{"location":"AuthSystem/Subject/#check-if-password-matches-checkpasswordmatches","text":"This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameter: Password - The password to verify Example 1 2 3 4 final var subject = AuthManager . getInstance (). getSubject (); final boolean result = subject . checkPasswordMatches ( \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" );","title":"Check If Password Matches (checkPasswordMatches)"},{"location":"AuthSystem/UserManager/","text":"User Manager Link Introduction Link Package Name: com.jgcomptech.tools.authc.UserManager Warning This class is embedded in the AuthManager and Subject classes and is not meant to be accessed directly except in advanced use cases. To access the AuthManager's embedded UserManager instance use the following code: 1 2 final var authManager = AuthManager . getNewInstance ( db ); final var userManager = authManager . getUserManager (); The User Manager manages all user accounts in the database. This is where all the native SQL code is automatically generated using the Database Builder classes. Setup Link The User Manager is not a singleton class so a new instance needs to be initialized. When a new instance is created a \"users\" table is automatically created in the specified database. The following code can be used to create a new instance: Example 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var userManager = new UserManager ( db ); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs. User Account Methods Link Create A New User (createUser) Link To create a new user use the createUser method supplying the following parameters: Username - The username of the new account Password - The password of the new account User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 3 final var userManager = new UserManager ( db ); userManager . createUser ( \"admin\" , \"1234\" , UserRoleManager . SystemUserRoles . ADMIN ); userManager . createUser ( \"editor\" , \"1234\" , UserRoleManager . SystemUserRoles . EDITOR ); Delete An Existing User (deleteUser) Link To delete an existing user use the deleteUser method supplying the following parameter: Username - The username of the account to delete Example 1 2 final var userManager = new UserManager ( db ); userManager . deleteUser ( \"admin\" ); Get Username Object (getUser) Link Retrieves a readonly immutable UserAccount object. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var userManager = new UserManager ( db ); final UserAccount user = userManager . getUser ( \"admin\" ); Check If User Exists (userExists) Link Checks to see if the specified user account exists. To check a user account, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var userManager = new UserManager ( db ); final boolean result = userManager . userExists ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin User Exists!\" ); else MessageBox . show ( \"Admin User Does Not Exist!\" ); Get User Role (getUserRole) Link Retrieves the UserRole object assigned to the specified user. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var userManager = new UserManager ( db ); final UserRole userRole = userManager . getUserRole ( \"admin\" ); Set User Role (getUserRole) Link Sets the user role assigned to the specified user. To set the user role, supply the following parameters: Username - The username of the account to lookup User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var userManager = new UserManager ( db ); userManager . setUserRole ( \"admin\" , UserRoleManager . SystemUserRoles . ADMIN ); Set User Password (setPassword) Link Sets the password assigned to the specified user. To set the new password, supply the following parameters: Username - The username of the account to lookup Password - The new password to set Note If you want to prevent a user from setting an empty password or to check for password complexity requirements those checks need to be implemented separately. This method allows empty passwords. Even if the password is empty, the empty password is still encrypted with a random secure salt just like any supplied password would be. Example 1 2 final var userManager = new UserManager ( db ); userManager . setPassword ( \"admin\" , \"newPass\" ); Check If Password Matches (checkPasswordMatches) Link This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameters: Username - The username of the account to lookup Password - The password to verify Example 1 2 3 4 final var userManager = new UserManager ( db ); final boolean result = userManager . checkPasswordMatches ( \"admin\" , \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" ); Lock/Unlock A User Account(setLockStatus) Link A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To lock and unlock an account, supply the following parameters: Username - The username of the account to lock/unlock true/false - The value to set, true to lock, false to unlock Example 1 2 3 4 5 final var userManager = new UserManager ( db ); //Lock The Account userManager . setLockStatus ( \"admin\" , true ); //Unlock The Account userManager . setLockStatus ( \"admin\" , false ); Set User Password Expiration Date (setPasswordExpirationDate) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameters: Username - The username of the account to update Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var userManager = new UserManager ( db ); //Sets the date to now userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now ()); //Sets the date to 30 days from today userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . parse ( str , formatter )); Disable Password Expiration (disablePasswordExpiration) Link Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To disable password expiration for a user, supply the following parameter: Username - The username of the account to update Example 1 2 final var userManager = new UserManager ( db ); userManager . disablePasswordExpiration ( \"admin\" ); Other Methods Link Get All Username Objects (getUsersList) Link The getUsersList method retrieves a readonly immutable UserAccount object for each user account and returns the list as a HashSet. Example 1 2 final var userManager = new UserManager ( db ); final HashMap < UserAccount > users = userManager . getUsersList (); Get List Of All Usernames (getUsernameList) Link Retrieves a list of the user names in the database. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < String > users = authManager . getUsernameList ();","title":"User Manager"},{"location":"AuthSystem/UserManager/#user-manager","text":"","title":"User Manager"},{"location":"AuthSystem/UserManager/#introduction","text":"Package Name: com.jgcomptech.tools.authc.UserManager Warning This class is embedded in the AuthManager and Subject classes and is not meant to be accessed directly except in advanced use cases. To access the AuthManager's embedded UserManager instance use the following code: 1 2 final var authManager = AuthManager . getNewInstance ( db ); final var userManager = authManager . getUserManager (); The User Manager manages all user accounts in the database. This is where all the native SQL code is automatically generated using the Database Builder classes.","title":"Introduction"},{"location":"AuthSystem/UserManager/#setup","text":"The User Manager is not a singleton class so a new instance needs to be initialized. When a new instance is created a \"users\" table is automatically created in the specified database. The following code can be used to create a new instance: Example 1 2 3 try ( final var db = new Database ( \"./mydb.db\" , DatabaseType . H2 )) { final var userManager = new UserManager ( db ); } An icon path and program name may also be optionally provided as parameters to change the icon and program name for all login dialogs.","title":"Setup"},{"location":"AuthSystem/UserManager/#user-account-methods","text":"","title":"User Account Methods"},{"location":"AuthSystem/UserManager/#create-a-new-user-createuser","text":"To create a new user use the createUser method supplying the following parameters: Username - The username of the new account Password - The password of the new account User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 3 final var userManager = new UserManager ( db ); userManager . createUser ( \"admin\" , \"1234\" , UserRoleManager . SystemUserRoles . ADMIN ); userManager . createUser ( \"editor\" , \"1234\" , UserRoleManager . SystemUserRoles . EDITOR );","title":"Create A New User (createUser)"},{"location":"AuthSystem/UserManager/#delete-an-existing-user-deleteuser","text":"To delete an existing user use the deleteUser method supplying the following parameter: Username - The username of the account to delete Example 1 2 final var userManager = new UserManager ( db ); userManager . deleteUser ( \"admin\" );","title":"Delete An Existing User (deleteUser)"},{"location":"AuthSystem/UserManager/#get-username-object-getuser","text":"Retrieves a readonly immutable UserAccount object. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var userManager = new UserManager ( db ); final UserAccount user = userManager . getUser ( \"admin\" );","title":"Get Username Object (getUser)"},{"location":"AuthSystem/UserManager/#check-if-user-exists-userexists","text":"Checks to see if the specified user account exists. To check a user account, supply the following parameter: Username - The username of the account to lookup Example 1 2 3 4 final var userManager = new UserManager ( db ); final boolean result = userManager . userExists ( \"admin\" ); if ( result ) MessageBox . show ( \"Admin User Exists!\" ); else MessageBox . show ( \"Admin User Does Not Exist!\" );","title":"Check If User Exists (userExists)"},{"location":"AuthSystem/UserManager/#get-user-role-getuserrole","text":"Retrieves the UserRole object assigned to the specified user. To retrieve the object, supply the following parameter: Username - The username of the account to lookup Example 1 2 final var userManager = new UserManager ( db ); final UserRole userRole = userManager . getUserRole ( \"admin\" );","title":"Get User Role (getUserRole)"},{"location":"AuthSystem/UserManager/#set-user-role-getuserrole","text":"Sets the user role assigned to the specified user. To set the user role, supply the following parameters: Username - The username of the account to lookup User Role - The user role of the new account The user role can be a text string or one of the items from the UserRoleManager.SystemUserRoles enum. The UserRoleManager.SystemUserRoles list contains: ADMIN AUTHOR EDITOR BASIC NONE Note The NONE user role can never have permissions assigned to it. Using the NONE user role is a quick way to remove all permissions from a user. Example 1 2 final var userManager = new UserManager ( db ); userManager . setUserRole ( \"admin\" , UserRoleManager . SystemUserRoles . ADMIN );","title":"Set User Role (getUserRole)"},{"location":"AuthSystem/UserManager/#set-user-password-setpassword","text":"Sets the password assigned to the specified user. To set the new password, supply the following parameters: Username - The username of the account to lookup Password - The new password to set Note If you want to prevent a user from setting an empty password or to check for password complexity requirements those checks need to be implemented separately. This method allows empty passwords. Even if the password is empty, the empty password is still encrypted with a random secure salt just like any supplied password would be. Example 1 2 final var userManager = new UserManager ( db ); userManager . setPassword ( \"admin\" , \"newPass\" );","title":"Set User Password (setPassword)"},{"location":"AuthSystem/UserManager/#check-if-password-matches-checkpasswordmatches","text":"This method allows you to check if the supplied password matches the user's stored password in the database. To verify the password, supply the following parameters: Username - The username of the account to lookup Password - The password to verify Example 1 2 3 4 final var userManager = new UserManager ( db ); final boolean result = userManager . checkPasswordMatches ( \"admin\" , \"1234\" ); if ( result ) MessageBox . show ( \"Password Matches!\" ); else MessageBox . show ( \"Password Does Not Match!\" );","title":"Check If Password Matches (checkPasswordMatches)"},{"location":"AuthSystem/UserManager/#lockunlock-a-user-accountsetlockstatus","text":"A locked user account prevents login and prevents any new sessions to be opened for the user. Locking an user account may be needed for numerous reasons. To lock and unlock an account, supply the following parameters: Username - The username of the account to lock/unlock true/false - The value to set, true to lock, false to unlock Example 1 2 3 4 5 final var userManager = new UserManager ( db ); //Lock The Account userManager . setLockStatus ( \"admin\" , true ); //Unlock The Account userManager . setLockStatus ( \"admin\" , false );","title":"Lock/Unlock A User Account(setLockStatus)"},{"location":"AuthSystem/UserManager/#set-user-password-expiration-date-setpasswordexpirationdate","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To set a password expiration date, supply the following parameters: Username - The username of the account to update Expiration Date - A LocalDateTime object representing the expiration date Example 1 2 3 4 5 6 7 8 9 10 11 12 13 final var userManager = new UserManager ( db ); //Sets the date to now userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now ()); //Sets the date to 30 days from today userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . now (). plusDays ( 30 )); //First Method To Set the date to January 1st, 2019 at 8am userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2019 , 1 , 1 , 8 , 0 )); //Second Method To Set the date to January 1st of 2019 at 8am userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . of ( 2018 , Month . JANUARY , 1 , 8 , 0 )); //Third Method To Set the date to January 1st of 2019 at 8am final String str = \"2019-01-01 08:00\" ; final DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( \"yyyy-MM-dd HH:mm\" ); userManager . setPasswordExpirationDate ( \"admin\" , LocalDateTime . parse ( str , formatter ));","title":"Set User Password Expiration Date (setPasswordExpirationDate)"},{"location":"AuthSystem/UserManager/#disable-password-expiration-disablepasswordexpiration","text":"Setting a password to expire after a specified date allows the prevention of login and new session creation if the password is expired. Setting a password to expire could be used to force regular password changes or allow for temporary accounts to be made. To disable password expiration for a user, supply the following parameter: Username - The username of the account to update Example 1 2 final var userManager = new UserManager ( db ); userManager . disablePasswordExpiration ( \"admin\" );","title":"Disable Password Expiration (disablePasswordExpiration)"},{"location":"AuthSystem/UserManager/#other-methods","text":"","title":"Other Methods"},{"location":"AuthSystem/UserManager/#get-all-username-objects-getuserslist","text":"The getUsersList method retrieves a readonly immutable UserAccount object for each user account and returns the list as a HashSet. Example 1 2 final var userManager = new UserManager ( db ); final HashMap < UserAccount > users = userManager . getUsersList ();","title":"Get All Username Objects (getUsersList)"},{"location":"AuthSystem/UserManager/#get-list-of-all-usernames-getusernamelist","text":"Retrieves a list of the user names in the database. Example 1 2 final var authManager = AuthManager . getInstance (); final HashSet < String > users = authManager . getUsernameList ();","title":"Get List Of All Usernames (getUsernameList)"},{"location":"AuthSystem/UserRoleManager/","text":"User Role Manager Link Introduction Link Package Name: com.jgcomptech.tools.authc.UserRoleManager The User Role Manager class contains all methods needed for managing User Roles that can be assigned to a User Account. User Role Explanation Link Role-based Access Control ( RBAC ) is a common approach to restricting system access to authorized users. A user role defines permissions for a user to perform a group of tasks. Although every role has a predefined set of permissions, new permissions can be added and removed from each role. New custom roles can also be created as a new role or a copy of an existing role. The base permissions are (Descriptions are based on a CMS implementation and are just examples): Admin - Allows changes to system settings. Edit - Allows editing of all content even other user's content. Create - Allows creation of new content and editing of own content. Read - Allows viewing of all content. The base user roles are (Descriptions are based on a CMS implementation and are just examples): Admin(Admin, Edit, Create, Read) - Has all permissions. Editor(Edit, Create, Read) - Can create and edit all content but not change system settings. Author(Create, Read) - Can create new content but not edit other users content. Basic(Read) - Can read all content but not create or edit content. None() - Has no permissions. Note Currently JUT is designed to allow a user to be assigned only one user role. This will be changing in future releases to allow for assignment of multiple roles. Setup Link The User Role Manager is a singleton class and on first use is initialized automatically. The following code can be used to retrieve the instance: 1 final var manager = UserRoleManager . getInstance (); User Role Manager Methods Link Create A New User Role (createUserRole) Link To create a new user role use the createUserRole method supplying the following parameter: Name - The name of the new user role Note When using this method the UserRole object related to the new user role is returned. If a user role already exists with the specified name the already existing UserRole object is returned instead. Example 1 2 3 final var userRoleManager = UserRoleManager . getInstance (); final var newRole = userRoleManager . createUserRole ( \"moderator\" ); newRole . modify (). add ( \"edit\" , \"create\" , \"read\" ); Add Existing User Role (addExistingUserRole) Link You can manually create a new UserRole object and directly add that to the list. To add an existing user role use the addExistingUserRole method supplying the following parameter: UserRole - The UserRole object to add Example 1 2 3 4 final var userRoleManager = UserRoleManager . getInstance (); final UserRole role = new UserRole ( \"moderator\" ); role . modify (). add ( \"edit\" , \"create\" , \"read\" ); userRoleManager . addExistingUserRole ( role ); Get List Of All Installed User Roles (getUserRoles) Link Retrieves an unmodifiable list of all user roles. Example 1 2 final var userRoleManager = UserRoleManager . getInstance (); final Map < String , UserRole > roles = userRoleManager . getUserRoles (); Get Specific User Role (getUserRole) Link Retrieves the specified user role. To retrieve a user role use the getUserRole method supplying the following parameter: Name - The name of the User Role to lookup Example 1 2 final var userRoleManager = UserRoleManager . getInstance (); final UserRole role = userRoleManager . getUserRole ( \"admin\" );","title":"User Role Manager"},{"location":"AuthSystem/UserRoleManager/#user-role-manager","text":"","title":"User Role Manager"},{"location":"AuthSystem/UserRoleManager/#introduction","text":"Package Name: com.jgcomptech.tools.authc.UserRoleManager The User Role Manager class contains all methods needed for managing User Roles that can be assigned to a User Account.","title":"Introduction"},{"location":"AuthSystem/UserRoleManager/#user-role-explanation","text":"Role-based Access Control ( RBAC ) is a common approach to restricting system access to authorized users. A user role defines permissions for a user to perform a group of tasks. Although every role has a predefined set of permissions, new permissions can be added and removed from each role. New custom roles can also be created as a new role or a copy of an existing role. The base permissions are (Descriptions are based on a CMS implementation and are just examples): Admin - Allows changes to system settings. Edit - Allows editing of all content even other user's content. Create - Allows creation of new content and editing of own content. Read - Allows viewing of all content. The base user roles are (Descriptions are based on a CMS implementation and are just examples): Admin(Admin, Edit, Create, Read) - Has all permissions. Editor(Edit, Create, Read) - Can create and edit all content but not change system settings. Author(Create, Read) - Can create new content but not edit other users content. Basic(Read) - Can read all content but not create or edit content. None() - Has no permissions. Note Currently JUT is designed to allow a user to be assigned only one user role. This will be changing in future releases to allow for assignment of multiple roles.","title":"User Role Explanation"},{"location":"AuthSystem/UserRoleManager/#setup","text":"The User Role Manager is a singleton class and on first use is initialized automatically. The following code can be used to retrieve the instance: 1 final var manager = UserRoleManager . getInstance ();","title":"Setup"},{"location":"AuthSystem/UserRoleManager/#user-role-manager-methods","text":"","title":"User Role Manager Methods"},{"location":"AuthSystem/UserRoleManager/#create-a-new-user-role-createuserrole","text":"To create a new user role use the createUserRole method supplying the following parameter: Name - The name of the new user role Note When using this method the UserRole object related to the new user role is returned. If a user role already exists with the specified name the already existing UserRole object is returned instead. Example 1 2 3 final var userRoleManager = UserRoleManager . getInstance (); final var newRole = userRoleManager . createUserRole ( \"moderator\" ); newRole . modify (). add ( \"edit\" , \"create\" , \"read\" );","title":"Create A New User Role (createUserRole)"},{"location":"AuthSystem/UserRoleManager/#add-existing-user-role-addexistinguserrole","text":"You can manually create a new UserRole object and directly add that to the list. To add an existing user role use the addExistingUserRole method supplying the following parameter: UserRole - The UserRole object to add Example 1 2 3 4 final var userRoleManager = UserRoleManager . getInstance (); final UserRole role = new UserRole ( \"moderator\" ); role . modify (). add ( \"edit\" , \"create\" , \"read\" ); userRoleManager . addExistingUserRole ( role );","title":"Add Existing User Role (addExistingUserRole)"},{"location":"AuthSystem/UserRoleManager/#get-list-of-all-installed-user-roles-getuserroles","text":"Retrieves an unmodifiable list of all user roles. Example 1 2 final var userRoleManager = UserRoleManager . getInstance (); final Map < String , UserRole > roles = userRoleManager . getUserRoles ();","title":"Get List Of All Installed User Roles (getUserRoles)"},{"location":"AuthSystem/UserRoleManager/#get-specific-user-role-getuserrole","text":"Retrieves the specified user role. To retrieve a user role use the getUserRole method supplying the following parameter: Name - The name of the User Role to lookup Example 1 2 final var userRoleManager = UserRoleManager . getInstance (); final UserRole role = userRoleManager . getUserRole ( \"admin\" );","title":"Get Specific User Role (getUserRole)"},{"location":"DatabaseTools/","text":"Database Tools Documentation Link Introduction Link Package Names: com.jgcomptech.tools.databasetools.jdbc com.jgcomptech.tools.databasetools.jdbc.builders Contains tools to communicate with a database using JDBC . The goal behind this class is to allow connection with the database and creation of auto-generated SQL statements so manually creating native SQL code is not needed. This includes initial table creation which is not normally included in most database frameworks. Supported Databases Link H2 HyperSQL SQLite SQL Statement Builders Link ColumnBuilder Used for creating a database table column. DeleteBuilder Used for creating a DELETE sql statement to delete a row from a table. IndexBuilder Used for creating a CREATE sql statement to create a new table index. InsertBuilder Used for creating an INSERT sql statement to add a row to a table. QueryBuilder Used for creating a SELECT sql statement to query the database. TableBuilder Used for creating an CREATE sql statement to create a new table. UpdateBuilder Used for creating an UPDATE sql statement to update a row in a table. WhereBuilder Used for creating a WHERE sql statement to set a constraint on another statement. Info This page is a WIP and more documentation is coming soon.","title":"Database Tools"},{"location":"DatabaseTools/#database-tools-documentation","text":"","title":"Database Tools Documentation"},{"location":"DatabaseTools/#introduction","text":"Package Names: com.jgcomptech.tools.databasetools.jdbc com.jgcomptech.tools.databasetools.jdbc.builders Contains tools to communicate with a database using JDBC . The goal behind this class is to allow connection with the database and creation of auto-generated SQL statements so manually creating native SQL code is not needed. This includes initial table creation which is not normally included in most database frameworks.","title":"Introduction"},{"location":"DatabaseTools/#supported-databases","text":"H2 HyperSQL SQLite","title":"Supported Databases"},{"location":"DatabaseTools/#sql-statement-builders","text":"ColumnBuilder Used for creating a database table column. DeleteBuilder Used for creating a DELETE sql statement to delete a row from a table. IndexBuilder Used for creating a CREATE sql statement to create a new table index. InsertBuilder Used for creating an INSERT sql statement to add a row to a table. QueryBuilder Used for creating a SELECT sql statement to query the database. TableBuilder Used for creating an CREATE sql statement to create a new table. UpdateBuilder Used for creating an UPDATE sql statement to update a row in a table. WhereBuilder Used for creating a WHERE sql statement to set a constraint on another statement. Info This page is a WIP and more documentation is coming soon.","title":"SQL Statement Builders"},{"location":"Dialogs/","text":"Dialogs Documentation Link Introduction Link Package Name: com.jgcomptech.tools.dialogs Contains JavaFX dialogs to use in your application. Platform.runLater is not needed to be called since all dialogs use a wrapper class that automatically calls runLater if it is needed. Features Link LoginDialog Creates a Login Dialog for use to authenticate passwords. Allows for display of error message in case of login failure. MessageBox Displays message box with specified options. FXMLDialogWrapper Allows custom creation of a dialog using a specified JavaFX fxml file. Note The MessageBox.Show() method is used throughout this documentation to show messages for demo example purposes. These code statements are not required for the example to function. Info This page is a WIP and more documentation is coming soon.","title":"Dialogs"},{"location":"Dialogs/#dialogs-documentation","text":"","title":"Dialogs Documentation"},{"location":"Dialogs/#introduction","text":"Package Name: com.jgcomptech.tools.dialogs Contains JavaFX dialogs to use in your application. Platform.runLater is not needed to be called since all dialogs use a wrapper class that automatically calls runLater if it is needed.","title":"Introduction"},{"location":"Dialogs/#features","text":"LoginDialog Creates a Login Dialog for use to authenticate passwords. Allows for display of error message in case of login failure. MessageBox Displays message box with specified options. FXMLDialogWrapper Allows custom creation of a dialog using a specified JavaFX fxml file. Note The MessageBox.Show() method is used throughout this documentation to show messages for demo example purposes. These code statements are not required for the example to function. Info This page is a WIP and more documentation is coming soon.","title":"Features"},{"location":"EventManagement/","text":"Event Management Documentation Link Introduction Link Package Name: com.jgcomptech.tools.events Contains classes to manage custom events. All events are managed through the Event Manager class. Note The JavaFX EventHandler class is not the same as the included EventHandler class and is not compatible with the JUT event system. Features Link Registration and firing events Creation of event handlers to handle fired events The ability to pass arguments to event handlers Info This page is a WIP and more documentation is coming soon.","title":"Event Management"},{"location":"EventManagement/#event-management-documentation","text":"","title":"Event Management Documentation"},{"location":"EventManagement/#introduction","text":"Package Name: com.jgcomptech.tools.events Contains classes to manage custom events. All events are managed through the Event Manager class. Note The JavaFX EventHandler class is not the same as the included EventHandler class and is not compatible with the JUT event system.","title":"Introduction"},{"location":"EventManagement/#features","text":"Registration and firing events Creation of event handlers to handle fired events The ability to pass arguments to event handlers Info This page is a WIP and more documentation is coming soon.","title":"Features"},{"location":"HWInfo/","text":"HWInfo Documentation Link Introduction Link Package Name: com.jgcomptech.tools.HWInfo The HWInfo class returns information about the currently installed hardware. Features Link BIOS Returns information about the system BIOS. Network Returns information about the current network. OEM Returns information about the system manufacturer. Processor Returns information about the system processor. RAM Returns information about the system RAM. Storage Returns information about the system storage. Info This page is a WIP and more documentation is coming soon.","title":"HWInfo"},{"location":"HWInfo/#hwinfo-documentation","text":"","title":"HWInfo Documentation"},{"location":"HWInfo/#introduction","text":"Package Name: com.jgcomptech.tools.HWInfo The HWInfo class returns information about the currently installed hardware.","title":"Introduction"},{"location":"HWInfo/#features","text":"BIOS Returns information about the system BIOS. Network Returns information about the current network. OEM Returns information about the system manufacturer. Processor Returns information about the system processor. RAM Returns information about the system RAM. Storage Returns information about the system storage. Info This page is a WIP and more documentation is coming soon.","title":"Features"},{"location":"OSInfo/","text":"OSInfo Documentation Link Introduction Link Package Name: com.jgcomptech.tools.OSInfo The OSInfo class returns information about the current operating system. Features Link Architecture Determines if the current application is 32 or 64-bit. Name Returns the name of the operating system running on this Computer. ComputerNameActive and ComputerNamePending returns the computer network name. Windows Returns information about the current Windows installation. CheckIf Returns boolean value checks. is32BitOS - Identifies if OS is a 32 Bit OS. is64BitOS - Identifies if OS is a 64 Bit OS. isLinux - Identifies if OS is a distro of Linux. isMac - Identifies if OS is MacOSX. isSolaris - Identifies if OS is Solaris. isWindows - Identifies if OS is Windows. Info This page is a WIP and more documentation is coming soon.","title":"OSInfo"},{"location":"OSInfo/#osinfo-documentation","text":"","title":"OSInfo Documentation"},{"location":"OSInfo/#introduction","text":"Package Name: com.jgcomptech.tools.OSInfo The OSInfo class returns information about the current operating system.","title":"Introduction"},{"location":"OSInfo/#features","text":"Architecture Determines if the current application is 32 or 64-bit. Name Returns the name of the operating system running on this Computer. ComputerNameActive and ComputerNamePending returns the computer network name. Windows Returns information about the current Windows installation. CheckIf Returns boolean value checks. is32BitOS - Identifies if OS is a 32 Bit OS. is64BitOS - Identifies if OS is a 64 Bit OS. isLinux - Identifies if OS is a distro of Linux. isMac - Identifies if OS is MacOSX. isSolaris - Identifies if OS is Solaris. isWindows - Identifies if OS is Windows. Info This page is a WIP and more documentation is coming soon.","title":"Features"},{"location":"SecurityTools/","text":"Security Tools Documentation Link Introduction Link Package Name: com.jgcomptech.tools.SecurityTools Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384, SHA512 and BCrypt. Also includes encryption/decryption with RSA. Features Link FileHashes Contains methods dealing with hashing files. PasswordHashes Contains methods dealing with hashing passwords. RSAFiles Contains methods dealing with RSA key files. RSAHashes Contains methods dealing with RSA encryption and decryption. Info This page is a WIP and more documentation is coming soon.","title":"Security Tools"},{"location":"SecurityTools/#security-tools-documentation","text":"","title":"Security Tools Documentation"},{"location":"SecurityTools/#introduction","text":"Package Name: com.jgcomptech.tools.SecurityTools Contains methods surrounding hashing and encryption. Includes methods using MD5, SHA1, SHA256, SHA384, SHA512 and BCrypt. Also includes encryption/decryption with RSA.","title":"Introduction"},{"location":"SecurityTools/#features","text":"FileHashes Contains methods dealing with hashing files. PasswordHashes Contains methods dealing with hashing passwords. RSAFiles Contains methods dealing with RSA key files. RSAHashes Contains methods dealing with RSA encryption and decryption. Info This page is a WIP and more documentation is coming soon.","title":"Features"},{"location":"Utils/","text":"Utils Documentation Link Introduction Link JUT contains many utils classes to allow for extension and simplification of many aspects of Java. Features Link CollectionUtils Contains methods for dealing with collections. ExceptionUtils Contains methods for dealing with exceptions. NumberUtils Contains methods dealing with numbers and math. StringUtils Contains methods dealing with strings. Info This page is a WIP and more documentation is coming soon.","title":"Utils"},{"location":"Utils/#utils-documentation","text":"","title":"Utils Documentation"},{"location":"Utils/#introduction","text":"JUT contains many utils classes to allow for extension and simplification of many aspects of Java.","title":"Introduction"},{"location":"Utils/#features","text":"CollectionUtils Contains methods for dealing with collections. ExceptionUtils Contains methods for dealing with exceptions. NumberUtils Contains methods dealing with numbers and math. StringUtils Contains methods dealing with strings. Info This page is a WIP and more documentation is coming soon.","title":"Features"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100755 index 0000000..7f4389e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,93 @@ + + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + None + 2018-10-13 + daily + + + + + daily + + + + + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100755 index 0000000..744c396 Binary files /dev/null and b/sitemap.xml.gz differ