.st0{fill:#FFFFFF;} .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;} Menu

.st0{fill:#FFFFFF;} .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;} Menu

/*! elementor - v3.21.0 - 08-05-2024 */ .elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}

学习 Spring 和 Spring Boot

从没有经验到实际构建东西

是什么让春天如此受欢迎?

/*! elementor - v3.21.0 - 08-05-2024 */ .elementor-widget-divider{–divider-border-style:none;–divider-border-width:1px;–divider-color:#0c0d0e;–divider-icon-size:20px;–divider-element-spacing:10px;–divider-pattern-height:24px;–divider-pattern-size:20px;–divider-pattern-url:none;–divider-pattern-repeat:repeat-x}.elementor-widget-divider .elementor-divider{display:flex}.elementor-widget-divider .elementor-divider__text{font-size:15px;line-height:1;max-width:95%}.elementor-widget-divider .elementor-divider__element{margin:0 var(–divider-element-spacing);flex-shrink:0}.elementor-widget-divider .elementor-icon{font-size:var(–divider-icon-size)}.elementor-widget-divider .elementor-divider-separator{display:flex;margin:0;direction:ltr}.elementor-widget-divider–view-line_icon .elementor-divider-separator,.elementor-widget-divider–view-line_text .elementor-divider-separator{align-items:center}.elementor-widget-divider–view-line_icon .elementor-divider-separator:after,.elementor-widget-divider–view-line_icon .elementor-divider-separator:before,.elementor-widget-divider–view-line_text .elementor-divider-separator:after,.elementor-widget-divider–view-line_text .elementor-divider-separator:before{display:block;content:"";border-block-end:0;flex-grow:1;border-block-start:var(–divider-border-width) var(–divider-border-style) var(–divider-color)}.elementor-widget-divider–element-align-left .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider–element-align-left .elementor-divider-separator:before{content:none}.elementor-widget-divider–element-align-left .elementor-divider__element{margin-left:0}.elementor-widget-divider–element-align-right .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider–element-align-right .elementor-divider-separator:after{content:none}.elementor-widget-divider–element-align-right .elementor-divider__element{margin-right:0}.elementor-widget-divider–element-align-start .elementor-divider .elementor-divider-separator>.elementor-divider__svg:first-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider–element-align-start .elementor-divider-separator:before{content:none}.elementor-widget-divider–element-align-start .elementor-divider__element{margin-inline-start:0}.elementor-widget-divider–element-align-end .elementor-divider .elementor-divider-separator>.elementor-divider__svg:last-of-type{flex-grow:0;flex-shrink:100}.elementor-widget-divider–element-align-end .elementor-divider-separator:after{content:none}.elementor-widget-divider–element-align-end .elementor-divider__element{margin-inline-end:0}.elementor-widget-divider:not(.elementor-widget-divider–view-line_text):not(.elementor-widget-divider–view-line_icon) .elementor-divider-separator{border-block-start:var(–divider-border-width) var(–divider-border-style) var(–divider-color)}.elementor-widget-divider–separator-type-pattern{–divider-border-style:none}.elementor-widget-divider–separator-type-pattern.elementor-widget-divider–view-line .elementor-divider-separator,.elementor-widget-divider–separator-type-pattern:not(.elementor-widget-divider–view-line) .elementor-divider-separator:after,.elementor-widget-divider–separator-type-pattern:not(.elementor-widget-divider–view-line) .elementor-divider-separator:before,.elementor-widget-divider–separator-type-pattern:not([class*=elementor-widget-divider–view]) .elementor-divider-separator{width:100%;min-height:var(–divider-pattern-height);-webkit-mask-size:var(–divider-pattern-size) 100%;mask-size:var(–divider-pattern-size) 100%;-webkit-mask-repeat:var(–divider-pattern-repeat);mask-repeat:var(–divider-pattern-repeat);background-color:var(–divider-color);-webkit-mask-image:var(–divider-pattern-url);mask-image:var(–divider-pattern-url)}.elementor-widget-divider–no-spacing{–divider-pattern-size:auto}.elementor-widget-divider–bg-round{–divider-pattern-repeat:round}.rtl .elementor-widget-divider .elementor-divider__text{direction:rtl}.e-con-inner>.elementor-widget-divider,.e-con>.elementor-widget-divider{width:var(–container-widget-width,100%);–flex-grow:var(–container-widget-flex-grow)}

/*! elementor - v3.21.0 - 08-05-2024 */ .elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}

到目前为止,Spring 是 Java 生态系统中最受欢迎的应用程序开发框架。差距很大。原因其实很简单——它做了很多正确的事情,而且每次发布都会变得越来越好。

没有多少技术像 Spring 那样具有广泛的覆盖范围、稳定性和成熟度,并且仍然快速发展和创新。这是一个非常难以达到的平衡,而 Spring 已经达到了十多年。

今天,Spring 和 Boot 是一个精致、现代且极具表现力的框架,可以轻松通过 Twitter 测试。这就是您可以实际将有用的功能放入一条推文🙂中的地方

因此,Spring 生态系统的受欢迎程度是当之无愧的。如果你在Java上工作,你很可能在用Spring工作。

/*! elementor - v3.21.0 - 08-05-2024 */ .elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=".svg"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}

ls-course-page-img-intro
ls-course-page-img-intro

ls-course-page-video-course
ls-course-page-video-course

通过视频学习 Spring,并完成实际项目

而且,虽然 Spring 生态系统非常庞大且发展迅速,但核心功能实际上非常稳定。

学习 Spring 意味着——学习核心、Spring MVC、持久性、Spring Security 的基础知识。这些是基础,就像所有好的基础一样,它们是稳定和完善的。

简而言之,现在是学习、练习和改进您的 Spring foo 的最佳时机,以引导的方式,与我一起完成这里的每个视频课程。

在我的其他课程中教过 4000 多名学生之后,我创建这些材料时有一个简单的目标——帮助您开始使用 Spring 和 Spring Boot。

循序渐进地学习 Spring

在每个模块中,你将构建实际代码。该视频旨在仔细向您展示如何通过在实践中使用它来理解 Spring 的单个方面。

以下 2 个班级中的每一个都具有不同的教育水平:

ls-master-dark-green
ls-master-dark-green

 大师班

该材料旨在将您从字面上没有 Spring 经验带到对框架基础知识的真实、扎实掌握。

简单地说,最后,你将能够使用Spring实际构建东西。

这 9 个深入的模块侧重于 2024 年框架的核心方面,包括 Spring 和 Boot,而不是回顾 Spring 的 XML 时代。

ls-certification-dark-green
ls-certification-dark-green

 认证类

这门课很简单——它包含大师班的完整材料,以及下载和多项选择题——以帮助您充分利用这些材料。完成后,您将获得该课程的“结业证书”。

视频,以及通过真实世界项目进行的实际编码实践,是学习复杂框架(如Spring)的最佳方式

 通过编码学习

这些课程从使用 Spring 构建简单但实用的应用程序的基础知识开始,并快速指导您使用工具来很好地浏览框架。

**
我的名字是Eugen,我将在整个课程中担任您的讲师。**

我在 Java 生态系统中工作了十多年,在那段时间里,我建立并领导团队完成了相当多的 Spring 实现。当然,在那段时间里,我一直在教授和写作关于春天的文章。

这里的教训来自那次经历,目标非常简单——让你对 Spring 和 Boot 非常熟悉。你不能只看视频来做到这一点——你需要和我一起编写代码,每一步。

视频和多项选择题是您在需要时返回的参考。

ls-course-page-learn-by-coding
ls-course-page-learn-by-coding

本课程侧重于弹簧和靴子的基础。

这些对于向前迈进、了解框架的更高级方面和构建更复杂的系统至关重要。

除了基础知识之外,还可以看看“REST With Spring”——因为它更深入地进入了 Spring 并构建了一个成熟的应用程序。

 大师班

Spring 和 Spring Boot 入门的规范参考。这 9 个模块涵盖了从创建应用程序到使用 Bean、项目配置、持久性和使用 Web MVC 的所有内容。简单地说,Spring 和 Boot 的基础知识。

除了详细的实现指南外,您还将了解该框架的全部灵活性,并开始使用 AOP、响应式编程模型和 Spring Security。

_
我希望在构建第一个 Spring 应用程序时能够访问的所有内容。_

 ~22 小时

[
Price without PPP: ~$207~

Access (with PPP) for $165.60→](https://courses.baeldung.com/purchase?product_id=5202926&coupon_code=PNCQ4N)

我在我的课程中支持平价购买力 (PPP),因为我想确保世界各地的每个开发人员都能负担得起它们。以上价格已经调整。

1. Spring 入门

6 节课 (6 个视频) ~ 1.5 小时

  1.  为什么选择春天?
  2. 了解完整的 Spring 生态系统
  3.  Spring Boot 简介
  4. 简单的开发环境
  5. 我们正在构建的真实世界项目
  6.  Maven 和 Spring

2. 依赖注入和 Spring 上下文

10 节课(5 个视频 + 5 个文本)~ 3.5 小时

  1. 什么是 DI,它在春季是如何工作的?
  2. Java 配置和 Spring 上下文的基础知识
  3. 定义 Bean、组件扫描和 Bean 注释
  4. Bean 的生命周期 – 初始化和销毁钩子
  5. 简单的接线和注射(2 部分)
  6. 探索 Spring Beans 的范围(文本)
  7. BeanPostProcessor 和 BeanFactoryPostProcessor(文本)
  8. Spring 应用程序上下文(文本)
  9. 弹簧接线 – @Resource和@Inject(文本)
  10. 调试和解决接线异常(文本)

3. 项目配置

8 节课(5 个视频 + 3 个文本)~ 3 小时

  1.  使用属性
  2. 在 Spring 中使用配置文件
  3. 登录 Spring Boot 项目 – 正确的方式
  4. 通过 IDE 部署引导应用程序
  5. Spring 测试框架(预览第 1 部分)
  6. 使用@PropertySource(文本)
  7. Spring Boot 默认属性(文本)
  8. 部署引导应用程序 - 其他选项(文本)

4. 深入了解 Spring Boot

3 节课(2 个视频 + 1 个文本)~ 1 小时

  1. Spring Boot 自动配置
  2. 启动中的执行器(预览课程)
  3. 启动中的执行器 – 自定义运行状况指示器(文本)

5. 持久性和数据访问

7 节课(4 个视频 + 3 个文本)~ 3 小时

  1. 使用 Spring Data JPA 的项目持久性
  2. 超越默认存储库
  3. 分页和排序
  4. 使用 JPA 和 Hibernate 的 Spring
  5. Spring 中的事务(文本)
  6. JdbcTemplate 简介 – 理论(文本)
  7. JdbcTemplate 简介 – 实现(文本)

6. Web 基础和 Spring MVC

6 节课(5 个视频 + 1 个文本)~ 2 小时

  1. 什么是 MVC 和 Spring MVC
  2. 扩展我们的第一个控制器(预览课程) 
  3. MVC 样式的应用程序与 REST API
  4. 将控制器与实体分离
  5.  使用 Boot 进行测试
  6. Servlet 和 DispatcherServlet(文本)

7. 模板引擎和 Spring MVC

5 节课(4 个视频 + 1 个文本)~ 1.5 小时

  1. 视图、视图解析器和模板引擎(2 部分)
  2. 使用 Thymeleaf 进行完整的创建操作
  3. 表单验证的基础知识
  4. 带有 FreeMarker 模板引擎的 Spring MVC
  5. 带有 Mustache 模板引擎的 Spring MVC(文本)

8. 构建 REST API

7 节课(3 个视频 + 4 个文本)~ 2.5 小时

  1. 控制器基础知识(2 部分)
  2. 控制器和请求/响应(文本)
  3. 控制器和 URL – @PathVariable注释(文本)
  4. 控制器和 URL – @RequestParam注释(文本)
  5. API 中的异常处理(2 部分)
  6. RestTemplate 简介
  7. Spring MVC 中的 HTTP 消息转换器简介(文本)

9. Spring 中的高级功能

9 节课(4 个视频 + 5 个文本)~ 4 小时

  1. 春季 AOP 简介
  2. Spring AOP in Practice(文本)
  3. Spring 表达式语言 (SpEL)
  4. 使用事件和侦听器
  5. 春季的新反应范式
  6. Spring Security 简介(文本)
  7. Spring Security 授权(文本)
  8.  Spring 代理(文本)
  9. Spring Boot with Docker(文本)

 认证类

本课程包含与大师课程相同的材料,但超出了核心材料,包括:

  • 每节课都有多项选择题,以确保您完全理解材料
  • 结业证书(示例)
  • 所有视频课程的下载功能 - 帮助您离线学习

_
当然,如果您对材料有任何疑问,请直接在这里、聊天或通过电子邮件联系我。_

 ~22 小时

ls-certification-white-green
ls-certification-white-green

/*! elementor - v3.21.0 - 08-05-2024 */ .elementor-column .elementor-spacer-inner{height:var(–spacer-size)}.e-con{–container-widget-width:100%}.e-con-inner>.elementor-widget-spacer,.e-con>.elementor-widget-spacer{width:var(–container-widget-width,var(–spacer-size));–align-self:var(–container-widget-align-self,initial);–flex-shrink:0}.e-con-inner>.elementor-widget-spacer>.elementor-widget-container,.e-con>.elementor-widget-spacer>.elementor-widget-container{height:100%;width:100%}.e-con-inner>.elementor-widget-spacer>.elementor-widget-container>.elementor-spacer,.e-con>.elementor-widget-spacer>.elementor-widget-container>.elementor-spacer{height:100%}.e-con-inner>.elementor-widget-spacer>.elementor-widget-container>.elementor-spacer>.elementor-spacer-inner,.e-con>.elementor-widget-spacer>.elementor-widget-container>.elementor-spacer>.elementor-spacer-inner{height:var(–container-widget-height,var(–spacer-size))}.e-con-inner>.elementor-widget-spacer.elementor-widget-empty,.e-con>.elementor-widget-spacer.elementor-widget-empty{position:relative;min-height:22px;min-width:22px}.e-con-inner>.elementor-widget-spacer.elementor-widget-empty .elementor-widget-empty-icon,.e-con>.elementor-widget-spacer.elementor-widget-empty .elementor-widget-empty-icon{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;padding:0;width:22px;height:22px}

[Price without PPP: ~$287~

Access (with PPP) for $229.60→](https://courses.baeldung.com/purchase?product_id=5202933&coupon_code=PNCQ4N)

我在我的课程中支持平价购买力 (PPP),因为我想确保世界各地的每个开发人员都能负担得起它们。以上价格已经调整。

/*! elementor-pro - v3.21.0 - 30-04-2024 */ .elementor-widget-price-list .elementor-price-list{list-style:none;padding:0;margin:0}.elementor-widget-price-list .elementor-price-list li{margin:0}.elementor-price-list li:not(:last-child){margin-bottom:20px}.elementor-price-list .elementor-price-list-image{max-width:50%;flex-shrink:0;padding-inline-end:25px}.elementor-price-list .elementor-price-list-image img{width:100%}.elementor-price-list .elementor-price-list-header,.elementor-price-list .elementor-price-list-item,.elementor-price-list .elementor-price-list-text{display:flex}.elementor-price-list .elementor-price-list-item{align-items:flex-start}.elementor-price-list .elementor-price-list-item .elementor-price-list-text{align-items:flex-start;flex-wrap:wrap;flex-grow:1}.elementor-price-list .elementor-price-list-item .elementor-price-list-header{align-items:center;flex-basis:100%;font-size:19px;font-weight:600;margin-bottom:10px;justify-content:space-between}.elementor-price-list .elementor-price-list-item .elementor-price-list-title{max-width:80%}.elementor-price-list .elementor-price-list-item .elementor-price-list-price{font-weight:600}.elementor-price-list .elementor-price-list-item p.elementor-price-list-description{flex-basis:100%;font-size:14px;margin:0}.elementor-price-list .elementor-price-list-item .elementor-price-list-separator{flex-grow:1;margin-left:10px;margin-right:10px;border-bottom-style:dotted;border-bottom-width:2px;height:0}.elementor-price-table{text-align:center}.elementor-price-table .elementor-price-table__header{background:var(–e-price-table-header-background-color,#555);padding:20px 0}.elementor-price-table .elementor-price-table__heading{margin:0;padding:0;line-height:1.2;font-size:24px;font-weight:600;color:#fff}.elementor-price-table .elementor-price-table__subheading{font-size:13px;font-weight:400;color:#fff}.elementor-price-table .elementor-price-table__original-price{margin-inline-end:15px;text-decoration:line-through;font-size:.5em;line-height:1;font-weight:400;align-self:center}.elementor-price-table .elementor-price-table__original-price .elementor-price-table__currency{font-size:1em;margin:0}.elementor-price-table .elementor-price-table__price{display:flex;justify-content:center;align-items:center;flex-wrap:wrap;flex-direction:row;color:#555;font-weight:800;font-size:65px;padding:40px 0}.elementor-price-table .elementor-price-table__price .elementor-typo-excluded{line-height:normal;letter-spacing:normal;text-transform:none;font-weight:400;font-size:;font-style:normal}.elementor-price-table .elementor-price-table__after-price{display:flex;flex-wrap:wrap;text-align:start;align-self:stretch;align-items:flex-start;flex-direction:column}.elementor-price-table .elementor-price-table__integer-part{line-height:.8}.elementor-price-table .elementor-price-table__currency,.elementor-price-table .elementor-price-table__fractional-part{line-height:1;font-size:.3em}.elementor-price-table .elementor-price-table__currency{margin-inline-end:3px}.elementor-price-table .elementor-price-table__period{width:100%;font-size:13px;font-weight:400}.elementor-price-table .elementor-price-table__features-list{list-style-type:none;margin:0;padding:0;line-height:1;color:var(–e-price-table-features-list-color)}.elementor-price-table .elementor-price-table__features-list li{font-size:14px;line-height:1;margin:0;padding:0}.elementor-price-table .elementor-price-table__features-list li .elementor-price-table__feature-inner{margin-left:15px;margin-right:15px}.elementor-price-table .elementor-price-table__features-list li:not(:first-child):before{content:"";display:block;border:0 solid hsla(0,0%,47.8%,.3);margin:10px 12.5%}.elementor-price-table .elementor-price-table__features-list i{margin-inline-end:10px;font-size:1.3em}.elementor-price-table .elementor-price-table__features-list svg{margin-inline-end:10px;fill:var(–e-price-table-features-list-color);height:1.3em;width:1.3em}.elementor-price-table .elementor-price-table__features-list svg~*{vertical-align:text-top}.elementor-price-table .elementor-price-table__footer{padding:30px 0}.elementor-price-table .elementor-price-table__additional_info{margin:0;font-size:13px;line-height:1.4}.elementor-price-table__ribbon{position:absolute;top:0;left:auto;right:0;transform:rotate(90deg);width:150px;overflow:hidden;height:150px}.elementor-price-table__ribbon-inner{text-align:center;left:0;width:200%;transform:translateY(-50%) translateX(-50%) translateX(35px) rotate(-45deg);margin-top:35px;font-size:13px;line-height:2;font-weight:800;text-transform:uppercase;background:#000}.elementor-price-table__ribbon.elementor-ribbon-left{transform:rotate(0);left:0;right:auto}.elementor-price-table__ribbon.elementor-ribbon-right{transform:rotate(90deg);left:auto;right:0}.elementor-widget-price-table .elementor-widget-container{overflow:hidden;background-color:#f9fafa}.e-con-inner>.elementor-widget-price-list,.e-con>.elementor-widget-price-list{width:var(–container-widget-width);–flex-grow:var(–container-widget-flex-grow)}

 大师班

**
开始使用 Spring Framework,其中包含完整的 9 个深入模块**

  •  所有 9 模块

  •  47节视频课

  • -

  • -

  • -

[**Price without PPP: ~$207~

Access (with PPP) for $165.60→**](https://courses.baeldung.com/purchase?product_id=5202926&coupon_code=PNCQ4N)

 认证类

**
本课程包括大师班材料、练习、下载和结业证书**

  •  所有 9 模块

  •  47节视频课

  • + 每节课的练习

  • + 所有视频的完整下载

  • + 结业证书

[Price without PPP: ~$287~

Access (with PPP) for $229.60→](https://courses.baeldung.com/purchase?product_id=5202933&coupon_code=PNCQ4N)

学习 Spring + 学习 Spring Data JPA - 认证课程

**
从头开始使用 Spring 和 Spring Data JPA**

  •  所有 15 模块

  •  73节视频课

  • + 每节课的练习

  • + 所有视频的完整下载

  • + 结业证书

[Price without PPP: ~$387~

Access (with PPP) for $309.60→](https://courses.baeldung.com/purchase?product_id=5202999&coupon_code=PNCQ4N)

如果您想报名参加该套餐的大师班,这里有一个直接链接

I support Parity Purchasing Power (PPP) on my courses, as I want to make sure they’re affordable for every developer around the world. The price above has already been adjusted.

如果你想同时获得这门课程以及学习 Spring Security 或 REST With Spring

查看批量包装→

您是否有一个团队可以从参加该课程中受益?


以下是我们的团队许可证→

rws-course-page-img-guarantee.png
rws-course-page-img-guarantee.png

20天退款保证

我坚信课程材料的质量,可以教你春季编码的基础知识。我在这些课程中投入了大量的工作和精力,希望你能充分利用它,并在春季比赛中提升你的水平。

我有信心通过20天退款保证支持所有课程。我希望您能够毫不犹豫地深入并体验这一资源的全部财富。

如果材料不合适,请在购买后 20 天内与我联系,并要求全额退款任何一门课程套餐。

Pivotal_Software-logo@2x.png
Pivotal_Software-logo@2x.png

Intuit-logo@2x.png
Intuit-logo@2x.png

Verizon-logo@2x.png
Verizon-logo@2x.png

Adobe_Systems-logo@2x.png
Adobe_Systems-logo@2x.png

Disney-logo@2x.png
Disney-logo@2x.png

SAP-logo@2x.png
SAP-logo@2x.png

Tableau-logo@2x.png
Tableau-logo@2x.png

Metro_Systems_Romania-logo@2x.png
Metro_Systems_Romania-logo@2x.png

Pitney_Bowes-logo@2x.png
Pitney_Bowes-logo@2x.png

Ericsson-logo@2x.png
Ericsson-logo@2x.png

[

最常见的问题,回答 –>](https://www.baeldung.com/learn-spring-faq)

 支持和隐私

 学习春季课程

**
免费课程(来自 Learn Spring)**

/\* \*/ var groupContentPPP = {"1":{"message":"I support Parity Purchasing Power (PPP) on my courses, as I want to make sure they're affordable for every developer around the world. The price above has already been adjusted.","ppp\_amount":"35","ppp\_operator":"%","ppp\_code":"B8VQU6"},"2":{"message":"I support Parity Purchasing Power (PPP) on my courses, as I want to make sure they're affordable for every developer around the world. The price above has already been adjusted.","ppp\_amount":"30","ppp\_operator":"%","ppp\_code":"QONCQ1"},"3":{"message":"I support Parity Purchasing Power (PPP) on my courses, as I want to make sure they're affordable for every developer around the world. The price above has already been adjusted.","ppp\_amount":"25","ppp\_operator":"%","ppp\_code":"YQB8NV"},"4":{"message":"I support Parity Purchasing Power (PPP) on my courses, as I want to make sure they're affordable for every developer around the world. The price above has already been adjusted.","ppp\_amount":"20","ppp\_operator":"%","ppp\_code":"PNCQ4N"}}; /\* \*/ /\* \*/ /\* $\[original\_price\]<\\/s>

Access (with PPP) for $\[ppp\]\\u2192","ppp\_group\_codes":{"AL":"1","KH":"1","KE":"1","NG":"1","NP":"1","HU":"4","MD":"3","ZA":"3","MX":"4","CO":"4","LK":"3","RU":"2","RO":"3","AR":"3","MY":"2","PH":"2","BG":"2","VN":"2","PK":"2","UA":"2","EG":"2","ID":"2","IN":"2","TR":"2","KR":"4","LV":"3","PT":"3","TW":"3","PL":"4","TH":"3","BR":"4","TN":"1","IT":"4","JP":"4","EE":"4","ES":"4","LT":"3","CZ":"4","CN":"4","RS":"3","SA":"4","FR":"4"}}; /\* \]\]> \*/ /\* \*/ /\* \*/ /\* \*/ /\* \*/ /\* \*/ /\* \*/ /\* \*/ var \_dcq = \_dcq || \[\]; var \_dcs = \_dcs || {}; \_dcs.account = '9539554'; (function() { var dc = document.createElement('script'); dc.type = 'text/javascript'; dc.async = true; dc.src = '//tag.getdrip.com/9539554.js'; var s = document.getElementsByTagName('script')\[0\]; s.parentNode.insertBefore(dc, s); })(); function b2a(a){var b,c=0,l=0,f="",g=\[\];if(!a)return a;do{var e=a.charCodeAt(c++);var h=a.charCodeAt(c++);var k=a.charCodeAt(c++);var d=e<<16|h<<8|k;e=63&d>>18;h=63&d>>12;k=63&d>>6;d&=63;g\[l++\]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(e)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(h)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(k)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(d)}while(c< a.length);return f=g.join(""),b=a.length%3,(b?f.slice(0,b-3):f)+"===".slice(b||3)}function a2b(a){var b,c,l,f={},g=0,e=0,h="",k=String.fromCharCode,d=a.length;for(b=0;64>b;b++)f\["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(b)\]=b;for(c=0;d>c;c++)for(b=f\[a.charAt(c)\],g=(g<<6)+b,e+=6;8<=e;)((l=255&g>>>(e-=8))||d-2>c)&&(h+=k(l));return h}b64e=function(a){return btoa(encodeURIComponent(a).replace(/%(\[0-9A-F\]{2})/g,function(b,a){return String.fromCharCode("0x"+a)}))}; b64d=function(a){return decodeURIComponent(atob(a).split("").map(function(a){return"%"+("00"+a.charCodeAt(0).toString(16)).slice(-2)}).join(""))}; /\* \*/ var ai\_cookie\_js=!0,ai\_block\_class\_def="code-block"; /\* JavaScript Cookie v2.2.0 https://github.com/js-cookie/js-cookie Copyright 2006, 2015 Klaus Hartl & Fagner Brack Released under the MIT license \*/ "undefined"!==typeof ai\_cookie\_js&&(function(a){if("function"===typeof define&&define.amd){define(a);var c=!0}"object"===typeof exports&&(module.exports=a(),c=!0);if(!c){var d=window.Cookies,b=window.Cookies=a();b.noConflict=function(){window.Cookies=d;return b}}}(function(){function a(){for(var d=0,b={};dc\[a\]\[d\]&&f==b){e=new Date;e=-c\[a\]\[d\]-Math.round(e.getTime()/1E3);if(0c\[a\]\[d\]&&f==b){e=new Date;e=-c\[a\]\[d\]- Math.round(e.getTime()/1E3);if(0=0&&(c=c.substring(0,j)+"(\[\\\\w.\_\\\\+\]+)"+c.substring(j+5)),b\[e\]=new RegExp(c,"i");k.props\[a\]=b}d(k.oss),d(k.phones),d(k.tablets),d(k.uas),d(k.utils),k.oss0={WindowsPhoneOS:k.oss.WindowsPhoneOS,WindowsMobileOS:k.oss.WindowsMobileOS}}(),g.findMatch=function(a,b){for(var c in a)if(i.call(a,c)&&a\[c\].test(b))return c;return null},g.findMatches=function(a,b){var c=\[\];for(var d in a)i.call(a,d)&&a\[d\].test(b)&&c.push(d);return c},g.getVersionStr=function(a,b){var c,d,e,f,h=g.mobileDetectRules.props;if(i.call(h,a))for(c=h\[a\],e=c.length,d=0;d1&&(a=b\[0\]+".",b.shift(),a+=b.join("")),Number(a)},g.isMobileFallback=function(a){return g.detectMobileBrowsers.fullPattern.test(a)||g.detectMobileBrowsers.shortPattern.test(a.substr(0,4))},g.isTabletFallback=function(a){return g.detectMobileBrowsers.tabletPattern.test(a)},g.prepareDetectionCache=function(a,c,d){if(a.mobile===b){var e,h,i;return(h=g.findMatch(g.mobileDetectRules.tablets,c))?(a.mobile=a.tablet=h,void(a.phone=null)):(e=g.findMatch(g.mobileDetectRules.phones,c))?(a.mobile=a.phone=e,void(a.tablet=null)):void(g.isMobileFallback(c)?(i=f.isPhoneSized(d),i===b?(a.mobile=g.FALLBACK\_MOBILE,a.tablet=a.phone=null):i?(a.mobile=a.phone=g.FALLBACK\_PHONE,a.tablet=null):(a.mobile=a.tablet=g.FALLBACK\_TABLET,a.phone=null)):g.isTabletFallback(c)?(a.mobile=a.tablet=g.FALLBACK\_TABLET,a.phone=null):a.mobile=a.tablet=a.phone=null)}},g.mobileGrade=function(a){var b=null!==a.mobile();return a.os("iOS")&&a.version("iPad")>=4.3||a.os("iOS")&&a.version("iPhone")>=3.1||a.os("iOS")&&a.version("iPod")>=3.1||a.version("Android")>2.1&&a.is("Webkit")||a.version("Windows Phone OS")>=7||a.is("BlackBerry")&&a.version("BlackBerry")>=6||a.match("Playbook.\*Tablet")||a.version("webOS")>=1.4&&a.match("Palm|Pre|Pixi")||a.match("hp.\*TouchPad")||a.is("Firefox")&&a.version("Firefox")>=12||a.is("Chrome")&&a.is("AndroidOS")&&a.version("Android")>=4||a.is("Skyfire")&&a.version("Skyfire")>=4.1&&a.is("AndroidOS")&&a.version("Android")>=2.3||a.is("Opera")&&a.version("Opera Mobi")>11&&a.is("AndroidOS")||a.is("MeeGoOS")||a.is("Tizen")||a.is("Dolfin")&&a.version("Bada")>=2||(a.is("UC Browser")||a.is("Dolfin"))&&a.version("Android")>=2.3||a.match("Kindle Fire")||a.is("Kindle")&&a.version("Kindle")>=3||a.is("AndroidOS")&&a.is("NookTablet")||a.version("Chrome")>=11&&!b||a.version("Safari")>=5&&!b||a.version("Firefox")>=4&&!b||a.version("MSIE")>=7&&!b||a.version("Opera")>=10&&!b?"A":a.os("iOS")&&a.version("iPad")<4.3||a.os("iOS")&&a.version("iPhone")<3.1||a.os("iOS")&&a.version("iPod")<3.1||a.is("Blackberry")&&a.version("BlackBerry")>=5&&a.version("BlackBerry")<6||a.version("Opera Mini")>=5&&a.version("Opera Mini")<=6.5&&(a.version("Android")>=2.3||a.is("iOS"))||a.match("NokiaN8|NokiaC7|N97.\*Series60|Symbian/3")||a.version("Opera Mobi")>=11&&a.is("SymbianOS")?"B":(a.version("BlackBerry")<5||a.match("MSIEMobile|Windows CE.\*Mobile")||a.version("Windows Mobile")<=5.2,"C")},g.detectOS=function(a){return g.findMatch(g.mobileDetectRules.oss0,a)||g.findMatch(g.mobileDetectRules.oss,a)},g.getDeviceSmallerSide=function(){return window.screen.width{a.matches(".ai-list-data")?x.push(a):(a=a.querySelectorAll(".ai-list-data"),a.length&&a.forEach((k,l)=>{x.push(k)}))}); b=x}if(b.length){b.forEach((a,d)=>{a.classList.remove("ai-list-data")});var L=ia(window.location.search);if(null!=L.referrer)var A=L.referrer;else A=document.referrer,""!=A&&(A=ha(A));var R=window.navigator.userAgent,S=R.toLowerCase(),aa=navigator.language,M=aa.toLowerCase();if("undefined"!==typeof MobileDetect)var ba=new MobileDetect(R);b.forEach((a,d)=>{var k=document.cookie.split(";");k.forEach(function(f,h){k\[h\]=f.trim()});d=a.closest("div."+ai\_block\_class\_def);var l=!0;if(a.hasAttribute("referer-list")){var n= a.getAttribute("referer-list");n=b64d(n).split(",");var v=a.getAttribute("referer-list-type"),E=!1;n.every((f,h)=>{f=f.trim();if(""==f)return!0;if("\*"==f.charAt(0))if("\*"==f.charAt(f.length-1)){if(f=f.substr(1,f.length-2),-1!=A.indexOf(f))return E=!0,!1}else{if(f=f.substr(1),A.substr(-f.length)==f)return E=!0,!1}else if("\*"==f.charAt(f.length-1)){if(f=f.substr(0,f.length-1),0==A.indexOf(f))return E=!0,!1}else if("#"==f){if(""==A)return E=!0,!1}else if(f==A)return E=!0,!1;return!0});var r=E;switch(v){case "B":r&& (l=!1);break;case "W":r||(l=!1)}}if(l&&a.hasAttribute("client-list")&&"undefined"!==typeof ba)switch(n=a.getAttribute("client-list"),n=b64d(n).split(","),v=a.getAttribute("client-list-type"),r=!1,n.every((f,h)=>{if(""==f.trim())return!0;f.split("&&").every((c,t)=>{t=!0;var w=!1;for(c=c.trim();"!!"==c.substring(0,2);)t=!t,c=c.substring(2);"language:"==c.substring(0,9)&&(w=!0,c=c.substring(9).toLowerCase());var q=!1;w?"\*"==c.charAt(0)?"\*"==c.charAt(c.length-1)?(c=c.substr(1,c.length-2).toLowerCase(), -1!=M.indexOf(c)&&(q=!0)):(c=c.substr(1).toLowerCase(),M.substr(-c.length)==c&&(q=!0)):"\*"==c.charAt(c.length-1)?(c=c.substr(0,c.length-1).toLowerCase(),0==M.indexOf(c)&&(q=!0)):c==M&&(q=!0):"\*"==c.charAt(0)?"\*"==c.charAt(c.length-1)?(c=c.substr(1,c.length-2).toLowerCase(),-1!=S.indexOf(c)&&(q=!0)):(c=c.substr(1).toLowerCase(),S.substr(-c.length)==c&&(q=!0)):"\*"==c.charAt(c.length-1)?(c=c.substr(0,c.length-1).toLowerCase(),0==S.indexOf(c)&&(q=!0)):ba.is(c)&&(q=!0);return(r=q?t:!t)?!0:!1});return r? !1:!0}),v){case "B":r&&(l=!1);break;case "W":r||(l=!1)}var N=n=!1;for(v=1;2>=v;v++)if(l){switch(v){case 1:var g=a.getAttribute("cookie-list");break;case 2:g=a.getAttribute("parameter-list")}if(null!=g){g=b64d(g);switch(v){case 1:var y=a.getAttribute("cookie-list-type");break;case 2:y=a.getAttribute("parameter-list-type")}g=g.replace("tcf-gdpr","tcf-v2\[gdprApplies\]=true");g=g.replace("tcf-no-gdpr","tcf-v2\[gdprApplies\]=false");g=g.replace("tcf-google","tcf-v2\[vendor\]\[consents\]\[755\]=true && tcf-v2\[purpose\]\[consents\]\[1\]=true"); g=g.replace("tcf-no-google","!!tcf-v2\[vendor\]\[consents\]\[755\]");g=g.replace("tcf-media.net","tcf-v2\[vendor\]\[consents\]\[142\]=true && tcf-v2\[purpose\]\[consents\]\[1\]=true");g=g.replace("tcf-no-media.net","!!tcf-v2\[vendor\]\[consents\]\[142\]");g=g.replace("tcf-amazon","tcf-v2\[vendor\]\[consents\]\[793\]=true && tcf-v2\[purpose\]\[consents\]\[1\]=true");g=g.replace("tcf-no-amazon","!!tcf-v2\[vendor\]\[consents\]\[793\]");g=g.replace("tcf-ezoic","tcf-v2\[vendor\]\[consents\]\[347\]=true && tcf-v2\[purpose\]\[consents\]\[1\]=true");g=g.replace("tcf-no-ezoic", "!!tcf-v2\[vendor\]\[consents\]\[347\]");var F=g.split(","),ca=\[\];k.forEach(function(f){f=f.split("=");try{var h=JSON.parse(decodeURIComponent(f\[1\]))}catch(c){h=decodeURIComponent(f\[1\])}ca\[f\[0\]\]=h});r=!1;var I=a;F.every((f,h)=>{f.split("&&").every((c,t)=>{t=!0;for(c=c.trim();"!!"==c.substring(0,2);)t=!t,c=c.substring(2);var w=c,q="!@!",T="tcf-v2"==w&&"!@!"==q,B=-1!=c.indexOf("\["),J=0==c.indexOf("tcf-v2")||0==c.indexOf("euconsent-v2");J=J&&(B||T);-1!=c.indexOf("=")&&(q=c.split("="),w=q\[0\],q=q\[1\],B=-1!=w.indexOf("\["), J=(J=0==w.indexOf("tcf-v2")||0==w.indexOf("euconsent-v2"))&&(B||T));if(J)document.querySelector("#ai-iab-tcf-status"),B=document.querySelector("#ai-iab-tcf-bar"),null!=B&&(B.style.display="block"),T&&"boolean"==typeof ai\_tcfapi\_found?r=ai\_tcfapi\_found?t:!t:"object"==typeof ai\_tcData?(null!=B&&B.classList.add("status-ok"),w=w.replace(/\]| /gi,"").split("\["),w.shift(),r=(w=e(w,ai\_tcData,q))?t:!t):"undefined"==typeof ai\_tcfapi\_found&&(I.classList.add("ai-list-data"),N=!0,"function"==typeof \_\_tcfapi?C(!1): "undefined"==typeof ai\_tcData\_retrying&&(ai\_tcData\_retrying=!0,setTimeout(function(){"function"==typeof \_\_tcfapi?C(!1):setTimeout(function(){"function"==typeof \_\_tcfapi?C(!1):setTimeout(function(){C(!0)},3E3)},1E3)},600)));else if(B)r=(w=p(ca,w,q))?t:!t;else{var U=!1;"!@!"==q?k.every(function(ja){return ja.split("=")\[0\]==c?(U=!0,!1):!0}):U=-1!=k.indexOf(c);r=U?t:!t}return r?!0:!1});return r?!1:!0});r&&(N=!1,I.classList.remove("ai-list-data"));switch(y){case "B":r&&(l=!1);break;case "W":r||(l=!1)}}}a.classList.contains("ai-list-manual")&& (l?(I.classList.remove("ai-list-data"),I.classList.remove("ai-list-manual")):(n=!0,I.classList.add("ai-list-data")));(l||!n&&!N)&&a.hasAttribute("data-debug-info")&&(g=document.querySelector("."+a.dataset.debugInfo),null!=g&&(g=g.parentElement,null!=g&&g.classList.contains("ai-debug-info")&&g.remove()));y=X(a,".ai-debug-bar.ai-debug-lists");var ka=""==A?"#":A;0!=y.length&&y.forEach((f,h)=>{h=f.querySelector(".ai-debug-name.ai-list-info");null!=h&&(h.textContent=ka,h.title=R+"\\n"+aa);h=f.querySelector(".ai-debug-name.ai-list-status"); null!=h&&(h.textContent=l?ai\_front.visible:ai\_front.hidden)});g=!1;if(l&&a.hasAttribute("scheduling-start")&&a.hasAttribute("scheduling-end")&&a.hasAttribute("scheduling-days")){var u=a.getAttribute("scheduling-start");v=a.getAttribute("scheduling-end");y=a.getAttribute("scheduling-days");g=!0;u=b64d(u);F=b64d(v);var V=parseInt(a.getAttribute("scheduling-fallback")),O=parseInt(a.getAttribute("gmt"));if(u.includes("-")||F.includes("-"))P=Y(u)+O,K=Y(F)+O;else var P=Q(u),K=Q(F);P??=0;K??=0;var W=b64d(y).split(","); y=a.getAttribute("scheduling-type");var D=(new Date).getTime()+O;v=new Date(D);var G=v.getDay();0==G?G=6:G--;u.includes("-")||F.includes("-")||(u=(new Date(v.getFullYear(),v.getMonth(),v.getDate())).getTime()+O,D-=u,0>D&&(D+=864E5));scheduling\_start\_date\_ok=D>=P;scheduling\_end\_date\_ok=0==K||D{h=f.querySelector(".ai-debug-name.ai-scheduling-info");null!=h&&(h.textContent=la+" "+G+" current\_time: "+Math.floor(D.toString()/1E3)+" start\_date:"+Math.floor(P/1E3).toString()+"=>"+scheduling\_start\_date\_ok.toString()+" end\_date:"+Math.floor(K/1E3).toString()+"=>"+scheduling\_end\_date\_ok.toString()+" days:"+W.toString()+"=>"+W.includes(G.toString()).toString());h=f.querySelector(".ai-debug-name.ai-scheduling-status");null!=h&&(h.textContent=l?ai\_front.visible:ai\_front.hidden); l||0==V||(f.classList.remove("ai-debug-scheduling"),f.classList.add("ai-debug-fallback"),h=f.querySelector(".ai-debug-name.ai-scheduling-status"),null!=h&&(h.textContent=ai\_front.fallback+" = "+V))})}if(n||!l&&N)return!0;a.style.visibility="";a.style.position="";a.style.width="";a.style.height="";a.style.zIndex="";if(l){if(null!=d&&(d.style.visibility="",d.classList.contains("ai-remove-position")&&(d.style.position="")),a.hasAttribute("data-code")){n=b64d(a.dataset.code);u=document.createRange(); g=!0;try{H=u.createContextualFragment(n)}catch(f){g=!1}g&&(null!=a.closest("head")?(a.parentNode.insertBefore(H,a.nextSibling),a.remove()):a.append(H));da(a)}}else if(g&&!u&&0!=V){null!=d&&(d.style.visibility="",d.classList.contains("ai-remove-position")&&d.css({position:""}));n=fa(a,".ai-fallback");0!=n.length&&n.forEach((f,h)=>{f.classList.remove("ai-fallback")});if(a.hasAttribute("data-fallback-code")){n=b64d(a.dataset.fallbackCode);u=document.createRange();g=!0;try{var H=u.createContextualFragment(n)}catch(f){g= !1}g&&a.append(H);da(a)}else a.style.display="none",null!=d&&null==d.querySelector(".ai-debug-block")&&d.hasAttribute("style")&&-1==d.getAttribute("style").indexOf("height:")&&(d.style.display="none");null!=d&&d.hasAttribute("data-ai")&&(d.getAttribute("data-ai"),a.hasAttribute("fallback-tracking")&&(H=a.getAttribute("fallback-tracking"),d.setAttribute("data-ai-"+a.getAttribute("fallback\_level"),H)))}else a.style.display="none",null!=d&&(d.removeAttribute("data-ai"),d.classList.remove("ai-track"), null!=d.querySelector(".ai-debug-block")?(d.style.visibility="",d.classList.remove("ai-close"),d.classList.contains("ai-remove-position")&&(d.style.position="")):d.hasAttribute("style")&&-1==d.getAttribute("style").indexOf("height:")&&(d.style.display="none"));a.setAttribute("data-code","");a.setAttribute("data-fallback-code","");null!=d&&d.classList.remove("ai-list-block")})}};function ea(b){b=\`; ${document.cookie}\`.split(\`; ${b}=\`);if(2===b.length)return b.pop().split(";").shift()}function ma(b, e,p){ea(b)&&(document.cookie=b+"="+(e?";path="+e:"")+(p?";domain="+p:"")+";expires=Thu, 01 Jan 1970 00:00:01 GMT")}function m(b){ea(b)&&(ma(b,"/",window.location.hostname),document.cookie=b+"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;")}(function(b){"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?b():document.addEventListener("DOMContentLoaded",b)})(function(){setTimeout(function(){ai\_process\_lists();setTimeout(function(){Z();if("function"== typeof ai\_load\_blocks){document.addEventListener("cmplzEnableScripts",e);document.addEventListener("cmplz\_event\_marketing",e);function e(p){"cmplzEnableScripts"!=p.type&&"all"!==p.consentLevel||ai\_load\_blocks()}}},50);var b=document.querySelector(".ai-debug-page-type");null!=b&&b.addEventListener("dblclick",e=>{e=document.querySelector("#ai-iab-tcf-status");null!=e&&(e.textContent="CONSENT COOKIES");e=document.querySelector("#ai-iab-tcf-bar");null!=e&&(e.style.display="block")});b=document.querySelector("#ai-iab-tcf-bar"); null!=b&&b.addEventListener("click",e=>{m("euconsent-v2");m("\_\_lxG\_\_consent\_\_v2");m("\_\_lxG\_\_consent\_\_v2\_daisybit");m("\_\_lxG\_\_consent\_\_v2\_gdaisybit");m("CookieLawInfoConsent");m("cookielawinfo-checkbox-advertisement");m("cookielawinfo-checkbox-analytics");m("cookielawinfo-checkbox-necessary");m("complianz\_policy\_id");m("complianz\_consent\_status");m("cmplz\_marketing");m("cmplz\_consent\_status");m("cmplz\_preferences");m("cmplz\_statistics-anonymous");m("cmplz\_choice");m("cmplz\_banner-status");m("cmplz\_functional"); m("cmplz\_policy\_id");m("cmplz\_statistics");m("moove\_gdpr\_popup");m("real\_cookie\_banner-blog:1-tcf");m("real\_cookie\_banner-blog:1");e=document.querySelector("#ai-iab-tcf-status");null!=e&&(e.textContent="CONSENT COOKIES DELETED")})},5)});function da(b){setTimeout(function(){"function"==typeof ai\_process\_rotations\_in\_element&&ai\_process\_rotations\_in\_element(b);"function"==typeof ai\_process\_lists&&ai\_process\_lists();"function"==typeof ai\_process\_ip\_addresses&&ai\_process\_ip\_addresses();"function"==typeof ai\_process\_filter\_hooks&& ai\_process\_filter\_hooks();"function"==typeof ai\_adb\_process\_blocks&&ai\_adb\_process\_blocks(b);"function"==typeof ai\_process\_impressions&&1==ai\_tracking\_finished&&ai\_process\_impressions();"function"==typeof ai\_install\_click\_trackers&&1==ai\_tracking\_finished&&ai\_install\_click\_trackers();"function"==typeof ai\_install\_close\_buttons&&ai\_install\_close\_buttons(document)},5)}function ia(b){var e=b?b.split("?")\[1\]:window.location.search.slice(1);b={};if(e){e=e.split("#")\[0\];e=e.split("&");for(var p=0;p{a.classList.remove("ai-ip-data")});var g=!1;if(""!=ai\_ip\_data){try{var l=JSON.parse(ai\_ip\_data),f=l\[0\],r=l\[1\],p=l\[2\],q=l\[3\]}catch(a){return}var t=!1;-1!=f.indexOf("#")&&(t=!0, f=f.replace("#",""));var e="";t&&(e="CFP BLOCKED, ");e=e+f+", "+r;null!=p&&null!=q&&(e=e+":"+p+":"+q);null==p&&(p="");null==q&&(q="");null!=l&&b.forEach((a,c)=>{c=a.closest("div."+ai\_block\_class\_def);g=!0;if(a.hasAttribute("ip-addresses")){var h=a.getAttribute("ip-addresses").split(","),m=a.getAttribute("ip-address-list"),k=!1;h.every((d,n)=>{if("\*"==d.charAt(0))if("\*"==d.charAt(d.length-1)){if(d=d.substr(1,d.length-2),-1!=f.indexOf(d))return k=!0,!1}else{if(d=d.substr(1),f.substr(-d.length)==d)return k= !0,!1}else if("\*"==d.charAt(d.length-1)){if(d=d.substr(0,d.length-1),0==f.indexOf(d))return k=!0,!1}else if("#"==d){if(""==f)return k=!0,!1}else if("CFP"==d.toUpperCase()){if(t)return k=!0,!1}else if(d==f)return k=!0,!1;return!0});switch(m){case "B":k&&(g=!1);break;case "W":k||(g=!1)}}if(g&&a.hasAttribute("countries"))switch(h=a.getAttribute("countries").split(","),m=a.getAttribute("country-list"),k=!1,h.every((d,n)=>{n=d.trim().split(":");if(null==n\[1\]||""==p)n\[1\]="";if(null==n\[2\]||""==q)n\[2\]=""; d=n.join(":").toUpperCase();n=(r+":"+(""==n\[1\]?"":p)+":"+(""==n\[2\]?"":q)).toUpperCase();return d==n?(k=!0,!1):!0}),m){case "B":k&&(g=!1);break;case "W":k||(g=!1)}a.style.visibility="";a.style.position="";a.style.width="";a.style.height="";a.style.zIndex="";for(h=a.previousElementSibling;h&&!h.matches(".ai-debug-bar");)h=h.previousElementSibling;null!=h&&(m=h.querySelector(".ai-debug-name.ai-ip-country"),null!=m&&(m.textContent=e),m=h.querySelector(".ai-debug-name.ai-ip-status"),null!=m&&(m.textContent= g?ai\_front.visible:ai\_front.hidden));if(g){if(null!=c&&(c.style.visibility="",c.classList.contains("ai-remove-position")&&(c.style.position="")),a.hasAttribute("data-code")){h=b64d(a.dataset.code);m=document.createRange();var w=!0;try{var x=m.createContextualFragment(h)}catch(d){w=!1}w&&(null!=a.closest("head")?(a.parentNode.insertBefore(x,a.nextSibling),a.remove()):a.append(x));a.removeAttribute("data-code");z(a)}}else a.style.display="none",null!=c&&(c.removeAttribute("data-ai"),c.classList.remove("ai-track"), null!=c.querySelector(".ai-debug-block")?(c.style.visibility="",c.classList.remove("ai-close"),c.classList.contains("ai-remove-position")&&(c.style.position=""),a.hasAttribute("data-code")&&(c.classList.remove("ai-list-block"),c.classList.remove("ai-list-block-filter"),null!=c.previousElementSibling&&c.previousElementSibling.classList.contains("ai-debug-info")&&c.previousElementSibling.remove())):c.hasAttribute("style")&&-1==c.getAttribute("style").indexOf("height:")&&(c.style.display="none"));null!= c&&c.classList.remove("ai-list-block-ip")})}}ai\_process\_ip\_addresses=function(b){if(null==b)b=document.querySelectorAll("div.ai-ip-data, meta.ai-ip-data");else{window.jQuery&&window.jQuery.fn&&b instanceof jQuery&&(b=Array.prototype.slice.call(b));var g=\[\];b.forEach((e,a)=>{e.matches(".ai-ip-data")?g.push(e):(e=e.querySelectorAll(".ai-ip-data"),e.length&&e.forEach((c,h)=>{g.push(c)}))});b=g}if(b.length)if("undefined"!=typeof ai\_ip\_data)v(b);else if("undefined"==typeof ai\_ip\_data\_requested){ai\_ip\_data\_requested= !0;var l=ai\_ajax\_url+"?action=ai\_ajax&ip-data=ip-address-country-city",f=u("ai-debug-ip-address");null!=f&&(l+="&ai-debug-ip-address="+f);f=u("ai-debug-country");null!=f&&(l+="&ai-debug-country="+f);f={ai\_check:ai\_data\_id,version:y()};var r=\[\],p;for(p in f){var q=encodeURIComponent(p),t=encodeURIComponent(f\[p\]);r.push(q+"="+t)}r=r.join("&");(async function(){return await (await fetch(l,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:r})).text()})().then(e=> {ai\_ip\_data=e;if(""==e){var a="Ajax request returned empty data, geo-targeting disabled";console.error(a);"undefined"!=typeof ai\_js\_errors&&ai\_js\_errors.push(\[a,l,0\])}else try{JSON.parse(e)}catch(c){a="Ajax call returned invalid data, geo-targeting disabled",console.error(a,e),"undefined"!=typeof ai\_js\_errors&&ai\_js\_errors.push(\[a,l,0\])}b=document.querySelectorAll("div.ai-ip-data, meta.ai-ip-data");b.length&&v(b)}).catch(e=>{document.querySelectorAll("div.ai-ip-data").forEach((a,c)=>{a.style.display= "none";a.style.visibility="";a.style.position="";a.style.width="";a.style.height="";a.style.zIndex="";a.classList.remove("ai-ip-data")})})}};(function(b){"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?b():document.addEventListener("DOMContentLoaded",b)})(function(){setTimeout(function(){ai\_process\_ip\_addresses()},5)});function z(b){setTimeout(function(){"function"==typeof ai\_process\_rotations\_in\_element&&ai\_process\_rotations\_in\_element(b);"function"== typeof ai\_process\_lists&&ai\_process\_lists();"function"==typeof ai\_process\_ip\_addresses&&ai\_process\_ip\_addresses();"function"==typeof ai\_process\_filter\_hooks&&ai\_process\_filter\_hooks();"function"==typeof ai\_adb\_process\_blocks&&ai\_adb\_process\_blocks(b);"function"==typeof ai\_process\_impressions&&1==ai\_tracking\_finished&&ai\_process\_impressions();"function"==typeof ai\_install\_click\_trackers&&1==ai\_tracking\_finished&&ai\_install\_click\_trackers();"function"==typeof ai\_install\_close\_buttons&&ai\_install\_close\_buttons(document)}, 5)}}; ai\_js\_code = true;

×