No problem Kalle, make sure to give credit to Janne though, most of the work is his. I wouldn't make this the default Serializer just yet, because it will invalidate existing cookies for clients that will upgrade to the new version. I would offer it as an optional Serializer implementation (possibly configurable with a symbol), people would be able to enable it if they like. Ultimately, the call is yours, I just wanted to point out this possible problem.
On Mon, Mar 10, 2014 at 9:41 PM, Kalle Korhonen <kalle.o.korho...@gmail.com>wrote: > Perhaps there's no reason to wait for a fix in Shiro. I could just > implement this as a new default CookieRememberMeManager in > tapestry-security. Dusko, you mind if I use your SimplePrincipalSerializer? > > Kalle > > > On Thu, Mar 6, 2014 at 3:21 AM, Dusko Jovanovski <dusk...@gmail.com> > wrote: > > > Thanks for pointing that out, I wasn't finishing the GZIP stream > properly, > > already fixed in the updated gist. > > https://gist.github.com/duskote/0f8cce8d1b0d1cc56844 > > > > You could give it another try and see if it works for you. > > > > > > On Thu, Mar 6, 2014 at 11:36 AM, Lidija Dolinar <lidija....@gmail.com > > >wrote: > > > > > Dusko, thank you for your reply. > > > > > > If I use your SimplePrincipalSerializer, the rememberMe cookie is > indeed > > > created and is very small: > > > > > > > > > [11:31:39] DEBUG [org.apache.shiro.web.servlet.SimpleCookie]: Added > > > HttpServletResponse Cookie [rememberMe=deleteMe; Path=/; Max-Age=0; > > > Expires=Wed, 05-Mar-2014 10:31:39 GMT] > > > [11:31:39] DEBUG [org.apache.shiro.web.servlet.SimpleCookie]: Added > > > HttpServletResponse Cookie > > > [rememberMe=Kjvu3Jysio7jGf7Xew6Rp46oiHDrDC/V00ltCDbFw4M=; Path=/; > > > Max-Age=1209600; Expires=Thu, 20-Mar-2014 10:31:39 GMT; HttpOnly] > > > > > > > > > > > > But I get the following exception at deserialization time (sorry for > the > > > ugly wrapping): > > > > > > > > > > > > [11:32:36] DEBUG [org.apache.shiro.web.servlet.SimpleCookie]: Found > > > 'rememberMe' cookie value > [Kjvu3Jysio7jGf7Xew6Rp46oiHDrDC/V00ltCDbFw4M=] > > > [11:32:36] DEBUG [org.apache.shiro.mgt.AbstractRememberMeManager]: > There > > > was a failure while trying to retrieve remembered principals. This > could > > > be due to a configuration problem or corrupted principals. This could > > also > > > be due to a recently changed encryption key. The remembered identity > > will > > > be forgotten and not used for this request. > > > org.apache.shiro.io.SerializationException: Unexpected end of ZLIB > input > > > stream > > > at > > > > > > > > > si.najdi.web.util.SimplePrincipalSerializer2.deserialize(SimplePrincipalSerializer2.java:85) > > > ~[classes/:na] > > > at > > > > > > > > > si.najdi.web.util.SimplePrincipalSerializer2.deserialize(SimplePrincipalSerializer2.java:17) > > > ~[classes/:na] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.deserialize(AbstractRememberMeManager.java:514) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.convertBytesToPrincipals(AbstractRememberMeManager.java:431) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.getRememberedPrincipals(AbstractRememberMeManager.java:396) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.getRememberedIdentity(DefaultSecurityManager.java:604) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.resolvePrincipals(DefaultSecurityManager.java:492) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:342) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at $WebSecurityManager_439fe43247936.createSubject(Unknown Source) > > [na:na] > > > at > > org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148) > > > [shiro-web-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.tynamo.security.services.impl.SecurityConfiguration.service(SecurityConfiguration.java:51) > > > [tapestry-security-0.5.1.jar:0.5.1] > > > at $HttpServletRequestFilter_439fe43247931.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.got5.tapestry5.jquery.services.AjaxUploadServletRequestFilter.service(AjaxUploadServletRequestFilter.java:26) > > > [tapestry5-jquery-3.3.3.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44) > > > [tapestry-upload-5.3.7.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.tynamo.resteasy.ResteasyRequestFilter.service(ResteasyRequestFilter.java:100) > > > [tapestry-resteasy-0.3.1.jar:0.3.1] > > > at $HttpServletRequestFilter_439fe4324792e.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) > > > [tapestry-core-5.3.7.jar:na] > > > at $HttpServletRequestFilter_439fe4324792c.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.services.TapestryModule$1.service(TapestryModule.java:852) > > > [tapestry-core-5.3.7.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe4324792b.service(Unknown Source) > > [na:na] > > > at > org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:171) > > > [tapestry-core-5.3.7.jar:na] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:206) > > > [javamelody-core-1.43.0.jar:1.43.0] > > > at > > net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:179) > > > [javamelody-core-1.43.0.jar:1.43.0] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at com.hazelcast.web.WebFilter.doFilter(WebFilter.java:598) > > > [hazelcast-wm-2.5.jar:2.5] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) > > > [jetty-security-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at org.eclipse.jetty.server.Server.handle(Server.java:368) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:932) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:994) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) > > > [jetty-http-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) > > > [jetty-http-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) > > > [jetty-io-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) > > > [jetty-io-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) > > > [jetty-util-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) > > > [jetty-util-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at java.lang.Thread.run(Thread.java:662) [na:1.6.0_43] > > > [11:32:36] DEBUG [org.apache.shiro.web.servlet.SimpleCookie]: Added > > > HttpServletResponse Cookie [rememberMe=deleteMe; Path=/; Max-Age=0; > > > Expires=Wed, 05-Mar-2014 10:32:36 GMT] > > > [11:32:36] WARN [org.apache.shiro.mgt.DefaultSecurityManager]: > Delegate > > > RememberMeManager instance of type > > > [si.najdi.web.services.NajdiCookieRememberMeManager] threw an exception > > > during getRememberedPrincipals(). > > > org.apache.shiro.io.SerializationException: Unexpected end of ZLIB > input > > > stream > > > at > > > > > > > > > si.najdi.web.util.SimplePrincipalSerializer2.deserialize(SimplePrincipalSerializer2.java:85) > > > ~[classes/:na] > > > at > > > > > > > > > si.najdi.web.util.SimplePrincipalSerializer2.deserialize(SimplePrincipalSerializer2.java:17) > > > ~[classes/:na] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.deserialize(AbstractRememberMeManager.java:514) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.convertBytesToPrincipals(AbstractRememberMeManager.java:431) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.AbstractRememberMeManager.getRememberedPrincipals(AbstractRememberMeManager.java:396) > > > ~[shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.getRememberedIdentity(DefaultSecurityManager.java:604) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.resolvePrincipals(DefaultSecurityManager.java:492) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:342) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at $WebSecurityManager_439fe43247936.createSubject(Unknown Source) > > [na:na] > > > at > > org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846) > > > [shiro-core-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148) > > > [shiro-web-1.2.0.jar:1.2.0] > > > at > > > > > > > > > org.tynamo.security.services.impl.SecurityConfiguration.service(SecurityConfiguration.java:51) > > > [tapestry-security-0.5.1.jar:0.5.1] > > > at $HttpServletRequestFilter_439fe43247931.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.got5.tapestry5.jquery.services.AjaxUploadServletRequestFilter.service(AjaxUploadServletRequestFilter.java:26) > > > [tapestry5-jquery-3.3.3.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44) > > > [tapestry-upload-5.3.7.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.tynamo.resteasy.ResteasyRequestFilter.service(ResteasyRequestFilter.java:100) > > > [tapestry-resteasy-0.3.1.jar:0.3.1] > > > at $HttpServletRequestFilter_439fe4324792e.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) > > > [tapestry-core-5.3.7.jar:na] > > > at $HttpServletRequestFilter_439fe4324792c.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at > > > > > > > > > org.apache.tapestry5.services.TapestryModule$1.service(TapestryModule.java:852) > > > [tapestry-core-5.3.7.jar:na] > > > at $HttpServletRequestHandler_439fe43247934.service(Unknown Source) > > [na:na] > > > at $HttpServletRequestHandler_439fe4324792b.service(Unknown Source) > > [na:na] > > > at > org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:171) > > > [tapestry-core-5.3.7.jar:na] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:206) > > > [javamelody-core-1.43.0.jar:1.43.0] > > > at > > net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:179) > > > [javamelody-core-1.43.0.jar:1.43.0] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at com.hazelcast.web.WebFilter.doFilter(WebFilter.java:598) > > > [hazelcast-wm-2.5.jar:2.5] > > > at > > > > > > > > > org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) > > > [jetty-security-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) > > > [jetty-servlet-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at org.eclipse.jetty.server.Server.handle(Server.java:368) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:932) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:994) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:640) > > > [jetty-http-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) > > > [jetty-http-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) > > > [jetty-server-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) > > > [jetty-io-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) > > > [jetty-io-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) > > > [jetty-util-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at > > > > > > > > > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) > > > [jetty-util-8.1.9.v20130131.jar:8.1.9.v20130131] > > > at java.lang.Thread.run(Thread.java:662) [na:1.6.0_43] > > > > > > > > > > > > Regards, > > > Lidija > > > > > > > > > > > > On Thu, Mar 6, 2014 at 11:14 AM, Dusko Jovanovski <dusk...@gmail.com> > > > wrote: > > > > > > > Hello Lidija, could you try out this custom serializer and report > back > > > with > > > > the results? > > > > > > > > https://gist.github.com/duskote/0f8cce8d1b0d1cc56844 > > > > > > > > > > > > > > > > > >