diff --git a/RxFireAuth.podspec b/RxFireAuth.podspec index 888b5c7..2b9e946 100644 --- a/RxFireAuth.podspec +++ b/RxFireAuth.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'RxFireAuth' - s.version = '1.5.1' + s.version = '1.6.0' s.summary = 'A smart Rx wrapper around Firebase Authentication SDK' # This description is used to generate tags and improve search results. diff --git a/docs/Classes.html b/docs/Classes.html index b438100..62e442c 100644 --- a/docs/Classes.html +++ b/docs/Classes.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -120,7 +134,7 @@

Classes

by UserManager when you ask it to signInWithApple(in:updateUserDisplayName:allowMigration:). You can use it also without a user manager associated.

-

Sign in with Apple is only available on iOS 13 or later.

+

Sign in with Apple is only available on iOS 13 and macOS 10.15 or later.

See more
@@ -128,7 +142,7 @@

Classes

Declaration

Swift

-
@available(iOS 13.0, *)
+                          
@available(iOS 13.0, OSX 10.15, *)
 public class SignInWithAppleHandler : NSObject
extension SignInWithAppleHandler: ASAuthorizationControllerDelegate
extension SignInWithAppleHandler: ASAuthorizationControllerPresentationContextProviding
@@ -178,8 +192,8 @@

Declaration

diff --git a/docs/Classes/SignInWithAppleHandler.html b/docs/Classes/SignInWithAppleHandler.html index 646244e..ce260f5 100644 --- a/docs/Classes/SignInWithAppleHandler.html +++ b/docs/Classes/SignInWithAppleHandler.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -96,7 +110,8 @@

SignInWithAppleHandler

-
@available(iOS 13.0, *)
+                  
+                  
@available(iOS 13.0, OSX 10.15, *)
 public class SignInWithAppleHandler : NSObject
extension SignInWithAppleHandler: ASAuthorizationControllerDelegate
extension SignInWithAppleHandler: ASAuthorizationControllerPresentationContextProviding
@@ -111,7 +126,7 @@

SignInWithAppleHandler

by UserManager when you ask it to signInWithApple(in:updateUserDisplayName:allowMigration:). You can use it also without a user manager associated.

-

Sign in with Apple is only available on iOS 13 or later.

+

Sign in with Apple is only available on iOS 13 and macOS 10.15 or later.

@@ -275,8 +290,8 @@

Declaration

diff --git a/docs/Classes/UserManager.html b/docs/Classes/UserManager.html index baf4365..48be35e 100644 --- a/docs/Classes/UserManager.html +++ b/docs/Classes/UserManager.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

UserManager

+
public class UserManager : UserManagerType
extension UserManager: LoginProviderManagerType
@@ -718,8 +733,8 @@

Sign in with Apple

Declaration

Swift

-
@available(iOS 13.0, *)
-public func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
+
@available(iOS 13.0, OSX 10.15, *)
+public func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
@@ -745,8 +760,8 @@

Declaration

Declaration

Swift

-
@available(iOS 13.0, *)
-public func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
+
@available(iOS 13.0, OSX 10.15, *)
+public func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
@@ -785,7 +800,7 @@

Google Sign-in

Declaration

Swift

-
public func signInWithGoogle(as clientId: String, in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
+
public func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
@@ -811,7 +826,139 @@

Declaration

Declaration

Swift

-
public func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
+
public func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
+ +
+
+ +
+ + + +
+
+ + +
+ +

Sign in with Apple

+

+
+
+ +
+
+
+ + +
+ +

Google Sign-in

+

+
+
+ @@ -136,8 +150,8 @@

Declaration

diff --git a/docs/Enums/UserError.html b/docs/Enums/UserError.html index afd4436..b1ab6ac 100644 --- a/docs/Enums/UserError.html +++ b/docs/Enums/UserError.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

UserError

+
public enum UserError : LocalizedError
@@ -735,8 +750,8 @@

Declaration

diff --git a/docs/Protocols.html b/docs/Protocols.html index 2646a84..7cd0eeb 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -209,8 +223,8 @@

Declaration

diff --git a/docs/Protocols/LoginHandlerType.html b/docs/Protocols/LoginHandlerType.html index 2b4f005..ec9332f 100644 --- a/docs/Protocols/LoginHandlerType.html +++ b/docs/Protocols/LoginHandlerType.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

LoginHandlerType

+
public protocol LoginHandlerType
@@ -168,8 +183,8 @@

Return Value

diff --git a/docs/Protocols/LoginProviderManagerType.html b/docs/Protocols/LoginProviderManagerType.html index 7523da3..5c80a07 100644 --- a/docs/Protocols/LoginProviderManagerType.html +++ b/docs/Protocols/LoginProviderManagerType.html @@ -8,13 +8,21 @@ + + +
-

RxFireAuth Docs (96% documented)

+

RxFireAuth 1.6.0 Docs (95% documented)

+

+

+ +
+

@@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

LoginProviderManagerType

+
public protocol LoginProviderManagerType
@@ -145,8 +160,8 @@

LoginProviderManagerType

Declaration

Swift

-
@available(iOS 13.0, *)
-func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
+
@available(iOS 13.0, OSX 10.15, *)
+func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
@@ -230,8 +245,8 @@

Return Value

Declaration

Swift

-
@available(iOS 13.0, *)
-func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
+
@available(iOS 13.0, OSX 10.15, *)
+func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
@@ -290,7 +305,7 @@

Return Value

Declaration

Swift

-
func signInWithGoogle(as clientId: String, in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
+
func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
@@ -386,7 +401,324 @@

Return Value

Declaration

Swift

-
func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
+
func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
+ +
+
+
+

Parameters

+ + + + + + + + + + + +
+ + clientId + + +
+

Google client ID, generally obtainable using FirebaseApp.app()!.options.clientID.

+
+
+ + viewController + + +
+

The view controller over which the Google Sign-in UI should be displayed.

+
+
+
+
+

Return Value

+

A Completable action to observe.

+
+ + + +
  • +
    + + + + signInWithApple(in:updateUserDisplayName:allowMigration:) + +
    +
    +
    +
    +
    +
    +

    Sign in with Apple in the passed view controller.

    + +

    Before using this function, you must enable Sign in with Apple under the “Signing & Capabilities” tab of +your target. Also, you must turn on Sign in with Apple in your Firebase Console, if you haven’t already.

    + +

    The Sign in with Apple flow will be different for new users and returning users; as a result, in the latter case, the library +will not be able to retrieve the user’s display name, as Apple does not provide this information for returning users. +Keep in mind that the account you are creating using this function will be linked to the user’s Apple ID, but that link +will only work in one direction: from Apple to Firebase; if you delete the Firebase account, the user will still find your app +in their Apple ID settings, under “Apps Using Your Apple ID”.

    + +

    To use Sign in with Apple, your app must comply with specific terms. We strongly suggest you to review them before +starting the implementation: you can find those on the Apple Developer Portal. +Additionally, if your app also provides the option to sign in/sign up with another provider (such as Google) and you’re targeting the public App Store, +you must also support Sign in with Apple.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 13.0, OSX 10.15, *)
    +func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + viewController + + +
    +

    The view controller over which the Sign in with Apple UI should be displayed.

    +
    +
    + + updateUserDisplayName + + +
    +

    If set to true, a successful login will also update the user displayName field using information from the associated Apple ID.

    +
    +
    + + allowMigration + + +
    +

    An optional boolean that defines the behavior in case there is an anonymous user logged-in and the user is trying to login in an existing account. This option will be passed back to the caller +in the resulting LoginDescriptor.performMigration; if set to nil, the operation will not proceed and a UserError.migrationRequired error will be thrown.

    +
    +
    +
    +
    +

    Return Value

    +

    A Single that emits errors or a LoginDescriptor instance.

    +
    +
    +
    +
  • +
  • +
    + + + + confirmAuthenticationWithApple(in:) + +
    +
    +
    +
    +
    +
    +

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    + +

    You can use this function to renew the user authentication in order to perform sensitive actions such as +updating the password or deleting the account. This function will emit an error if the user does not have +Sign in with Apple among their authentication providers.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 13.0, OSX 10.15, *)
    +func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + viewController + + +
    +

    The view controller over which the Sign in with Apple UI should be displayed.

    +
    +
    +
    +
    +

    Return Value

    +

    A Completable action to observe.

    +
    +
    +
    +
  • +
  • +
    + + + + signInWithGoogle(as:in:updateUserDisplayName:allowMigration:) + +
    +
    +
    +
    +
    +
    +

    Sign in with Google in the passed view controller.

    + +

    Google Sign In works by opening a Safari view over the specified view controller. At some point, +a redirect will happen and will be sent to your AppDelegate or SceneDelegate: when it does, you must forward +the URL by calling loginHandler.handle(url:) on your UserManagerType instance.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + clientId + + +
    +

    Google client ID, generally obtainable using FirebaseApp.app()!.options.clientID.

    +
    +
    + + viewController + + +
    +

    The view controller over which the Google Sign-in UI should be displayed.

    +
    +
    + + updateUserDisplayName + + +
    +

    If set to true, a successful login will also update the user displayName field using information from the associated Google Account.

    +
    +
    + + allowMigration + + +
    +

    An optional boolean that defines the behavior in case there is an anonymous user logged-in and the user is trying to login in an existing account. This option will be passed back to the caller +in the resulting LoginDescriptor.performMigration; if set to nil, the operation will not proceed and a UserError.migrationRequired error will be thrown.

    +
    +
    +
    +
    +

    Return Value

    +

    A Single that emits errors or a LoginDescriptor instance.

    +
    +
    +
    +
  • +
  • +
    + + + + confirmAuthenticationWithGoogle(as:in:) + +
    +
    +
    +
    +
    +
    +

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    + +

    You can use this function to renew the user authentication in order to perform sensitive actions such as +updating the password or deleting the account. This function will emit an error if the user does not have +Google Sign In among their authentication providers.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
    @@ -433,8 +765,8 @@

    Return Value

    diff --git a/docs/Protocols/UserManagerType.html b/docs/Protocols/UserManagerType.html index 1888443..eb11c7e 100644 --- a/docs/Protocols/UserManagerType.html +++ b/docs/Protocols/UserManagerType.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@
  • + + @@ -96,6 +110,7 @@

    UserManagerType

    +
    public protocol UserManagerType
    @@ -1214,8 +1229,8 @@

    Return Value

    diff --git a/docs/Structs.html b/docs/Structs.html index 964c7cc..a8416d8 100644 --- a/docs/Structs.html +++ b/docs/Structs.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -205,8 +219,8 @@

    Declaration

    diff --git a/docs/Structs/LoginCredentials.html b/docs/Structs/LoginCredentials.html index 7c5a2ba..13dcdc8 100644 --- a/docs/Structs/LoginCredentials.html +++ b/docs/Structs/LoginCredentials.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginCredentials

    +
    public struct LoginCredentials
    @@ -147,8 +162,8 @@

    Declaration

    diff --git a/docs/Structs/LoginCredentials/Provider.html b/docs/Structs/LoginCredentials/Provider.html index da772ee..edddcdf 100644 --- a/docs/Structs/LoginCredentials/Provider.html +++ b/docs/Structs/LoginCredentials/Provider.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    Provider

    +
    public enum Provider : String
    @@ -192,8 +207,8 @@

    Declaration

    diff --git a/docs/Structs/LoginDescriptor.html b/docs/Structs/LoginDescriptor.html index 329fe68..2ab6ef8 100644 --- a/docs/Structs/LoginDescriptor.html +++ b/docs/Structs/LoginDescriptor.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginDescriptor

    +
    public struct LoginDescriptor
    @@ -241,8 +256,8 @@

    Declaration

    diff --git a/docs/Structs/UserData.html b/docs/Structs/UserData.html index 309f6c4..28f0bcb 100644 --- a/docs/Structs/UserData.html +++ b/docs/Structs/UserData.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    UserData

    +
    public struct UserData
    @@ -258,8 +273,8 @@

    Declaration

    diff --git a/docs/Typealiases.html b/docs/Typealiases.html index 706b203..701e373 100644 --- a/docs/Typealiases.html +++ b/docs/Typealiases.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -103,9 +117,27 @@

    Type Aliases

  • +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + ViewController
    @@ -120,7 +152,7 @@

    Type Aliases

    Declaration

    Swift

    -
    public typealias GoogleSignInCompletionHandler = (_ idToken: String?, _ accessToken: String?, _ email: String?, _ fullName: String?, _ error: Error?) -> Void
    +
    public typealias ViewController = UIViewController
    @@ -222,13 +254,40 @@

    Parameters

  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias GoogleSignInCompletionHandler = (_ idToken: String?, _ accessToken: String?, _ email: String?, _ fullName: String?, _ error: Error?) -> Void
    + +
    +
    +
    +
    +
  • diff --git a/docs/badge.svg b/docs/badge.svg index 7c971c6..19d671e 100644 --- a/docs/badge.svg +++ b/docs/badge.svg @@ -19,10 +19,10 @@ documentation - 96% + 95% - 96% + 95% diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css index c3090c0..5cdffe9 100644 --- a/docs/css/jazzy.css +++ b/docs/css/jazzy.css @@ -56,9 +56,14 @@ p code, li code { padding: 2px 4px; border-radius: 4px; } +pre > code { + padding: 0; } + a { color: #0088cc; text-decoration: none; } + a code { + color: inherit; } ul { padding-left: 15px; } @@ -80,11 +85,11 @@ blockquote { header { font-size: 0.85em; - line-height: 26px; + line-height: 32px; background-color: #414141; position: fixed; width: 100%; - z-index: 2; } + z-index: 3; } header img { padding-right: 6px; vertical-align: -4px; @@ -100,12 +105,12 @@ header { #breadcrumbs { background-color: #f2f2f2; - height: 27px; + height: 21px; padding-top: 17px; position: fixed; width: 100%; z-index: 2; - margin-top: 26px; } + margin-top: 32px; } #breadcrumbs #carat { height: 10px; margin: 0 5px; } @@ -199,6 +204,7 @@ header { margin-left: 18px; } .task-group-section { + margin-top: 10px; padding-left: 6px; border-top: 1px solid #e2e2e2; } @@ -372,3 +378,46 @@ html.dash .content-wrapper { html.dash #footer { position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes.html index b438100..62e442c 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -120,7 +134,7 @@

    Classes

    by UserManager when you ask it to signInWithApple(in:updateUserDisplayName:allowMigration:). You can use it also without a user manager associated.

    -

    Sign in with Apple is only available on iOS 13 or later.

    +

    Sign in with Apple is only available on iOS 13 and macOS 10.15 or later.

    See more
    @@ -128,7 +142,7 @@

    Classes

    Declaration

    Swift

    -
    @available(iOS 13.0, *)
    +                          
    @available(iOS 13.0, OSX 10.15, *)
     public class SignInWithAppleHandler : NSObject
    extension SignInWithAppleHandler: ASAuthorizationControllerDelegate
    extension SignInWithAppleHandler: ASAuthorizationControllerPresentationContextProviding
    @@ -178,8 +192,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/SignInWithAppleHandler.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/SignInWithAppleHandler.html index 646244e..ce260f5 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/SignInWithAppleHandler.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/SignInWithAppleHandler.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,7 +110,8 @@

    SignInWithAppleHandler

    -
    @available(iOS 13.0, *)
    +                  
    +                  
    @available(iOS 13.0, OSX 10.15, *)
     public class SignInWithAppleHandler : NSObject
    extension SignInWithAppleHandler: ASAuthorizationControllerDelegate
    extension SignInWithAppleHandler: ASAuthorizationControllerPresentationContextProviding
    @@ -111,7 +126,7 @@

    SignInWithAppleHandler

    by UserManager when you ask it to signInWithApple(in:updateUserDisplayName:allowMigration:). You can use it also without a user manager associated.

    -

    Sign in with Apple is only available on iOS 13 or later.

    +

    Sign in with Apple is only available on iOS 13 and macOS 10.15 or later.

    @@ -275,8 +290,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/UserManager.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/UserManager.html index baf4365..48be35e 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/UserManager.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Classes/UserManager.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    UserManager

    +
    public class UserManager : UserManagerType
    extension UserManager: LoginProviderManagerType
    @@ -718,8 +733,8 @@

    Sign in with Apple

    Declaration

    Swift

    -
    @available(iOS 13.0, *)
    -public func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    +
    @available(iOS 13.0, OSX 10.15, *)
    +public func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    @@ -745,8 +760,8 @@

    Declaration

    Declaration

    Swift

    -
    @available(iOS 13.0, *)
    -public func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
    +
    @available(iOS 13.0, OSX 10.15, *)
    +public func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
    @@ -785,7 +800,7 @@

    Google Sign-in

    Declaration

    Swift

    -
    public func signInWithGoogle(as clientId: String, in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    +
    public func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    @@ -811,7 +826,139 @@

    Declaration

    Declaration

    Swift

    -
    public func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
    +
    public func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
    + +
    +
    + +
    + + +
    +
    +
    + + +
    + +

    Sign in with Apple

    +

    +
    +
    + +
    +
    +
    + + +
    + +

    Google Sign-in

    +

    +
    +
    + @@ -136,8 +150,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Enums/UserError.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Enums/UserError.html index afd4436..b1ab6ac 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Enums/UserError.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Enums/UserError.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    UserError

    +
    public enum UserError : LocalizedError
    @@ -735,8 +750,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols.html index 2646a84..7cd0eeb 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -209,8 +223,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginHandlerType.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginHandlerType.html index 2b4f005..ec9332f 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginHandlerType.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginHandlerType.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginHandlerType

    +
    public protocol LoginHandlerType
    @@ -168,8 +183,8 @@

    Return Value

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginProviderManagerType.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginProviderManagerType.html index 7523da3..5c80a07 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginProviderManagerType.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/LoginProviderManagerType.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginProviderManagerType

    +
    public protocol LoginProviderManagerType
    @@ -145,8 +160,8 @@

    LoginProviderManagerType

    Declaration

    Swift

    -
    @available(iOS 13.0, *)
    -func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    +
    @available(iOS 13.0, OSX 10.15, *)
    +func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    @@ -230,8 +245,8 @@

    Return Value

    Declaration

    Swift

    -
    @available(iOS 13.0, *)
    -func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
    +
    @available(iOS 13.0, OSX 10.15, *)
    +func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
    @@ -290,7 +305,7 @@

    Return Value

    Declaration

    Swift

    -
    func signInWithGoogle(as clientId: String, in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    +
    func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    @@ -386,7 +401,324 @@

    Return Value

    Declaration

    Swift

    -
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
    +
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + clientId + + +
    +

    Google client ID, generally obtainable using FirebaseApp.app()!.options.clientID.

    +
    +
    + + viewController + + +
    +

    The view controller over which the Google Sign-in UI should be displayed.

    +
    +
    +
    +
    +

    Return Value

    +

    A Completable action to observe.

    +
    + +
    + +
  • + +
    +
    +
    +
    +
    +

    Sign in with Apple in the passed view controller.

    + +

    Before using this function, you must enable Sign in with Apple under the “Signing & Capabilities” tab of +your target. Also, you must turn on Sign in with Apple in your Firebase Console, if you haven’t already.

    + +

    The Sign in with Apple flow will be different for new users and returning users; as a result, in the latter case, the library +will not be able to retrieve the user’s display name, as Apple does not provide this information for returning users. +Keep in mind that the account you are creating using this function will be linked to the user’s Apple ID, but that link +will only work in one direction: from Apple to Firebase; if you delete the Firebase account, the user will still find your app +in their Apple ID settings, under “Apps Using Your Apple ID”.

    + +

    To use Sign in with Apple, your app must comply with specific terms. We strongly suggest you to review them before +starting the implementation: you can find those on the Apple Developer Portal. +Additionally, if your app also provides the option to sign in/sign up with another provider (such as Google) and you’re targeting the public App Store, +you must also support Sign in with Apple.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 13.0, OSX 10.15, *)
    +func signInWithApple(in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + viewController + + +
    +

    The view controller over which the Sign in with Apple UI should be displayed.

    +
    +
    + + updateUserDisplayName + + +
    +

    If set to true, a successful login will also update the user displayName field using information from the associated Apple ID.

    +
    +
    + + allowMigration + + +
    +

    An optional boolean that defines the behavior in case there is an anonymous user logged-in and the user is trying to login in an existing account. This option will be passed back to the caller +in the resulting LoginDescriptor.performMigration; if set to nil, the operation will not proceed and a UserError.migrationRequired error will be thrown.

    +
    +
    +
    +
    +

    Return Value

    +

    A Single that emits errors or a LoginDescriptor instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    + +

    You can use this function to renew the user authentication in order to perform sensitive actions such as +updating the password or deleting the account. This function will emit an error if the user does not have +Sign in with Apple among their authentication providers.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 13.0, OSX 10.15, *)
    +func confirmAuthenticationWithApple(in viewController: ViewController) -> Completable
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + viewController + + +
    +

    The view controller over which the Sign in with Apple UI should be displayed.

    +
    +
    +
    +
    +

    Return Value

    +

    A Completable action to observe.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sign in with Google in the passed view controller.

    + +

    Google Sign In works by opening a Safari view over the specified view controller. At some point, +a redirect will happen and will be sent to your AppDelegate or SceneDelegate: when it does, you must forward +the URL by calling loginHandler.handle(url:) on your UserManagerType instance.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func signInWithGoogle(as clientId: String, in viewController: ViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + clientId + + +
    +

    Google client ID, generally obtainable using FirebaseApp.app()!.options.clientID.

    +
    +
    + + viewController + + +
    +

    The view controller over which the Google Sign-in UI should be displayed.

    +
    +
    + + updateUserDisplayName + + +
    +

    If set to true, a successful login will also update the user displayName field using information from the associated Google Account.

    +
    +
    + + allowMigration + + +
    +

    An optional boolean that defines the behavior in case there is an anonymous user logged-in and the user is trying to login in an existing account. This option will be passed back to the caller +in the resulting LoginDescriptor.performMigration; if set to nil, the operation will not proceed and a UserError.migrationRequired error will be thrown.

    +
    +
    +
    +
    +

    Return Value

    +

    A Single that emits errors or a LoginDescriptor instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    + +

    You can use this function to renew the user authentication in order to perform sensitive actions such as +updating the password or deleting the account. This function will emit an error if the user does not have +Google Sign In among their authentication providers.

    +
    +

    Since

    +

    version 1.5.0

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: ViewController) -> Completable
    @@ -433,8 +765,8 @@

    Return Value

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/UserManagerType.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/UserManagerType.html index 1888443..eb11c7e 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/UserManagerType.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Protocols/UserManagerType.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@
  • + + @@ -96,6 +110,7 @@

    UserManagerType

    +
    public protocol UserManagerType
    @@ -1214,8 +1229,8 @@

    Return Value

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs.html index 964c7cc..a8416d8 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -205,8 +219,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials.html index 7c5a2ba..13dcdc8 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginCredentials

    +
    public struct LoginCredentials
    @@ -147,8 +162,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials/Provider.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials/Provider.html index da772ee..edddcdf 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials/Provider.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginCredentials/Provider.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    Provider

    +
    public enum Provider : String
    @@ -192,8 +207,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginDescriptor.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginDescriptor.html index 329fe68..2ab6ef8 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginDescriptor.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/LoginDescriptor.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    LoginDescriptor

    +
    public struct LoginDescriptor
    @@ -241,8 +256,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/UserData.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/UserData.html index 309f6c4..28f0bcb 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/UserData.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Structs/UserData.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -96,6 +110,7 @@

    UserData

    +
    public struct UserData
    @@ -258,8 +273,8 @@

    Declaration

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Typealiases.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Typealiases.html index 706b203..701e373 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Typealiases.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/Typealiases.html @@ -8,13 +8,21 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -86,6 +94,12 @@ + + @@ -103,9 +117,27 @@

    Type Aliases

  • +
    +
    +
    +
    +
    + +
    +
    +
    +
  • +
  • +
    + + + + ViewController
    @@ -120,7 +152,7 @@

    Type Aliases

    Declaration

    Swift

    -
    public typealias GoogleSignInCompletionHandler = (_ idToken: String?, _ accessToken: String?, _ email: String?, _ fullName: String?, _ error: Error?) -> Void
    +
    public typealias ViewController = UIViewController
    @@ -222,13 +254,40 @@

    Parameters

  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias GoogleSignInCompletionHandler = (_ idToken: String?, _ accessToken: String?, _ email: String?, _ fullName: String?, _ error: Error?) -> Void
    + +
    +
    +
    +
    +
  • diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/css/jazzy.css index c3090c0..5cdffe9 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/css/jazzy.css +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/css/jazzy.css @@ -56,9 +56,14 @@ p code, li code { padding: 2px 4px; border-radius: 4px; } +pre > code { + padding: 0; } + a { color: #0088cc; text-decoration: none; } + a code { + color: inherit; } ul { padding-left: 15px; } @@ -80,11 +85,11 @@ blockquote { header { font-size: 0.85em; - line-height: 26px; + line-height: 32px; background-color: #414141; position: fixed; width: 100%; - z-index: 2; } + z-index: 3; } header img { padding-right: 6px; vertical-align: -4px; @@ -100,12 +105,12 @@ header { #breadcrumbs { background-color: #f2f2f2; - height: 27px; + height: 21px; padding-top: 17px; position: fixed; width: 100%; z-index: 2; - margin-top: 26px; } + margin-top: 32px; } #breadcrumbs #carat { height: 10px; margin: 0 5px; } @@ -199,6 +204,7 @@ header { margin-left: 18px; } .task-group-section { + margin-top: 10px; padding-left: 6px; border-top: 1px solid #e2e2e2; } @@ -372,3 +378,46 @@ html.dash .content-wrapper { html.dash #footer { position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/img/spinner.gif b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/img/spinner.gif differ diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/index.html b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/index.html index b56e875..5e9b43b 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/index.html @@ -8,12 +8,20 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -85,6 +93,12 @@ + + @@ -96,6 +110,9 @@

    RxFireAuth

    Version + + Swift Package Manager + License Platform

    @@ -106,33 +123,56 @@

    RxFireAuth

    Looking for the Android version? You can find it right here.

    Installation

    -

    RxFireAuth is available through CocoaPods. We don’t support other package managers at the moment, mainly because the Firebase SDK is available through CocoaPods only.

    +

    RxFireAuth is available through CocoaPods and Swift Package Manager (in Beta).

    +

    CocoaPods

    To install RxFireAuth in your project add:

    pod 'RxFireAuth'
     
    +

    Swift Package Manager

    + +

    To install RxFireAuth in your project, add this repository as dependency using Xcode or add the following in your Package.swift file:

    +
    .package(url: "https://github.com/MrAsterisco/RxFireAuth", branch: "develop")
    +
    + +

    Please note that Swift Package Manager support relies on the Firebase SDK Swift Package Manager beta branch, which is not yet officially supported by the Firebase team. You can find more information here.

    + +

    The Google SignIn SDK is not available through Swift Package Manager and it is automatically replaced by a standard implementation of AppAuth.

    +

    Latest Release

    To find out the latest version, look at the Releases tab of this repository.

    Get Started

    To get started with RxFireAuth, you can download the example project or dive right into the documentation.

    -

    Example Project

    +

    Example Project

    -

    This library includes a sample project that shows how to support a user log in, including anonymous accounts.

    +

    This library includes a sample project that shows how to implement all the functions of the library on both iOS and macOS.

    To see it in action, follow these steps:

    • Download this repository.
    • -
    • Navigate to your Firebase Console and create a new project using io.mrasterisco.github.RxFireAuth-Example as bundle identifier (or change the bundle identifier to match the one of a project you already have).
    • -
    • Download the GoogleService-Info.plist and place it in the Example/RxFireAuth folder.
    • -
    • In the Firebase Console, navigate to Authentication and enable the “Email/Password”, “Anonymous” and “Apple” sign-in methods.
    • -
    • Run pod install inside the Example folder.
    • -
    • Open the RxFireAuth.xcworkspace, select a valid Signing Identity, build and run.
    • +
    • Navigate to your Firebase Console and create a new project (it’s free!).
    • +
    • Add two iOS apps with the following bundle identifiers: io.mrasterisco.github.RxFireAuth-Example and io.mrasterisco.github.RxFireAuth-Example-macOS. If you are not interested in both platforms, you can also add just one of the two.
    • +
    • Download the GoogleService-Info.plist per each platform and place the first one (iOS) under Example/RxFireAuth and the second one (macOS) under Example\RxFireAuth macOS.
    • +
    • In the Firebase Console, navigate to the Authentication tab and enable “Email/Password”, “Anonymous”, “Apple” and “Google”.
    +

    Test with CocoaPods

    -

    To test Sign in with Apple, you need a valid signing identity. If you don’t have one now, you can turn off Sign in with Apple under the “Signing & Capabilities” tab of the Xcode project.

    -

    Usage

    +
      +
    • Navigate to the Example folder and run pod install.
    • +
    • Open RxFireAuth.xcworkspace, select a valid Signing Identity, build and run.
    • +
    +

    Test with Swift Package Manager

    + +
      +
    • Open RxFireAuth.xcodeproj under the Example-SwiftPM folder.
    • +
    + +

    **Note: the Firebase Console does not support macOS apps, so you’ll have to add the macOS version as an iOS app. Please also note that the Firebase SDK for macOS is not officially part of the Firebase product, but it is community supported. You can find further info here.

    + +

    **Note 2: to test Sign in with Apple, you need a valid signing identity. If you don’t have one now, you can turn off Sign in with Apple under the “Signing & Capabilities” tab of the Xcode project.

    +

    References

    The whole library is built around the UserManagerType protocol. The library provides the default implementation of it through the UserManager class, that you can instantiate directly or get through Dependency Injection.

    Configuration

    @@ -143,20 +183,54 @@

    Configuration

  • You have already created a new project in the Firebase Console.
  • You have registered your app’s bundle identifier and added the GoogleService-Info.plist file.
  • -
  • You have already called FirebaseApp.configure() in your application:didFinishLaunchingWithOptions: function in the AppDelegate, as described here.
  • +
  • You have already configured the Firebase SDK at the app startup: +– iOS: you have already called FirebaseApp.configure() in your application:didFinishLaunchingWithOptions: function in the AppDelegate, as described here. +– macOS: you have already called FirebaseApp.configure() in your awakeFromNib function in the AppDelegate.
  • You have already turned on and configured the authentication providers that you’d like to use in the Firebase Console.
  • In your Podfile, you can omit the Firebase/Auth reference as it is already a dependency of this library and will be included automatically.

    +

    OAuth Providers

    -

    To support OAuth providers (such as Google Sign-in), add the following method into your AppDelegate:

    +

    To support OAuth providers such as Google SignIn, you also have to add the following to your AppDelegate:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    -        return self.userManager.loginHandler?.handle(url: url) ?? false
    +  return self.userManager.loginHandler?.handle(url: url) ?? false
    +}
    +
    + +

    Or, if you’re using the library on macOS, add the following to your AppDelegate:

    +
    func applicationDidFinishLaunching(_ notification: Notification) {
    +  NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(AppDelegate.handleGetURLEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
    +}
    +
    +@objc func handleGetURLEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) {
    +  let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue!
    +  let url = URL(string: urlString!)!
    +  _ = userManager.loginHandler?.handle(url: url)
     }
     
    -

    Login

    -

    One of the things that RxFireAuth aims to simplify is the ability to build a Register/Login screen that works seamlessly for new and returning users, also considering the ability of Firebase to create anonymous accounts.

    +

    You also have to register the redirect URL for your app in the Info.plist:

    +
    <key>CFBundleURLTypes</key>
    +<array>
    +  <dict>
    +    <key>CFBundleTypeRole</key>
    +    <string>Editor</string>
    +    <key>CFBundleURLSchemes</key>
    +    <array>
    +      <string>{{FIREBASE_REVERSED_CLIENT_ID}}</string>
    +    </array>
    +  </dict>
    +</array>
    +
    + +

    You can find your FIREBASE_REVERSED_CLIENT_ID in the GoogleService-Info.plist file.

    +

    Features

    + +

    RxFireAuth offers several ways to interact with Firebase Authentication in a simple and reactive way.

    +

    Login

    + +

    One of the things that RxFireAuth aims to simplify is the ability to build a Register/Login screen that works seamlessly for new and returning users, also considering the ability of Firebase to create anonymous accounts.

    Anonymous Accounts Flow

    Modern applications should always try to delay sign-in as long as possible. From Apple Human Interface Guidelines:

    @@ -175,7 +249,7 @@

    Anonymous Accounts Flow

  • At some point, Mike decides to sign-in to sync his data with another device. He registers a new account with his email and a password.
  • Everything’s looking good until now with the normal Firebase SDK, unless you’re super into RxSwift and you want all the Firebase methods to be wrapped into Rx components; if that’s the case, skip the next points and go directly to “Code Showcase” paragraph.
  • Now, Mike wants to use his shiny new account to sign-in into another device. He downloads the app once again and he finds himself on the Home screen.
  • -
  • He goes directly into the Sign-in screen and enters his account credentials: at this point, using the Firebase SDK, you’ll try to link the anonymous account that has been created while opening the app to Mike’s credential, but you’ll get an error saying that those credentials are already in use. Here’s where this library will help you: when logging-in, the UserManager class will automatically check if the specified credentials already exist and will use those to login; it’ll also delete the anonymous account that is no longer needed.
  • +
  • He goes directly into the Sign-in screen and enters his account credentials: at this point, using the Firebase SDK, you’ll try to link the anonymous account that has been created while opening the app to Mike’s credential, but you’ll get an error saying that those credentials are already in use. Here’s where this library will help you: when logging-in, the UserManager class will automatically check if the specified credentials already exist and will use those to login; it’ll also delete the anonymous account that is no longer needed and report everything back to you.
  • Code Showcase
    @@ -187,34 +261,36 @@
    Code Showcase

    Account Migration Alert

    -

    When the user has made a choice, pass either true or false to get the same value circled back to your code after the login procedure has completed successfully.

    +

    When the user has made a choice, pass either true or false to get the same value circled back to your code after the sign in procedure completed successfully.

    -

    To support the migration, all login methods return an instance of LoginDescriptor which gives you the allowMigration parameter that you’ve passed, the User ID of the anonymous account, and the User ID of the account that is now logged-in. With this information, you can go ahead and migrate the data from the anonymous account to the newly logged-in account.

    -

    Sign-in with Login Providers

    +

    To support the migration, all sign in methods return an instance of LoginDescriptor which gives you the allowMigration parameter that you’ve passed, the User ID of the anonymous account, and the User ID of the account that is now logged-in. With this information, you can go ahead and migrate the data from the anonymous account to the newly logged-in account.

    +

    Sign-in with Authentication Providers

    -

    If you are thinking of providing alternatives ways to login into your app, RxFireAuth’s got you covered.

    +

    If you are thinking of providing alternative ways to login into your app, RxFireAuth’s got you covered.

    -

    When signing in with an external provider, it is always good to just let the user sign-in and then figure out later if this is their first time or not. Additionally, it is common practice to let people connect different providers along with their email and password credentials. Giving people flexibility is always a good choice.

    +

    When signing in with an external provider, it is always good to just let the user sign in and then figure out later if this is their first time or not. Additionally, it is common practice to let people connect different providers along with their email and password credentials. Giving people flexibility is always a good choice.

    -

    Let’s use the same short story from before, but Mike is now going to use Sign-in with Apple.

    +

    Let’s use the same short story from before, but Mike is now going to use Sign in with Apple.

    • On the first device, nothing changes: with the standard Firebase SDK, we can link the anonymous account with Mike’s Apple ID.
    • -
    • On the second device, two things will happen: first of all, Apple has a different flow for apps that have already used Sign-in with Apple; and this is not controllable by you, so if the user registers and then deletes their account in your app, they’ll still get a different sign-in flow in the case they return to the app and Sign-in with Apple once again (further on this here). Secondly, you’ll have to handle various cases.
    • +
    • On the second device, two things will happen: first of all, Apple has a different flow for apps that have already used Sign-in with Apple; and this is not controllable by you, so if the user registers and then deletes their account in your app, they’ll still get a different sign-in flow in the case they return to the app and Sign-in with Apple once again (further on this here). Secondly, you’ll have to handle various situations.

    When using Sign-in with Apple (or any other provider, such as Google), you’ll find yourself in one of these cases:

    -
      +
      1. There is an anonymous user logged-in and the Apple ID is not linked with any existing account: that’s fantastic! We’ll just link the Apple ID with the anonymous user and we’re done.
      2. -
      3. There is an anonymous user logged-in, but the Apple ID is already linked with another account: we’ll have to go through the migration and then log in to the existing account.
      4. -
      5. There is a normal user logged-in and the Apple ID is not already linked with another account: the user is trying to link their Apple ID with an existing account, let’s go ahead and do that.
      6. -
      7. There is a normal user logged-in, but the Apple ID is already linked with another account: we’ll throw an error because the user has to choose what to do.
      8. -
      9. There is nobody logged-in and the Apple ID is either already linked or not: we’ll sign in into the existing or new account.
      10. -
    +
  • There is an anonymous user logged-in, but the Apple ID is already linked with another account: we’ll have to go through the migration and then sign in to the existing account.
  • +
  • There is a normal user logged-in and the Apple ID is not linked with any other account: the user is trying to link their Apple ID with an existing account, let’s go ahead and do that.
  • +
  • There is a normal user logged-in, but the Apple ID is already linked with another account: we’ll throw an error because the user must choose what to do.
  • +
  • There is nobody logged-in and the Apple ID is either already linked or not: we’ll sign into the existing or new account.
  • + + +

    With RxFireAuth’s login method family, all of these cases are handled automagically for you.

    Code Showcase
    -

    All of these cases are handled automatically for you by calling:

    +

    All of the possible cases are handled automatically for you by calling:

    func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
     
    @@ -224,30 +300,41 @@
    Code Showcase

    These functions are available in implementations of LoginProviderManagerType, such as the UserManager class that we’re already using.

    -

    You can use the updateUserDisplayName parameter to automatically set the Firebase User displayName property to the full name associated with the provider account. Keep in mind that some providers, such as Apple, allow the user to change this information while signing-in for the first time.

    +

    You can use the updateUserDisplayName parameter to automatically set the Firebase User displayName property to the full name associated with the provider account. Keep in mind that some providers, such as Apple, allow the user to change this information while signing in for the first time and may return it for new users only that have never signed into your app before.

    -

    This function will behave as the normal login, returning UserError.migrationRequired, if an anonymous account is going to be deleted and allowMigration is not set. When this happens, you can use the following function to continue signing-in after having asked the user what they would like to do:

    +

    This function will behave as the normal sign in, returning UserError.migrationRequired, if an anonymous account will have to be deleted and allowMigration is not set. When this happens, you can use the following function to continue signing in after having asked the user what they’d like to do:

    func login(with credentials: LoginCredentials, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
     

    The login credentials are embedded in the migrationRequired error and, except for particular cases, you shouldn’t need to inspect them.

    -

    Standard Flow

    +

    User Data

    -

    If you don’t want to support the anonymous authentication, you can use this library anyway as all of the methods are built to work even when no account is logged-in.

    +

    You can get the profile of the currently logged-in user by calling:

    +
    self.userManager.user
    +
    -

    You can make explicit calls to:

    -
    func register(email: String, password: String) -> Completable
    +

    or by subscribing to:

    +
    self.userManager.autoupdatingUser
     
    -

    and to:

    -
    func loginWithoutChecking(email: String, password: String, allowMigration: Bool?) -> Single<LoginDescriptor>
    +

    This Observable will emit new values every time something on the user profile has changed.

    + +

    Once signed in, you can inspect the authentication providers of the user by cycling through the authenticationProviders array of the UserData instance. For a list of the supported providers, see the Provider enum, in LoginCredentials.

    +

    Authentication Confirmation

    + +

    When performing sensitive actions, such as changing the user password, linking new authentication providers or deleting the user account, Firebase will require you to get a new refresh token by forcing the user to login again. RxFireAuth offers convenient methods to confirm the authentication using one the supported providers.

    + +

    You can confirm the authentication using email and password:

    +
    func confirmAuthentication(email: String, password: String) -> Completable
     
    -

    and also to:

    -
    func linkAnonymousAccount(toEmail email: String, password: String) -> Completable
    +

    Sign in with Apple:

    +
    func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
     
    -

    These methods will bypass the logic around anonymous and existing/non-existing accounts and will let you use the bare Firebase SDK through RxSwift.

    +

    or Google Sign In:

    +
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
    +

    Documentation

    Always refer to the UserManagerType and LoginProviderManagerType protocols in your code, because the UserManager implementation may introduce breaking changes over time even if the library major version hasn’t changed.

    @@ -257,16 +344,25 @@

    Documentation

    You can find the autogenerated documentation here.

    Compatibility

    -

    RxFireAuth targets iOS 9.0 or later and has the following dependencies:

    +

    RxFireAuth targets iOS 9.0 or later and macOS 10.11 or later and has the following shared dependencies:

    • Firebase/Auth version 6.5.
    • -
    • GoogleSignIn version 5.0.2.
    • JWTDecode version 2.4.
    • RxCocoa version 5.
    -

    Compatibility with macOS is planned. Don’t hesitate to open an issue to prioritize it.

    +

    On iOS, when included via CocoaPods, it also needs:

    + +
      +
    • GoogleSignIn version 5.0.2.
    • +
    + +

    On macOS and when included via Swift Package Manager, GoogleSignIn is replaced by:

    + +
      +
    • AppAuth version 1.4.
    • +

    Contributions

    All contributions to expand the library are welcome. Fork the repo, make the changes you want, and open a Pull Request.

    @@ -284,8 +380,8 @@

    License

    diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..e3d1ab9 --- /dev/null +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,70 @@ +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
    '; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
    '; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jquery.min.js index a1c07fd..b061403 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jquery.min.js +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/jquery.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
    ' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
    "); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
    "); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
    ').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
    ").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
    "); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
    "); + $menu = this.menu.$node || $("
    "); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/search.json b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/search.json index cabe5c2..cf670f9 100644 --- a/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/RxFireAuth.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:10RxFireAuth29GoogleSignInCompletionHandlera":{"name":"GoogleSignInCompletionHandler","abstract":"

    Undocumented

    "},"Typealiases.html#/s:10RxFireAuth32SignInWithAppleCompletionHandlera":{"name":"SignInWithAppleCompletionHandler","abstract":"

    Instances of SignInWithAppleHandler need"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV2idSSSgvp":{"name":"id","abstract":"

    Get the ID.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV5emailSSSgvp":{"name":"email","abstract":"

    Get the email.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11displayNameSSSgvp":{"name":"displayName","abstract":"

    Get the user display name.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if this is an anonymous user.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV23authenticationProvidersSayAA16LoginCredentialsV8ProviderOGvp":{"name":"authenticationProviders","abstract":"

    Get a list of providers that this user has connected.

    ","parent_name":"UserData"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV8fullNameSSSgvp":{"name":"fullName","abstract":"

    Get the full user name.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV16performMigrationSbvp":{"name":"performMigration","abstract":"

    Get if this sign in operation requires a data migration.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9oldUserIdSSSgvp":{"name":"oldUserId","abstract":"

    Get the old user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9newUserIdSSSgvp":{"name":"newUserId","abstract":"

    Get the new user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO8passwordyA2EmF":{"name":"password","abstract":"

    Email & Password

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO5appleyA2EmF":{"name":"apple","abstract":"

    Sign in with Apple.

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO6googleyA2EmF":{"name":"google","abstract":"

    Google Sign In

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html":{"name":"Provider","abstract":"

    A provider represents a supported authentication provider.

    ","parent_name":"LoginCredentials"},"Structs/LoginCredentials.html":{"name":"LoginCredentials","abstract":"

    This class represents a set of credentials used"},"Structs/LoginDescriptor.html":{"name":"LoginDescriptor","abstract":"

    A login descriptor represents"},"Structs/UserData.html":{"name":"UserData","abstract":"

    A User.

    "},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP12loginHandlerAA05LoginhF0_pSgvp":{"name":"loginHandler","abstract":"

    Get the current login handler.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","abstract":"

    Get if there is a currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if there is an anonymous user logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","abstract":"

    Get the currently logged-in user or nil if no user is logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","abstract":"

    Get an Observable that emits a new item every time the logged-in user is updated.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","abstract":"

    Verify if an account exists on the server with the passed email address.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","abstract":"

    Register a new account on the server with the passed email and password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","abstract":"

    Login an anonymous user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","abstract":"

    Convert an anonymous user to a normal user with an email and a password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","abstract":"

    Login the user with the specified email address using the specified password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","abstract":"

    Sign in with the passed credentials without first checking if an account","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with the passed credentials on a login provider.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","abstract":"

    Sign out the currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","abstract":"

    Update the currently signed in user taking new values from the","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","abstract":"

    Update the currently signed in user by retrieving its value and passing it","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","abstract":"

    Update the email of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","abstract":"

    Delete the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","abstract":"

    Update or set the password of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginHandlerType.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","abstract":"

    Handle the specified URL.

    ","parent_name":"LoginHandlerType"},"Protocols/LoginHandlerType.html":{"name":"LoginHandlerType","abstract":"

    This protocol identifies a login handler object"},"Protocols/LoginProviderManagerType.html":{"name":"LoginProviderManagerType","abstract":"

    This protocol defines the public API of the wrapper"},"Protocols/UserManagerType.html":{"name":"UserManagerType","abstract":"

    This protocol defines the public APIs of the main"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO02noD0yA2CmF":{"name":"noUser","abstract":"

    There is no user associated to perform the requested action.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13invalidUpdateyA2CmF":{"name":"invalidUpdate","abstract":"

    The update cannot be performed because of invalid data.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO15alreadyLoggedInyA2CmF":{"name":"alreadyLoggedIn","abstract":"

    There is already another user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12invalidEmailyA2CmF":{"name":"invalidEmail","abstract":"

    The provided email is not valid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17migrationRequiredyAcA16LoginCredentialsVSgcACmF":{"name":"migrationRequired(_:)","abstract":"

    The action would require to migrate the current user data to a new account.","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO16alreadyAnonymousyA2CmF":{"name":"alreadyAnonymous","abstract":"

    The requested action cannot be performed because there is already an anonymous user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userNotFoundyA2CmF":{"name":"userNotFound","abstract":"

    The specified user cannot be found.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userDisabledyA2CmF":{"name":"userDisabled","abstract":"

    The specified user is disabled.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12expiredTokenyA2CmF":{"name":"expiredToken","abstract":"

    The user token has expired.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13wrongPasswordyA2CmF":{"name":"wrongPassword","abstract":"

    The specified password is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17invalidCredentialyA2CmF":{"name":"invalidCredential","abstract":"

    The specified credential is either expired or invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17emailAlreadyInUseyA2CmF":{"name":"emailAlreadyInUse","abstract":"

    The specified email is already in use in another account.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12weakPasswordyACSSSgcACmF":{"name":"weakPassword(_:)","abstract":"

    The specified password does not satisfy the basic security requirements.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO05wrongD0yA2CmF":{"name":"wrongUser","abstract":"

    The requested action would target a different user than the one currently signed-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO34authenticationConfirmationRequiredyA2CmF":{"name":"authenticationConfirmationRequired","abstract":"

    The requested action requires a recent call to self.confirmAuthentication(email:password:) or one of the related calls for other providers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO21providerAlreadyLinkedyA2CmF":{"name":"providerAlreadyLinked","abstract":"

    The specified provider is already linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17providerNotLinkedyA2CmF":{"name":"providerNotLinked","abstract":"

    The specified provider is not linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO07networkE0yA2CmF":{"name":"networkError","abstract":"

    An error occurred while reaching Firebase servers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO013configurationE0yA2CmF":{"name":"configurationError","abstract":"

    The requested operation is not enabled in Firebase Console.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO20invalidConfigurationyA2CmF":{"name":"invalidConfiguration","abstract":"

    The provided Firebase configuration is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO08keychainE0yACs0E0_pSgcACmF":{"name":"keychainError(_:)","abstract":"

    An error occurred while attempting to access the keychain.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO7unknownyACs0E0_pSgcACmF":{"name":"unknown(_:)","abstract":"

    An unknown error has occurred.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"UserError"},"Enums/UserError.html":{"name":"UserError","abstract":"

    Errors thrown by UserManagerType implementations.

    "},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC16clearingKeychainACSb_tcfc":{"name":"init(clearingKeychain:)","abstract":"

    Instanties a new user manager.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC12loginHandlerAA05LoginG4Type_pSgvp":{"name":"loginHandler","abstract":"

    Get or set a reference to a custom-provider login handler.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth22SignInWithAppleHandlerC04signE0010completionH0yySSSg_A3Fs5Error_pSgtcSg_tF":{"name":"signIn(completionHandler:)","abstract":"

    Start the Sign in with Apple flow.

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithAuthorization:":{"name":"authorizationController(controller:didCompleteWithAuthorization:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithError:":{"name":"authorizationController(controller:didCompleteWithError:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)presentationAnchorForAuthorizationController:":{"name":"presentationAnchor(for:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html":{"name":"SignInWithAppleHandler","abstract":"

    A helper class that handles the flow of"},"Classes/UserManager.html":{"name":"UserManager","abstract":"

    The default implementation of UserManagerType.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/ViewController":{"name":"ViewController"},"Typealiases.html#/s:10RxFireAuth14ViewControllera":{"name":"ViewController","abstract":"

    Undocumented

    "},"Typealiases.html#/s:10RxFireAuth32SignInWithAppleCompletionHandlera":{"name":"SignInWithAppleCompletionHandler","abstract":"

    Instances of SignInWithAppleHandler need"},"Typealiases.html#/s:10RxFireAuth29GoogleSignInCompletionHandlera":{"name":"GoogleSignInCompletionHandler","abstract":"

    Undocumented

    "},"Structs/UserData.html#/s:10RxFireAuth8UserDataV2idSSSgvp":{"name":"id","abstract":"

    Get the ID.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV5emailSSSgvp":{"name":"email","abstract":"

    Get the email.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11displayNameSSSgvp":{"name":"displayName","abstract":"

    Get the user display name.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if this is an anonymous user.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV23authenticationProvidersSayAA16LoginCredentialsV8ProviderOGvp":{"name":"authenticationProviders","abstract":"

    Get a list of providers that this user has connected.

    ","parent_name":"UserData"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV8fullNameSSSgvp":{"name":"fullName","abstract":"

    Get the full user name.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV16performMigrationSbvp":{"name":"performMigration","abstract":"

    Get if this sign in operation requires a data migration.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9oldUserIdSSSgvp":{"name":"oldUserId","abstract":"

    Get the old user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9newUserIdSSSgvp":{"name":"newUserId","abstract":"

    Get the new user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO8passwordyA2EmF":{"name":"password","abstract":"

    Email & Password

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO5appleyA2EmF":{"name":"apple","abstract":"

    Sign in with Apple.

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO6googleyA2EmF":{"name":"google","abstract":"

    Google Sign In

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html":{"name":"Provider","abstract":"

    A provider represents a supported authentication provider.

    ","parent_name":"LoginCredentials"},"Structs/LoginCredentials.html":{"name":"LoginCredentials","abstract":"

    This class represents a set of credentials used"},"Structs/LoginDescriptor.html":{"name":"LoginDescriptor","abstract":"

    A login descriptor represents"},"Structs/UserData.html":{"name":"UserData","abstract":"

    A User.

    "},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP12loginHandlerAA05LoginhF0_pSgvp":{"name":"loginHandler","abstract":"

    Get the current login handler.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","abstract":"

    Get if there is a currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if there is an anonymous user logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","abstract":"

    Get the currently logged-in user or nil if no user is logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","abstract":"

    Get an Observable that emits a new item every time the logged-in user is updated.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","abstract":"

    Verify if an account exists on the server with the passed email address.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","abstract":"

    Register a new account on the server with the passed email and password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","abstract":"

    Login an anonymous user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","abstract":"

    Convert an anonymous user to a normal user with an email and a password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","abstract":"

    Login the user with the specified email address using the specified password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","abstract":"

    Sign in with the passed credentials without first checking if an account","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with the passed credentials on a login provider.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","abstract":"

    Sign out the currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","abstract":"

    Update the currently signed in user taking new values from the","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","abstract":"

    Update the currently signed in user by retrieving its value and passing it","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","abstract":"

    Update the email of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","abstract":"

    Delete the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","abstract":"

    Update or set the password of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16NSViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16NSViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16NSViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16NSViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginHandlerType.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","abstract":"

    Handle the specified URL.

    ","parent_name":"LoginHandlerType"},"Protocols/LoginHandlerType.html":{"name":"LoginHandlerType","abstract":"

    This protocol identifies a login handler object"},"Protocols/LoginProviderManagerType.html":{"name":"LoginProviderManagerType","abstract":"

    This protocol defines the public API of the wrapper"},"Protocols/UserManagerType.html":{"name":"UserManagerType","abstract":"

    This protocol defines the public APIs of the main"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO02noD0yA2CmF":{"name":"noUser","abstract":"

    There is no user associated to perform the requested action.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13invalidUpdateyA2CmF":{"name":"invalidUpdate","abstract":"

    The update cannot be performed because of invalid data.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO15alreadyLoggedInyA2CmF":{"name":"alreadyLoggedIn","abstract":"

    There is already another user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12invalidEmailyA2CmF":{"name":"invalidEmail","abstract":"

    The provided email is not valid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17migrationRequiredyAcA16LoginCredentialsVSgcACmF":{"name":"migrationRequired(_:)","abstract":"

    The action would require to migrate the current user data to a new account.","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO16alreadyAnonymousyA2CmF":{"name":"alreadyAnonymous","abstract":"

    The requested action cannot be performed because there is already an anonymous user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userNotFoundyA2CmF":{"name":"userNotFound","abstract":"

    The specified user cannot be found.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userDisabledyA2CmF":{"name":"userDisabled","abstract":"

    The specified user is disabled.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12expiredTokenyA2CmF":{"name":"expiredToken","abstract":"

    The user token has expired.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13wrongPasswordyA2CmF":{"name":"wrongPassword","abstract":"

    The specified password is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17invalidCredentialyA2CmF":{"name":"invalidCredential","abstract":"

    The specified credential is either expired or invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17emailAlreadyInUseyA2CmF":{"name":"emailAlreadyInUse","abstract":"

    The specified email is already in use in another account.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12weakPasswordyACSSSgcACmF":{"name":"weakPassword(_:)","abstract":"

    The specified password does not satisfy the basic security requirements.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO05wrongD0yA2CmF":{"name":"wrongUser","abstract":"

    The requested action would target a different user than the one currently signed-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO34authenticationConfirmationRequiredyA2CmF":{"name":"authenticationConfirmationRequired","abstract":"

    The requested action requires a recent call to self.confirmAuthentication(email:password:) or one of the related calls for other providers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO21providerAlreadyLinkedyA2CmF":{"name":"providerAlreadyLinked","abstract":"

    The specified provider is already linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17providerNotLinkedyA2CmF":{"name":"providerNotLinked","abstract":"

    The specified provider is not linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO07networkE0yA2CmF":{"name":"networkError","abstract":"

    An error occurred while reaching Firebase servers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO013configurationE0yA2CmF":{"name":"configurationError","abstract":"

    The requested operation is not enabled in Firebase Console.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO20invalidConfigurationyA2CmF":{"name":"invalidConfiguration","abstract":"

    The provided Firebase configuration is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO08keychainE0yACs0E0_pSgcACmF":{"name":"keychainError(_:)","abstract":"

    An error occurred while attempting to access the keychain.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO7unknownyACs0E0_pSgcACmF":{"name":"unknown(_:)","abstract":"

    An unknown error has occurred.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"UserError"},"Enums/UserError.html":{"name":"UserError","abstract":"

    Errors thrown by UserManagerType implementations.

    "},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC16clearingKeychainACSb_tcfc":{"name":"init(clearingKeychain:)","abstract":"

    Instanties a new user manager.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC12loginHandlerAA05LoginG4Type_pSgvp":{"name":"loginHandler","abstract":"

    Get or set a reference to a custom-provider login handler.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16NSViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16NSViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16NSViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16NSViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth22SignInWithAppleHandlerC04signE0010completionH0yySSSg_A3Fs5Error_pSgtcSg_tF":{"name":"signIn(completionHandler:)","abstract":"

    Start the Sign in with Apple flow.

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithAuthorization:":{"name":"authorizationController(controller:didCompleteWithAuthorization:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithError:":{"name":"authorizationController(controller:didCompleteWithError:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)presentationAnchorForAuthorizationController:":{"name":"presentationAnchor(for:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html":{"name":"SignInWithAppleHandler","abstract":"

    A helper class that handles the flow of"},"Classes/UserManager.html":{"name":"UserManager","abstract":"

    The default implementation of UserManagerType.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/RxFireAuth.docset/Contents/Resources/docSet.dsidx b/docs/docsets/RxFireAuth.docset/Contents/Resources/docSet.dsidx index 4e6336c..017e43d 100644 Binary files a/docs/docsets/RxFireAuth.docset/Contents/Resources/docSet.dsidx and b/docs/docsets/RxFireAuth.docset/Contents/Resources/docSet.dsidx differ diff --git a/docs/docsets/RxFireAuth.tgz b/docs/docsets/RxFireAuth.tgz index c706f33..770d8be 100644 Binary files a/docs/docsets/RxFireAuth.tgz and b/docs/docsets/RxFireAuth.tgz differ diff --git a/docs/img/spinner.gif b/docs/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/img/spinner.gif differ diff --git a/docs/index.html b/docs/index.html index b56e875..5e9b43b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -8,12 +8,20 @@ + + +
    -

    RxFireAuth Docs (96% documented)

    +

    RxFireAuth 1.6.0 Docs (95% documented)

    +

    +

    + +
    +

    @@ -85,6 +93,12 @@ + + @@ -96,6 +110,9 @@

    RxFireAuth

    Version + + Swift Package Manager + License Platform

    @@ -106,33 +123,56 @@

    RxFireAuth

    Looking for the Android version? You can find it right here.

    Installation

    -

    RxFireAuth is available through CocoaPods. We don’t support other package managers at the moment, mainly because the Firebase SDK is available through CocoaPods only.

    +

    RxFireAuth is available through CocoaPods and Swift Package Manager (in Beta).

    +

    CocoaPods

    To install RxFireAuth in your project add:

    pod 'RxFireAuth'
     
    +

    Swift Package Manager

    + +

    To install RxFireAuth in your project, add this repository as dependency using Xcode or add the following in your Package.swift file:

    +
    .package(url: "https://github.com/MrAsterisco/RxFireAuth", branch: "develop")
    +
    + +

    Please note that Swift Package Manager support relies on the Firebase SDK Swift Package Manager beta branch, which is not yet officially supported by the Firebase team. You can find more information here.

    + +

    The Google SignIn SDK is not available through Swift Package Manager and it is automatically replaced by a standard implementation of AppAuth.

    +

    Latest Release

    To find out the latest version, look at the Releases tab of this repository.

    Get Started

    To get started with RxFireAuth, you can download the example project or dive right into the documentation.

    -

    Example Project

    +

    Example Project

    -

    This library includes a sample project that shows how to support a user log in, including anonymous accounts.

    +

    This library includes a sample project that shows how to implement all the functions of the library on both iOS and macOS.

    To see it in action, follow these steps:

    • Download this repository.
    • -
    • Navigate to your Firebase Console and create a new project using io.mrasterisco.github.RxFireAuth-Example as bundle identifier (or change the bundle identifier to match the one of a project you already have).
    • -
    • Download the GoogleService-Info.plist and place it in the Example/RxFireAuth folder.
    • -
    • In the Firebase Console, navigate to Authentication and enable the “Email/Password”, “Anonymous” and “Apple” sign-in methods.
    • -
    • Run pod install inside the Example folder.
    • -
    • Open the RxFireAuth.xcworkspace, select a valid Signing Identity, build and run.
    • +
    • Navigate to your Firebase Console and create a new project (it’s free!).
    • +
    • Add two iOS apps with the following bundle identifiers: io.mrasterisco.github.RxFireAuth-Example and io.mrasterisco.github.RxFireAuth-Example-macOS. If you are not interested in both platforms, you can also add just one of the two.
    • +
    • Download the GoogleService-Info.plist per each platform and place the first one (iOS) under Example/RxFireAuth and the second one (macOS) under Example\RxFireAuth macOS.
    • +
    • In the Firebase Console, navigate to the Authentication tab and enable “Email/Password”, “Anonymous”, “Apple” and “Google”.
    +

    Test with CocoaPods

    -

    To test Sign in with Apple, you need a valid signing identity. If you don’t have one now, you can turn off Sign in with Apple under the “Signing & Capabilities” tab of the Xcode project.

    -

    Usage

    +
      +
    • Navigate to the Example folder and run pod install.
    • +
    • Open RxFireAuth.xcworkspace, select a valid Signing Identity, build and run.
    • +
    +

    Test with Swift Package Manager

    + +
      +
    • Open RxFireAuth.xcodeproj under the Example-SwiftPM folder.
    • +
    + +

    **Note: the Firebase Console does not support macOS apps, so you’ll have to add the macOS version as an iOS app. Please also note that the Firebase SDK for macOS is not officially part of the Firebase product, but it is community supported. You can find further info here.

    + +

    **Note 2: to test Sign in with Apple, you need a valid signing identity. If you don’t have one now, you can turn off Sign in with Apple under the “Signing & Capabilities” tab of the Xcode project.

    +

    References

    The whole library is built around the UserManagerType protocol. The library provides the default implementation of it through the UserManager class, that you can instantiate directly or get through Dependency Injection.

    Configuration

    @@ -143,20 +183,54 @@

    Configuration

  • You have already created a new project in the Firebase Console.
  • You have registered your app’s bundle identifier and added the GoogleService-Info.plist file.
  • -
  • You have already called FirebaseApp.configure() in your application:didFinishLaunchingWithOptions: function in the AppDelegate, as described here.
  • +
  • You have already configured the Firebase SDK at the app startup: +– iOS: you have already called FirebaseApp.configure() in your application:didFinishLaunchingWithOptions: function in the AppDelegate, as described here. +– macOS: you have already called FirebaseApp.configure() in your awakeFromNib function in the AppDelegate.
  • You have already turned on and configured the authentication providers that you’d like to use in the Firebase Console.
  • In your Podfile, you can omit the Firebase/Auth reference as it is already a dependency of this library and will be included automatically.

    +

    OAuth Providers

    -

    To support OAuth providers (such as Google Sign-in), add the following method into your AppDelegate:

    +

    To support OAuth providers such as Google SignIn, you also have to add the following to your AppDelegate:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    -        return self.userManager.loginHandler?.handle(url: url) ?? false
    +  return self.userManager.loginHandler?.handle(url: url) ?? false
    +}
    +
    + +

    Or, if you’re using the library on macOS, add the following to your AppDelegate:

    +
    func applicationDidFinishLaunching(_ notification: Notification) {
    +  NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(AppDelegate.handleGetURLEvent(event:replyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
    +}
    +
    +@objc func handleGetURLEvent(event: NSAppleEventDescriptor, replyEvent: NSAppleEventDescriptor) {
    +  let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue!
    +  let url = URL(string: urlString!)!
    +  _ = userManager.loginHandler?.handle(url: url)
     }
     
    -

    Login

    -

    One of the things that RxFireAuth aims to simplify is the ability to build a Register/Login screen that works seamlessly for new and returning users, also considering the ability of Firebase to create anonymous accounts.

    +

    You also have to register the redirect URL for your app in the Info.plist:

    +
    <key>CFBundleURLTypes</key>
    +<array>
    +  <dict>
    +    <key>CFBundleTypeRole</key>
    +    <string>Editor</string>
    +    <key>CFBundleURLSchemes</key>
    +    <array>
    +      <string>{{FIREBASE_REVERSED_CLIENT_ID}}</string>
    +    </array>
    +  </dict>
    +</array>
    +
    + +

    You can find your FIREBASE_REVERSED_CLIENT_ID in the GoogleService-Info.plist file.

    +

    Features

    + +

    RxFireAuth offers several ways to interact with Firebase Authentication in a simple and reactive way.

    +

    Login

    + +

    One of the things that RxFireAuth aims to simplify is the ability to build a Register/Login screen that works seamlessly for new and returning users, also considering the ability of Firebase to create anonymous accounts.

    Anonymous Accounts Flow

    Modern applications should always try to delay sign-in as long as possible. From Apple Human Interface Guidelines:

    @@ -175,7 +249,7 @@

    Anonymous Accounts Flow

  • At some point, Mike decides to sign-in to sync his data with another device. He registers a new account with his email and a password.
  • Everything’s looking good until now with the normal Firebase SDK, unless you’re super into RxSwift and you want all the Firebase methods to be wrapped into Rx components; if that’s the case, skip the next points and go directly to “Code Showcase” paragraph.
  • Now, Mike wants to use his shiny new account to sign-in into another device. He downloads the app once again and he finds himself on the Home screen.
  • -
  • He goes directly into the Sign-in screen and enters his account credentials: at this point, using the Firebase SDK, you’ll try to link the anonymous account that has been created while opening the app to Mike’s credential, but you’ll get an error saying that those credentials are already in use. Here’s where this library will help you: when logging-in, the UserManager class will automatically check if the specified credentials already exist and will use those to login; it’ll also delete the anonymous account that is no longer needed.
  • +
  • He goes directly into the Sign-in screen and enters his account credentials: at this point, using the Firebase SDK, you’ll try to link the anonymous account that has been created while opening the app to Mike’s credential, but you’ll get an error saying that those credentials are already in use. Here’s where this library will help you: when logging-in, the UserManager class will automatically check if the specified credentials already exist and will use those to login; it’ll also delete the anonymous account that is no longer needed and report everything back to you.
  • Code Showcase
    @@ -187,34 +261,36 @@
    Code Showcase

    Account Migration Alert

    -

    When the user has made a choice, pass either true or false to get the same value circled back to your code after the login procedure has completed successfully.

    +

    When the user has made a choice, pass either true or false to get the same value circled back to your code after the sign in procedure completed successfully.

    -

    To support the migration, all login methods return an instance of LoginDescriptor which gives you the allowMigration parameter that you’ve passed, the User ID of the anonymous account, and the User ID of the account that is now logged-in. With this information, you can go ahead and migrate the data from the anonymous account to the newly logged-in account.

    -

    Sign-in with Login Providers

    +

    To support the migration, all sign in methods return an instance of LoginDescriptor which gives you the allowMigration parameter that you’ve passed, the User ID of the anonymous account, and the User ID of the account that is now logged-in. With this information, you can go ahead and migrate the data from the anonymous account to the newly logged-in account.

    +

    Sign-in with Authentication Providers

    -

    If you are thinking of providing alternatives ways to login into your app, RxFireAuth’s got you covered.

    +

    If you are thinking of providing alternative ways to login into your app, RxFireAuth’s got you covered.

    -

    When signing in with an external provider, it is always good to just let the user sign-in and then figure out later if this is their first time or not. Additionally, it is common practice to let people connect different providers along with their email and password credentials. Giving people flexibility is always a good choice.

    +

    When signing in with an external provider, it is always good to just let the user sign in and then figure out later if this is their first time or not. Additionally, it is common practice to let people connect different providers along with their email and password credentials. Giving people flexibility is always a good choice.

    -

    Let’s use the same short story from before, but Mike is now going to use Sign-in with Apple.

    +

    Let’s use the same short story from before, but Mike is now going to use Sign in with Apple.

    • On the first device, nothing changes: with the standard Firebase SDK, we can link the anonymous account with Mike’s Apple ID.
    • -
    • On the second device, two things will happen: first of all, Apple has a different flow for apps that have already used Sign-in with Apple; and this is not controllable by you, so if the user registers and then deletes their account in your app, they’ll still get a different sign-in flow in the case they return to the app and Sign-in with Apple once again (further on this here). Secondly, you’ll have to handle various cases.
    • +
    • On the second device, two things will happen: first of all, Apple has a different flow for apps that have already used Sign-in with Apple; and this is not controllable by you, so if the user registers and then deletes their account in your app, they’ll still get a different sign-in flow in the case they return to the app and Sign-in with Apple once again (further on this here). Secondly, you’ll have to handle various situations.

    When using Sign-in with Apple (or any other provider, such as Google), you’ll find yourself in one of these cases:

    -
      +
      1. There is an anonymous user logged-in and the Apple ID is not linked with any existing account: that’s fantastic! We’ll just link the Apple ID with the anonymous user and we’re done.
      2. -
      3. There is an anonymous user logged-in, but the Apple ID is already linked with another account: we’ll have to go through the migration and then log in to the existing account.
      4. -
      5. There is a normal user logged-in and the Apple ID is not already linked with another account: the user is trying to link their Apple ID with an existing account, let’s go ahead and do that.
      6. -
      7. There is a normal user logged-in, but the Apple ID is already linked with another account: we’ll throw an error because the user has to choose what to do.
      8. -
      9. There is nobody logged-in and the Apple ID is either already linked or not: we’ll sign in into the existing or new account.
      10. -
    +
  • There is an anonymous user logged-in, but the Apple ID is already linked with another account: we’ll have to go through the migration and then sign in to the existing account.
  • +
  • There is a normal user logged-in and the Apple ID is not linked with any other account: the user is trying to link their Apple ID with an existing account, let’s go ahead and do that.
  • +
  • There is a normal user logged-in, but the Apple ID is already linked with another account: we’ll throw an error because the user must choose what to do.
  • +
  • There is nobody logged-in and the Apple ID is either already linked or not: we’ll sign into the existing or new account.
  • + + +

    With RxFireAuth’s login method family, all of these cases are handled automagically for you.

    Code Showcase
    -

    All of these cases are handled automatically for you by calling:

    +

    All of the possible cases are handled automatically for you by calling:

    func signInWithApple(in viewController: UIViewController, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
     
    @@ -224,30 +300,41 @@
    Code Showcase

    These functions are available in implementations of LoginProviderManagerType, such as the UserManager class that we’re already using.

    -

    You can use the updateUserDisplayName parameter to automatically set the Firebase User displayName property to the full name associated with the provider account. Keep in mind that some providers, such as Apple, allow the user to change this information while signing-in for the first time.

    +

    You can use the updateUserDisplayName parameter to automatically set the Firebase User displayName property to the full name associated with the provider account. Keep in mind that some providers, such as Apple, allow the user to change this information while signing in for the first time and may return it for new users only that have never signed into your app before.

    -

    This function will behave as the normal login, returning UserError.migrationRequired, if an anonymous account is going to be deleted and allowMigration is not set. When this happens, you can use the following function to continue signing-in after having asked the user what they would like to do:

    +

    This function will behave as the normal sign in, returning UserError.migrationRequired, if an anonymous account will have to be deleted and allowMigration is not set. When this happens, you can use the following function to continue signing in after having asked the user what they’d like to do:

    func login(with credentials: LoginCredentials, updateUserDisplayName: Bool, allowMigration: Bool?) -> Single<LoginDescriptor>
     

    The login credentials are embedded in the migrationRequired error and, except for particular cases, you shouldn’t need to inspect them.

    -

    Standard Flow

    +

    User Data

    -

    If you don’t want to support the anonymous authentication, you can use this library anyway as all of the methods are built to work even when no account is logged-in.

    +

    You can get the profile of the currently logged-in user by calling:

    +
    self.userManager.user
    +
    -

    You can make explicit calls to:

    -
    func register(email: String, password: String) -> Completable
    +

    or by subscribing to:

    +
    self.userManager.autoupdatingUser
     
    -

    and to:

    -
    func loginWithoutChecking(email: String, password: String, allowMigration: Bool?) -> Single<LoginDescriptor>
    +

    This Observable will emit new values every time something on the user profile has changed.

    + +

    Once signed in, you can inspect the authentication providers of the user by cycling through the authenticationProviders array of the UserData instance. For a list of the supported providers, see the Provider enum, in LoginCredentials.

    +

    Authentication Confirmation

    + +

    When performing sensitive actions, such as changing the user password, linking new authentication providers or deleting the user account, Firebase will require you to get a new refresh token by forcing the user to login again. RxFireAuth offers convenient methods to confirm the authentication using one the supported providers.

    + +

    You can confirm the authentication using email and password:

    +
    func confirmAuthentication(email: String, password: String) -> Completable
     
    -

    and also to:

    -
    func linkAnonymousAccount(toEmail email: String, password: String) -> Completable
    +

    Sign in with Apple:

    +
    func confirmAuthenticationWithApple(in viewController: UIViewController) -> Completable
     
    -

    These methods will bypass the logic around anonymous and existing/non-existing accounts and will let you use the bare Firebase SDK through RxSwift.

    +

    or Google Sign In:

    +
    func confirmAuthenticationWithGoogle(as clientId: String, in viewController: UIViewController) -> Completable
    +

    Documentation

    Always refer to the UserManagerType and LoginProviderManagerType protocols in your code, because the UserManager implementation may introduce breaking changes over time even if the library major version hasn’t changed.

    @@ -257,16 +344,25 @@

    Documentation

    You can find the autogenerated documentation here.

    Compatibility

    -

    RxFireAuth targets iOS 9.0 or later and has the following dependencies:

    +

    RxFireAuth targets iOS 9.0 or later and macOS 10.11 or later and has the following shared dependencies:

    • Firebase/Auth version 6.5.
    • -
    • GoogleSignIn version 5.0.2.
    • JWTDecode version 2.4.
    • RxCocoa version 5.
    -

    Compatibility with macOS is planned. Don’t hesitate to open an issue to prioritize it.

    +

    On iOS, when included via CocoaPods, it also needs:

    + +
      +
    • GoogleSignIn version 5.0.2.
    • +
    + +

    On macOS and when included via Swift Package Manager, GoogleSignIn is replaced by:

    + +
      +
    • AppAuth version 1.4.
    • +

    Contributions

    All contributions to expand the library are welcome. Fork the repo, make the changes you want, and open a Pull Request.

    @@ -284,8 +380,8 @@

    License

    diff --git a/docs/js/jazzy.search.js b/docs/js/jazzy.search.js new file mode 100644 index 0000000..e3d1ab9 --- /dev/null +++ b/docs/js/jazzy.search.js @@ -0,0 +1,70 @@ +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
    '; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
    '; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/js/jquery.min.js b/docs/js/jquery.min.js index a1c07fd..b061403 100644 --- a/docs/js/jquery.min.js +++ b/docs/js/jquery.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/js/typeahead.jquery.js b/docs/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
    ' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
    "); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
    "); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
    ').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
    ").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
    "); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
    "); + $menu = this.menu.$node || $("
    "); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/search.json b/docs/search.json index cabe5c2..cf670f9 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:10RxFireAuth29GoogleSignInCompletionHandlera":{"name":"GoogleSignInCompletionHandler","abstract":"

    Undocumented

    "},"Typealiases.html#/s:10RxFireAuth32SignInWithAppleCompletionHandlera":{"name":"SignInWithAppleCompletionHandler","abstract":"

    Instances of SignInWithAppleHandler need"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV2idSSSgvp":{"name":"id","abstract":"

    Get the ID.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV5emailSSSgvp":{"name":"email","abstract":"

    Get the email.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11displayNameSSSgvp":{"name":"displayName","abstract":"

    Get the user display name.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if this is an anonymous user.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV23authenticationProvidersSayAA16LoginCredentialsV8ProviderOGvp":{"name":"authenticationProviders","abstract":"

    Get a list of providers that this user has connected.

    ","parent_name":"UserData"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV8fullNameSSSgvp":{"name":"fullName","abstract":"

    Get the full user name.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV16performMigrationSbvp":{"name":"performMigration","abstract":"

    Get if this sign in operation requires a data migration.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9oldUserIdSSSgvp":{"name":"oldUserId","abstract":"

    Get the old user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9newUserIdSSSgvp":{"name":"newUserId","abstract":"

    Get the new user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO8passwordyA2EmF":{"name":"password","abstract":"

    Email & Password

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO5appleyA2EmF":{"name":"apple","abstract":"

    Sign in with Apple.

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO6googleyA2EmF":{"name":"google","abstract":"

    Google Sign In

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html":{"name":"Provider","abstract":"

    A provider represents a supported authentication provider.

    ","parent_name":"LoginCredentials"},"Structs/LoginCredentials.html":{"name":"LoginCredentials","abstract":"

    This class represents a set of credentials used"},"Structs/LoginDescriptor.html":{"name":"LoginDescriptor","abstract":"

    A login descriptor represents"},"Structs/UserData.html":{"name":"UserData","abstract":"

    A User.

    "},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP12loginHandlerAA05LoginhF0_pSgvp":{"name":"loginHandler","abstract":"

    Get the current login handler.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","abstract":"

    Get if there is a currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if there is an anonymous user logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","abstract":"

    Get the currently logged-in user or nil if no user is logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","abstract":"

    Get an Observable that emits a new item every time the logged-in user is updated.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","abstract":"

    Verify if an account exists on the server with the passed email address.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","abstract":"

    Register a new account on the server with the passed email and password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","abstract":"

    Login an anonymous user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","abstract":"

    Convert an anonymous user to a normal user with an email and a password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","abstract":"

    Login the user with the specified email address using the specified password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","abstract":"

    Sign in with the passed credentials without first checking if an account","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with the passed credentials on a login provider.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","abstract":"

    Sign out the currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","abstract":"

    Update the currently signed in user taking new values from the","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","abstract":"

    Update the currently signed in user by retrieving its value and passing it","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","abstract":"

    Update the email of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","abstract":"

    Delete the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","abstract":"

    Update or set the password of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginHandlerType.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","abstract":"

    Handle the specified URL.

    ","parent_name":"LoginHandlerType"},"Protocols/LoginHandlerType.html":{"name":"LoginHandlerType","abstract":"

    This protocol identifies a login handler object"},"Protocols/LoginProviderManagerType.html":{"name":"LoginProviderManagerType","abstract":"

    This protocol defines the public API of the wrapper"},"Protocols/UserManagerType.html":{"name":"UserManagerType","abstract":"

    This protocol defines the public APIs of the main"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO02noD0yA2CmF":{"name":"noUser","abstract":"

    There is no user associated to perform the requested action.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13invalidUpdateyA2CmF":{"name":"invalidUpdate","abstract":"

    The update cannot be performed because of invalid data.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO15alreadyLoggedInyA2CmF":{"name":"alreadyLoggedIn","abstract":"

    There is already another user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12invalidEmailyA2CmF":{"name":"invalidEmail","abstract":"

    The provided email is not valid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17migrationRequiredyAcA16LoginCredentialsVSgcACmF":{"name":"migrationRequired(_:)","abstract":"

    The action would require to migrate the current user data to a new account.","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO16alreadyAnonymousyA2CmF":{"name":"alreadyAnonymous","abstract":"

    The requested action cannot be performed because there is already an anonymous user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userNotFoundyA2CmF":{"name":"userNotFound","abstract":"

    The specified user cannot be found.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userDisabledyA2CmF":{"name":"userDisabled","abstract":"

    The specified user is disabled.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12expiredTokenyA2CmF":{"name":"expiredToken","abstract":"

    The user token has expired.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13wrongPasswordyA2CmF":{"name":"wrongPassword","abstract":"

    The specified password is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17invalidCredentialyA2CmF":{"name":"invalidCredential","abstract":"

    The specified credential is either expired or invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17emailAlreadyInUseyA2CmF":{"name":"emailAlreadyInUse","abstract":"

    The specified email is already in use in another account.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12weakPasswordyACSSSgcACmF":{"name":"weakPassword(_:)","abstract":"

    The specified password does not satisfy the basic security requirements.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO05wrongD0yA2CmF":{"name":"wrongUser","abstract":"

    The requested action would target a different user than the one currently signed-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO34authenticationConfirmationRequiredyA2CmF":{"name":"authenticationConfirmationRequired","abstract":"

    The requested action requires a recent call to self.confirmAuthentication(email:password:) or one of the related calls for other providers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO21providerAlreadyLinkedyA2CmF":{"name":"providerAlreadyLinked","abstract":"

    The specified provider is already linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17providerNotLinkedyA2CmF":{"name":"providerNotLinked","abstract":"

    The specified provider is not linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO07networkE0yA2CmF":{"name":"networkError","abstract":"

    An error occurred while reaching Firebase servers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO013configurationE0yA2CmF":{"name":"configurationError","abstract":"

    The requested operation is not enabled in Firebase Console.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO20invalidConfigurationyA2CmF":{"name":"invalidConfiguration","abstract":"

    The provided Firebase configuration is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO08keychainE0yACs0E0_pSgcACmF":{"name":"keychainError(_:)","abstract":"

    An error occurred while attempting to access the keychain.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO7unknownyACs0E0_pSgcACmF":{"name":"unknown(_:)","abstract":"

    An unknown error has occurred.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"UserError"},"Enums/UserError.html":{"name":"UserError","abstract":"

    Errors thrown by UserManagerType implementations.

    "},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC16clearingKeychainACSb_tcfc":{"name":"init(clearingKeychain:)","abstract":"

    Instanties a new user manager.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC12loginHandlerAA05LoginG4Type_pSgvp":{"name":"loginHandler","abstract":"

    Get or set a reference to a custom-provider login handler.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth22SignInWithAppleHandlerC04signE0010completionH0yySSSg_A3Fs5Error_pSgtcSg_tF":{"name":"signIn(completionHandler:)","abstract":"

    Start the Sign in with Apple flow.

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithAuthorization:":{"name":"authorizationController(controller:didCompleteWithAuthorization:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithError:":{"name":"authorizationController(controller:didCompleteWithError:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)presentationAnchorForAuthorizationController:":{"name":"presentationAnchor(for:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html":{"name":"SignInWithAppleHandler","abstract":"

    A helper class that handles the flow of"},"Classes/UserManager.html":{"name":"UserManager","abstract":"

    The default implementation of UserManagerType.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/ViewController":{"name":"ViewController"},"Typealiases.html#/s:10RxFireAuth14ViewControllera":{"name":"ViewController","abstract":"

    Undocumented

    "},"Typealiases.html#/s:10RxFireAuth32SignInWithAppleCompletionHandlera":{"name":"SignInWithAppleCompletionHandler","abstract":"

    Instances of SignInWithAppleHandler need"},"Typealiases.html#/s:10RxFireAuth29GoogleSignInCompletionHandlera":{"name":"GoogleSignInCompletionHandler","abstract":"

    Undocumented

    "},"Structs/UserData.html#/s:10RxFireAuth8UserDataV2idSSSgvp":{"name":"id","abstract":"

    Get the ID.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV5emailSSSgvp":{"name":"email","abstract":"

    Get the email.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11displayNameSSSgvp":{"name":"displayName","abstract":"

    Get the user display name.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if this is an anonymous user.

    ","parent_name":"UserData"},"Structs/UserData.html#/s:10RxFireAuth8UserDataV23authenticationProvidersSayAA16LoginCredentialsV8ProviderOGvp":{"name":"authenticationProviders","abstract":"

    Get a list of providers that this user has connected.

    ","parent_name":"UserData"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV8fullNameSSSgvp":{"name":"fullName","abstract":"

    Get the full user name.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV16performMigrationSbvp":{"name":"performMigration","abstract":"

    Get if this sign in operation requires a data migration.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9oldUserIdSSSgvp":{"name":"oldUserId","abstract":"

    Get the old user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginDescriptor.html#/s:10RxFireAuth15LoginDescriptorV9newUserIdSSSgvp":{"name":"newUserId","abstract":"

    Get the new user ID.

    ","parent_name":"LoginDescriptor"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO8passwordyA2EmF":{"name":"password","abstract":"

    Email & Password

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO5appleyA2EmF":{"name":"apple","abstract":"

    Sign in with Apple.

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html#/s:10RxFireAuth16LoginCredentialsV8ProviderO6googleyA2EmF":{"name":"google","abstract":"

    Google Sign In

    ","parent_name":"Provider"},"Structs/LoginCredentials/Provider.html":{"name":"Provider","abstract":"

    A provider represents a supported authentication provider.

    ","parent_name":"LoginCredentials"},"Structs/LoginCredentials.html":{"name":"LoginCredentials","abstract":"

    This class represents a set of credentials used"},"Structs/LoginDescriptor.html":{"name":"LoginDescriptor","abstract":"

    A login descriptor represents"},"Structs/UserData.html":{"name":"UserData","abstract":"

    A User.

    "},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP12loginHandlerAA05LoginhF0_pSgvp":{"name":"loginHandler","abstract":"

    Get the current login handler.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","abstract":"

    Get if there is a currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","abstract":"

    Get if there is an anonymous user logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","abstract":"

    Get the currently logged-in user or nil if no user is logged-in.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","abstract":"

    Get an Observable that emits a new item every time the logged-in user is updated.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","abstract":"

    Verify if an account exists on the server with the passed email address.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","abstract":"

    Register a new account on the server with the passed email and password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","abstract":"

    Login an anonymous user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","abstract":"

    Convert an anonymous user to a normal user with an email and a password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","abstract":"

    Login the user with the specified email address using the specified password.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","abstract":"

    Sign in with the passed credentials without first checking if an account","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with the passed credentials on a login provider.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","abstract":"

    Sign out the currently logged-in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","abstract":"

    Update the currently signed in user taking new values from the","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","abstract":"

    Update the currently signed in user by retrieving its value and passing it","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","abstract":"

    Update the email of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","abstract":"

    Confirm the authentication of the passed credentials with the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","abstract":"

    Delete the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/UserManagerType.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","abstract":"

    Update or set the password of the currently signed in user.

    ","parent_name":"UserManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16NSViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Apple in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16NSViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","abstract":"

    Confirm the authentication of the currently signed in user with Sign in with Apple.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16NSViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","abstract":"

    Sign in with Google in the passed view controller.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginProviderManagerType.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16NSViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","abstract":"

    Confirm the authentication of the currently logged-in user with Google Sign-in.

    ","parent_name":"LoginProviderManagerType"},"Protocols/LoginHandlerType.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","abstract":"

    Handle the specified URL.

    ","parent_name":"LoginHandlerType"},"Protocols/LoginHandlerType.html":{"name":"LoginHandlerType","abstract":"

    This protocol identifies a login handler object"},"Protocols/LoginProviderManagerType.html":{"name":"LoginProviderManagerType","abstract":"

    This protocol defines the public API of the wrapper"},"Protocols/UserManagerType.html":{"name":"UserManagerType","abstract":"

    This protocol defines the public APIs of the main"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO02noD0yA2CmF":{"name":"noUser","abstract":"

    There is no user associated to perform the requested action.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13invalidUpdateyA2CmF":{"name":"invalidUpdate","abstract":"

    The update cannot be performed because of invalid data.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO15alreadyLoggedInyA2CmF":{"name":"alreadyLoggedIn","abstract":"

    There is already another user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12invalidEmailyA2CmF":{"name":"invalidEmail","abstract":"

    The provided email is not valid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17migrationRequiredyAcA16LoginCredentialsVSgcACmF":{"name":"migrationRequired(_:)","abstract":"

    The action would require to migrate the current user data to a new account.","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO16alreadyAnonymousyA2CmF":{"name":"alreadyAnonymous","abstract":"

    The requested action cannot be performed because there is already an anonymous user logged-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userNotFoundyA2CmF":{"name":"userNotFound","abstract":"

    The specified user cannot be found.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12userDisabledyA2CmF":{"name":"userDisabled","abstract":"

    The specified user is disabled.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12expiredTokenyA2CmF":{"name":"expiredToken","abstract":"

    The user token has expired.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO13wrongPasswordyA2CmF":{"name":"wrongPassword","abstract":"

    The specified password is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17invalidCredentialyA2CmF":{"name":"invalidCredential","abstract":"

    The specified credential is either expired or invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17emailAlreadyInUseyA2CmF":{"name":"emailAlreadyInUse","abstract":"

    The specified email is already in use in another account.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO12weakPasswordyACSSSgcACmF":{"name":"weakPassword(_:)","abstract":"

    The specified password does not satisfy the basic security requirements.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO05wrongD0yA2CmF":{"name":"wrongUser","abstract":"

    The requested action would target a different user than the one currently signed-in.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO34authenticationConfirmationRequiredyA2CmF":{"name":"authenticationConfirmationRequired","abstract":"

    The requested action requires a recent call to self.confirmAuthentication(email:password:) or one of the related calls for other providers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO21providerAlreadyLinkedyA2CmF":{"name":"providerAlreadyLinked","abstract":"

    The specified provider is already linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO17providerNotLinkedyA2CmF":{"name":"providerNotLinked","abstract":"

    The specified provider is not linked with this user.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO07networkE0yA2CmF":{"name":"networkError","abstract":"

    An error occurred while reaching Firebase servers.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO013configurationE0yA2CmF":{"name":"configurationError","abstract":"

    The requested operation is not enabled in Firebase Console.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO20invalidConfigurationyA2CmF":{"name":"invalidConfiguration","abstract":"

    The provided Firebase configuration is invalid.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO08keychainE0yACs0E0_pSgcACmF":{"name":"keychainError(_:)","abstract":"

    An error occurred while attempting to access the keychain.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10RxFireAuth9UserErrorO7unknownyACs0E0_pSgcACmF":{"name":"unknown(_:)","abstract":"

    An unknown error has occurred.

    ","parent_name":"UserError"},"Enums/UserError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"UserError"},"Enums/UserError.html":{"name":"UserError","abstract":"

    Errors thrown by UserManagerType implementations.

    "},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC16clearingKeychainACSb_tcfc":{"name":"init(clearingKeychain:)","abstract":"

    Instanties a new user manager.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth11UserManagerC12loginHandlerAA05LoginG4Type_pSgvp":{"name":"loginHandler","abstract":"

    Get or set a reference to a custom-provider login handler.

    ","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP10isLoggedInSbvp":{"name":"isLoggedIn","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11isAnonymousSbvp":{"name":"isAnonymous","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP4userAA0D4DataVSgvp":{"name":"user","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP012autoupdatingD00A5Swift10ObservableCyAA0D4DataVSgGvp":{"name":"autoupdatingUser","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP13accountExists4with0A5Swift17PrimitiveSequenceVyAF11SingleTraitOSbGSS_tF":{"name":"accountExists(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP8register5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"register(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP16loginAnonymously0A5Swift17PrimitiveSequenceVyAE16CompletableTraitOs5NeverOGyF":{"name":"loginAnonymously()","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20linkAnonymousAccount7toEmail8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"linkAnonymousAccount(toEmail:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"login(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP20loginWithoutChecking5email8password14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGSS_SSSbSgtF":{"name":"loginWithoutChecking(email:password:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP5login4with06updateD11DisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA15LoginDescriptorVGAA0S11CredentialsV_S2bSgtF":{"name":"login(with:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6logout16resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"logout(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update4user0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataV_tF":{"name":"update(user:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP6update24userConfigurationHandler0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA0D4DataVAOc_tF":{"name":"update(userConfigurationHandler:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP11updateEmail03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updateEmail(newEmail:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication5email8password0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_SStF":{"name":"confirmAuthentication(email:password:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP21confirmAuthentication4with0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGAA16LoginCredentialsV_tF":{"name":"confirmAuthentication(with:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP06deleteD016resetToAnonymous0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSb_tF":{"name":"deleteUser(resetToAnonymous:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth15UserManagerTypeP14updatePassword03newH00A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSS_tF":{"name":"updatePassword(newPassword:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16UIViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16UIViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16UIViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16UIViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP15signInWithApple2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAH11SingleTraitOAA0D10DescriptorVGSo16NSViewControllerC_S2bSgtF":{"name":"signInWithApple(in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP30confirmAuthenticationWithApple2in0A5Swift17PrimitiveSequenceVyAF16CompletableTraitOs5NeverOGSo16NSViewControllerC_tF":{"name":"confirmAuthenticationWithApple(in:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP16signInWithGoogle2as2in21updateUserDisplayName14allowMigration0A5Swift17PrimitiveSequenceVyAI11SingleTraitOAA0D10DescriptorVGSS_So16NSViewControllerCS2bSgtF":{"name":"signInWithGoogle(as:in:updateUserDisplayName:allowMigration:)","parent_name":"UserManager"},"Classes/UserManager.html#/s:10RxFireAuth24LoginProviderManagerTypeP31confirmAuthenticationWithGoogle2as2in0A5Swift17PrimitiveSequenceVyAG16CompletableTraitOs5NeverOGSS_So16NSViewControllerCtF":{"name":"confirmAuthenticationWithGoogle(as:in:)","parent_name":"UserManager"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth22SignInWithAppleHandlerC04signE0010completionH0yySSSg_A3Fs5Error_pSgtcSg_tF":{"name":"signIn(completionHandler:)","abstract":"

    Start the Sign in with Apple flow.

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithAuthorization:":{"name":"authorizationController(controller:didCompleteWithAuthorization:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)authorizationController:didCompleteWithError:":{"name":"authorizationController(controller:didCompleteWithError:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/c:@CM@RxFireAuth@objc(cs)SignInWithAppleHandler(im)presentationAnchorForAuthorizationController:":{"name":"presentationAnchor(for:)","abstract":"

    Undocumented

    ","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html#/s:10RxFireAuth16LoginHandlerTypeP6handle3urlSb10Foundation3URLV_tF":{"name":"handle(url:)","parent_name":"SignInWithAppleHandler"},"Classes/SignInWithAppleHandler.html":{"name":"SignInWithAppleHandler","abstract":"

    A helper class that handles the flow of"},"Classes/UserManager.html":{"name":"UserManager","abstract":"

    The default implementation of UserManagerType.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json index 6f5fd2c..2050724 100644 --- a/docs/undocumented.json +++ b/docs/undocumented.json @@ -1,32 +1,74 @@ { "warnings": [ { - "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/GoogleSignInHandler.swift", - "line": 11, - "symbol": "GoogleSignInCompletionHandler", + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/LoginProviderManagerType.swift", + "line": 13, + "symbol": "ViewController", "symbol_kind": "source.lang.swift.decl.typealias", "warning": "undocumented" }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/LoginProviderManagerType.swift", + "line": 16, + "symbol": "ViewController", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", + "line": 78, + "symbol": "SignInWithAppleHandler.authorizationController(controller:didCompleteWithAuthorization:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, { "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", - "line": 79, + "line": 78, "symbol": "SignInWithAppleHandler.authorizationController(controller:didCompleteWithAuthorization:)", "symbol_kind": "source.lang.swift.decl.function.method.instance", "warning": "undocumented" }, { "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", - "line": 101, + "line": 100, + "symbol": "SignInWithAppleHandler.authorizationController(controller:didCompleteWithError:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", + "line": 100, "symbol": "SignInWithAppleHandler.authorizationController(controller:didCompleteWithError:)", "symbol_kind": "source.lang.swift.decl.function.method.instance", "warning": "undocumented" }, { "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", - "line": 110, + "line": 109, "symbol": "SignInWithAppleHandler.presentationAnchor(for:)", "symbol_kind": "source.lang.swift.decl.function.method.instance", "warning": "undocumented" + }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/Classes/SignInWithAppleHandler.swift", + "line": 109, + "symbol": "SignInWithAppleHandler.presentationAnchor(for:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/iOS/GoogleSignInHandler.swift", + "line": 12, + "symbol": "GoogleSignInCompletionHandler", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/alex/Documents/Open Source/RxFireAuth/RxFireAuth/macOS/GoogleOAuthSignInHandler.swift", + "line": 11, + "symbol": "GoogleSignInCompletionHandler", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" } ], "source_directory": "/Users/alex/Documents/Open Source/RxFireAuth"