一种数据存储方法和装置

文档序号:1952021 发布日期:2021-12-10 浏览:3次 >En<

阅读说明:本技术 一种数据存储方法和装置 (Data storage method and device ) 是由 林艳 周德辉 文小东 史金昊 崔词茗 于 2020-06-22 设计创作,主要内容包括:本发明公开了数据存储方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。从而,本发明的实施方式能够解决现有用户分层数据存储效率低,不易管理的问题。(The invention discloses a data storage method and a data storage device, and relates to the technical field of computers. One specific embodiment of the method includes receiving user hierarchical data obtained through a user hierarchical computation task, writing the user hierarchical data into a preset hot data set based on storage time and a model; according to the filing task, filing the user hierarchical data meeting a preset period in the hot data set into a preset cold data set according to a dump model, and further obtaining partition codes of the user hierarchical data in the cold data set; and calling an archiving metadata writing service, acquiring storage time, a model, archiving time and partition codes corresponding to the user hierarchical data, and further writing the storage time, the model, the archiving time and the partition codes into a data archiving metadata table of the database. Therefore, the embodiment of the invention can solve the problems of low efficiency and difficult management of the existing user hierarchical data storage.)

一种数据存储方法和装置

技术领域

本发明涉及计算机技术领域,尤其涉及一种数据存储方法和装置。

背景技术

电商平台需要为平台商家提供数字化用户运营系统,以支持其在平台的用户运营管理。为了使营销活动和用户运营策略更具有针对性,建立了4A用户分层模型,根据用户与品牌商品互动行为的深浅程度将用户分为认知(Aware)、吸引(Appeal)、行动(Act)和拥护(Advocate)四个层次模型。

由于商品的种类繁多,有些商品属于大众类型的爆品,有些商品比较小众新奇,因此不同模型用户分层数据数量差异极大,用户分层数据每天会出现上亿条用户分层数据与几百条用户分层数据的差异,计算每天的用户分层数据所占用的存储空间从几百GB到几百KB。

在实现本发明过程中,发明人发现现有技术中至少存在如下问题:

电商平台使用Apache Hive(Apache Hive,是Apache软件基金会开源的大规模数据仓库软件。)及其演化版本作为基础软件来建设数据仓库。Hive的底层文件存储系统为HDFS,将用户分层数据存储时,每个分区在HDFS中作为一个文件夹,产生过多小文件且难以整合。HDFS的NameNode(Namenode,负责管理HDFS文件系统名称空间和控制外部客户机的访问的软件。)会将所有的文件元信息加载到内存中,如果小文件过多,在NameNode中会占用大量内存空间,导致其性能下降和过大压力。还有,当Hive执行任务时,若小文件存储过多,产生更多的扫描任务、浪费资源,难以管理。

发明内容

有鉴于此,本发明实施例提供一种数据存储方法和装置,能够解决现有用户分层数据存储效率低,不易管理的问题。

为实现上述目的,根据本发明实施例的一个方面,提供了一种数据存储方法,包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;

根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;

调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

可选地,写入到数据库的数据归档元数据表中之后,还包括:

根据用户分层数据的读取任务,调用归档元数据读取服务,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,并返回分区编码,以根据所述分区编码读取冷数据集中的用户分层数据。

可选地,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,包括:

基于读取请求判断数据库的数据归档元数据表中是否存预设时间段内具有目标模型的存储信息,若是则提取版本号最大的存储信息,返回对应的分区编码,以根据所述分区编码读取冷数据集中的用户分层数据;若否则通知未归档,进而基于读取请求读取热数据集中的用户分层数据。

可选地,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,包括:

根据模型将满足预设周期的用户分层数据进行分组且按照保有的数据量从大到小排序;

获取满足预设周期的用户分层数据总量和分区个数,以得到每个分区的平均用户分层数据量;

按顺序依次取出一组用户分层数据,对于每组用户分层数据循环执行下面过程,直至全部用户分层数据转存完成:

判断当前组内未转存数据量是否大于或等于平均用户分层数据量,若是则判断冷数据集中是否存在数据量为0的分区,如果是则基于数据量为0的分区进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存;若否则判断是否存在平均用户分层数据量与当前保有数据量的差值大于或等于当前组内未转存数据量的分区,如果是则在所述分区中获取剩余空间最小进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存。

可选地,在进行转存时,包括:

按照组内存储时间从小到大的顺序,获取待转存用户分层数据;

基于冷数据集中本次用于转存的分区编码,对所述每个待转存用户分层数据打标签;

将打标签后的待转存用户分层数据合并成HDFS块存储的文件大小,写入冷数据集HIVE表中。

可选地,写入到数据库的数据归档元数据表中,包括:

判断当前数据归档元数据表中是否存在具有相同模型编码和存储时间的存储信息;

若是则设置该存储信息为无效,且将该存储信息中的版本号加1作为该归档的用户分层数据的版本号;若否则设置该归档的用户分层数据的版本号为1。

可选地,基于存储时间和模型将所述用户分层数据写入预设的热数据集中,包括:

根据存储时间和模型生成在热数据集中的分区编码,以将所述用户分层数据写入热数据集中。

另外,本发明还提供了一种数据存储装置,包括第一模块,用于接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;

第二模块,用于根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;

第三模块,用于调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

上述发明中的一个实施例具有如下优点或有益效果:因为采用基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中的技术手段,实现了能够适应多种数据处理的场景,在用户分层数据使用频率减少时,可以将小文件碎片进行整理,不会占用Namenode过多的内存,减小了Namenode以及存储系统的压力,保持了自定义用户分层模型数据的读取和写入效率的技术效果。

上述的非惯用的可选方式所具有的进一步效果将在下文中结合

具体实施方式

包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。从而,本发明的实施方式能够解决现有用户分层数据存储效率低,不易管理的问题。 ">

为遏制恶意抓取行为,请关注公众号获取访问口令


二维码

微信扫二维码关注公众号,发送“口令”获取

提交

提示:只需正确输入一次口令,该弹窗便不再弹出!

CN113778318A - 一种数据存储方法和装置 - Google Patents

一种数据存储方法和装置 Download PDF

Info

Publication number
CN113778318A
CN113778318A CN202010575945.1A CN202010575945A CN113778318A CN 113778318 A CN113778318 A CN 113778318A CN 202010575945 A CN202010575945 A CN 202010575945A CN 113778318 A CN113778318 A CN 113778318A
Authority
CN
China
Prior art keywords
data
user hierarchical
hierarchical data
user
partition
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202010575945.1A
Other languages
English (en)
Inventor
林艳
周德辉
文小东
史金昊
崔词茗
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Jingdong Century Trading Co Ltd, Beijing Wodong Tianjun Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN202010575945.1A priority Critical patent/CN113778318A/zh
Publication of CN113778318A publication Critical patent/CN113778318A/zh
Pending legal-status Critical Current

Links

  • 238000005192 partition Methods 0.000 claims abstract description 91
  • 230000000875 corresponding Effects 0.000 claims abstract description 17
  • 238000000034 method Methods 0.000 claims description 12
  • 238000004590 computer program Methods 0.000 claims description 8
  • 238000002372 labelling Methods 0.000 claims description 4
  • 238000010586 diagram Methods 0.000 description 16
  • 230000003287 optical Effects 0.000 description 4
  • 230000000694 effects Effects 0.000 description 3
  • 230000004048 modification Effects 0.000 description 3
  • 238000006011 modification reaction Methods 0.000 description 3
  • IVBHGBMCVLDMKU-GXNBUGAJSA-N Piperacillin Chemical compound data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pgo8c3ZnIHZlcnNpb249JzEuMScgYmFzZVByb2ZpbGU9J2Z1bGwnCiAgICAgICAgICAgICAgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJwogICAgICAgICAgICAgICAgICAgICAgeG1sbnM6cmRraXQ9J2h0dHA6Ly93d3cucmRraXQub3JnL3htbCcKICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJwogICAgICAgICAgICAgICAgICB4bWw6c3BhY2U9J3ByZXNlcnZlJwp3aWR0aD0nMzAwcHgnIGhlaWdodD0nMzAwcHgnIHZpZXdCb3g9JzAgMCAzMDAgMzAwJz4KPCEtLSBFTkQgT0YgSEVBREVSIC0tPgo8cmVjdCBzdHlsZT0nb3BhY2l0eToxLjA7ZmlsbDojRkZGRkZGO3N0cm9rZTpub25lJyB3aWR0aD0nMzAwLjAnIGhlaWdodD0nMzAwLjAnIHg9JzAuMCcgeT0nMC4wJz4gPC9yZWN0Pgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gMTk2LjksMTExLjkgTCAyMDQuNiwxMTIuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMCBhdG9tLTAgYXRvbS0xJyBkPSdNIDIwNC42LDExMi42IEwgMjEyLjIsMTEzLjQnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTAgYXRvbS0wIGF0b20tMScgZD0nTSAxOTcuNCwxMDcuMiBMIDIwNS4wLDEwOC4wJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gMjA1LjAsMTA4LjAgTCAyMTIuNiwxMDguNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMSBhdG9tLTEgYXRvbS0yJyBkPSdNIDIxMi40LDExMS4xIEwgMjI2LjEsOTIuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzUgYXRvbS05IGF0b20tMScgZD0nTSAyMTguNiwxMjQuNyBMIDIxNS41LDExNy45JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNDI4NEY0O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zNSBhdG9tLTkgYXRvbS0xJyBkPSdNIDIxNS41LDExNy45IEwgMjEyLjQsMTExLjEnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSAyMjguMiw5MS4xIEwgMjI1LjYsODUuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMiBhdG9tLTIgYXRvbS0zJyBkPSdNIDIyNS42LDg1LjIgTCAyMjIuOSw3OS4zJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yIGF0b20tMiBhdG9tLTMnIGQ9J00gMjI0LjAsOTMuMCBMIDIyMS4zLDg3LjEnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSAyMjEuMyw4Ny4xIEwgMjE4LjYsODEuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMyBhdG9tLTIgYXRvbS00JyBkPSdNIDIyNi4xLDkyLjAgTCAyMzMuNyw5Mi44JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zIGF0b20tMiBhdG9tLTQnIGQ9J00gMjMzLjcsOTIuOCBMIDI0MS4zLDkzLjYnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTQgYXRvbS00IGF0b20tNScgZD0nTSAyNTQuNiw4Ny4yIEwgMjU4LjgsODEuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtNCBhdG9tLTQgYXRvbS01JyBkPSdNIDI1OC44LDgxLjMgTCAyNjMuMSw3NS40JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC02IGF0b20tNCBhdG9tLTcnIGQ9J00gMjUzLjcsMTAzLjkgTCAyNTYuMywxMDkuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtNiBhdG9tLTQgYXRvbS03JyBkPSdNIDI1Ni4zLDEwOS44IEwgMjU5LjAsMTE1LjcnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTUgYXRvbS01IGF0b20tNicgZD0nTSAyNjMuMSw3NS40IEwgMjg2LjQsNzcuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtNyBhdG9tLTcgYXRvbS04JyBkPSdNIDI1OS4wLDExNS43IEwgMjQ1LjMsMTM0LjcnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTggYXRvbS04IGF0b20tOScgZD0nTSAyNDUuMywxMzQuNyBMIDIzNy43LDEzNC4wJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC04IGF0b20tOCBhdG9tLTknIGQ9J00gMjM3LjcsMTM0LjAgTCAyMzAuMSwxMzMuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtOSBhdG9tLTkgYXRvbS0xMCcgZD0nTSAyMTUuOSwxNDAuOSBMIDIxMi4xLDE0Ni4yJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNDI4NEY0O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC05IGF0b20tOSBhdG9tLTEwJyBkPSdNIDIxMi4xLDE0Ni4yIEwgMjA4LjQsMTUxLjQnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTEwIGF0b20tMTAgYXRvbS0xMScgZD0nTSAyMDYuMiwxNTIuNCBMIDIwOS4zLDE1OS4yJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xMCBhdG9tLTEwIGF0b20tMTEnIGQ9J00gMjA5LjMsMTU5LjIgTCAyMTIuNCwxNjYuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTAgYXRvbS0xMCBhdG9tLTExJyBkPSdNIDIxMC41LDE1MC40IEwgMjEzLjYsMTU3LjMnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTEwIGF0b20tMTAgYXRvbS0xMScgZD0nTSAyMTMuNiwxNTcuMyBMIDIxNi43LDE2NC4xJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xMSBhdG9tLTEwIGF0b20tMTInIGQ9J00gMjA4LjQsMTUxLjQgTCAyMDAuNywxNTAuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTEgYXRvbS0xMCBhdG9tLTEyJyBkPSdNIDIwMC43LDE1MC42IEwgMTkzLjEsMTQ5LjknIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTEyIGF0b20tMTMgYXRvbS0xMicgZD0nTSAxNzQuNCwxNjUuMiBMIDE3My4xLDE2NC4zJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xMiBhdG9tLTEzIGF0b20tMTInIGQ9J00gMTc3LjQsMTYyLjQgTCAxNzQuOSwxNjAuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTIgYXRvbS0xMyBhdG9tLTEyJyBkPSdNIDE4MC40LDE1OS41IEwgMTc2LjYsMTU2LjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTEzIGF0b20tMTMgYXRvbS0xNCcgZD0nTSAxNzEuNCwxNjguMSBMIDE4MS4wLDE4OS40JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xOSBhdG9tLTEzIGF0b20tMjAnIGQ9J00gMTcxLjQsMTY4LjEgTCAxNDguMSwxNjUuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTQgYXRvbS0xNCBhdG9tLTE1JyBkPSdNIDE4MS4wLDE4OS40IEwgMTY3LjMsMjA4LjQnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTE0IGF0b20tMTQgYXRvbS0xNScgZD0nTSAxODIuOCwxOTUuMCBMIDE3My4yLDIwOC4zJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zNiBhdG9tLTE0IGF0b20tMTknIGQ9J00gMTgxLjAsMTg5LjQgTCAyMDQuMywxOTEuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTUgYXRvbS0xNSBhdG9tLTE2JyBkPSdNIDE2Ny4zLDIwOC40IEwgMTc2LjksMjI5LjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTE2IGF0b20tMTYgYXRvbS0xNycgZD0nTSAxNzYuOSwyMjkuOCBMIDIwMC4yLDIzMi4xJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xNiBhdG9tLTE2IGF0b20tMTcnIGQ9J00gMTgwLjksMjI1LjUgTCAxOTcuMiwyMjcuMScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTcgYXRvbS0xNyBhdG9tLTE4JyBkPSdNIDIwMC4yLDIzMi4xIEwgMjEzLjksMjEzLjEnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTE4IGF0b20tMTggYXRvbS0xOScgZD0nTSAyMTMuOSwyMTMuMSBMIDIwNC4zLDE5MS44JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xOCBhdG9tLTE4IGF0b20tMTknIGQ9J00gMjA4LjIsMjExLjggTCAyMDEuNSwxOTYuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDE0Ni4yLDE2NC40IEwgMTQxLjksMTcwLjMnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIwIGF0b20tMjAgYXRvbS0yMScgZD0nTSAxNDEuOSwxNzAuMyBMIDEzNy43LDE3Ni4yJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yMCBhdG9tLTIwIGF0b20tMjEnIGQ9J00gMTUwLjAsMTY3LjEgTCAxNDUuNywxNzMuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDE0NS43LDE3My4wIEwgMTQxLjUsMTc4LjknIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNFODQyMzU7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIxIGF0b20tMjAgYXRvbS0yMicgZD0nTSAxNDguMSwxNjUuNyBMIDE0NS40LDE1OS44JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yMSBhdG9tLTIwIGF0b20tMjInIGQ9J00gMTQ1LjQsMTU5LjggTCAxNDIuOCwxNTMuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjIgYXRvbS0yMyBhdG9tLTIyJyBkPSdNIDEyMC4yLDE0My4zIEwgMTIwLjMsMTQxLjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIyIGF0b20tMjMgYXRvbS0yMicgZD0nTSAxMjUuMiwxNDQuNiBMIDEyNS41LDE0MS41JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNDI4NEY0O3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yMiBhdG9tLTIzIGF0b20tMjInIGQ9J00gMTMwLjIsMTQ1LjkgTCAxMzAuNiwxNDEuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjMgYXRvbS0yMyBhdG9tLTI0JyBkPSdNIDExNS4yLDE0Mi4wIEwgOTcuMCwxNTYuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzcgYXRvbS0zNSBhdG9tLTIzJyBkPSdNIDEwMC40LDEyMy45IEwgMTE1LjIsMTQyLjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI0IGF0b20tMjQgYXRvbS0yNScgZD0nTSA5NC43LDE1Ni42IEwgOTMuOSwxNjQuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjQgYXRvbS0yNCBhdG9tLTI1JyBkPSdNIDkzLjksMTY0LjIgTCA5My4yLDE3MS45JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yNCBhdG9tLTI0IGF0b20tMjUnIGQ9J00gOTkuNCwxNTcuMSBMIDk4LjYsMTY0LjcnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI0IGF0b20tMjQgYXRvbS0yNScgZD0nTSA5OC42LDE2NC43IEwgOTcuOCwxNzIuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjUgYXRvbS0yNCBhdG9tLTI2JyBkPSdNIDk3LjAsMTU2LjkgTCA5Mi44LDE1MS43JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yNSBhdG9tLTI0IGF0b20tMjYnIGQ9J00gOTIuOCwxNTEuNyBMIDg4LjYsMTQ2LjUnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI2IGF0b20tMjYgYXRvbS0yNycgZD0nTSA3NC45LDEzNC4wIEwgNjguNywxMzAuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjYgYXRvbS0yNiBhdG9tLTI3JyBkPSdNIDY4LjcsMTMwLjAgTCA2Mi41LDEyNi4xJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zOCBhdG9tLTM1IGF0b20tMjYnIGQ9J00gMTAwLjQsMTIzLjkgTCA5NC44LDEyOC40JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zOCBhdG9tLTM1IGF0b20tMjYnIGQ9J00gOTQuOCwxMjguNCBMIDg5LjIsMTMzLjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI3IGF0b20tMjcgYXRvbS0yOCcgZD0nTSA2Mi41LDEyNi4xIEwgMzkuOSwxMzIuNCBMIDQxLjYsMTM2LjcgWicgc3R5bGU9J2ZpbGw6IzNCNDE0MztmaWxsLXJ1bGU6ZXZlbm9kZDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MTsnIC8+CjxwYXRoIGNsYXNzPSdib25kLTMwIGF0b20tMjcgYXRvbS0zMScgZD0nTSA2Mi41LDEyNi4xIEwgNjguNSwxMDMuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjggYXRvbS0yOCBhdG9tLTI5JyBkPSdNIDQwLjcsMTM0LjYgTCAzNS4xLDEzMC4xJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yOCBhdG9tLTI4IGF0b20tMjknIGQ9J00gMzUuMSwxMzAuMSBMIDI5LjUsMTI1LjYnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNFODQyMzU7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI5IGF0b20tMjggYXRvbS0zMCcgZD0nTSAzOC40LDEzNC4yIEwgMzcuMiwxNDEuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjkgYXRvbS0yOCBhdG9tLTMwJyBkPSdNIDM3LjIsMTQxLjggTCAzNi4xLDE0OS4zJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0yOSBhdG9tLTI4IGF0b20tMzAnIGQ9J00gNDMuMCwxMzQuOSBMIDQxLjksMTQyLjUnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTI5IGF0b20tMjggYXRvbS0zMCcgZD0nTSA0MS45LDE0Mi41IEwgNDAuNywxNTAuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzEgYXRvbS0zMSBhdG9tLTMyJyBkPSdNIDY4LjUsMTAzLjQgTCA0NS4zLDk5LjknIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTMyIGF0b20tMzEgYXRvbS0zMycgZD0nTSA2OC41LDEwMy40IEwgNjkuNiw4MC4wJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zMyBhdG9tLTMxIGF0b20tMzQnIGQ9J00gNjguNSwxMDMuNCBMIDc2LjEsMTAzLjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTMzIGF0b20tMzEgYXRvbS0zNCcgZD0nTSA3Ni4xLDEwMy4wIEwgODMuOCwxMDIuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0ZDQzYzMztzdHJva2Utd2lkdGg6Mi4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzQgYXRvbS0zNCBhdG9tLTM1JyBkPSdNIDk1LjYsMTExLjcgTCA5OC4wLDExNy44JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRkNDNjMzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zNCBhdG9tLTM0IGF0b20tMzUnIGQ9J00gOTguMCwxMTcuOCBMIDEwMC40LDEyMy45JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoyLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zOSBhdG9tLTM1IGF0b20tMzYnIGQ9J00gMTAwLjQsMTIzLjkgTCAxMTQuMywxMTguNSBMIDExMi4wLDExNC40IFonIHN0eWxlPSdmaWxsOiMzQjQxNDM7ZmlsbC1ydWxlOmV2ZW5vZGQ7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjIuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjE7JyAvPgo8dGV4dCB4PScxODYuMycgeT0nMTEzLjQnIGNsYXNzPSdhdG9tLTAnIHN0eWxlPSdmb250LXNpemU6OXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9JzIxMy43JyB5PSc3NS40JyBjbGFzcz0nYXRvbS0zJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5PPC90ZXh0Pgo8dGV4dCB4PScyNDYuNicgeT0nOTkuMScgY2xhc3M9J2F0b20tNCcgc3R5bGU9J2ZvbnQtc2l6ZTo5cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+TjwvdGV4dD4KPHRleHQgeD0nMjE5LjInIHk9JzEzNy4xJyBjbGFzcz0nYXRvbS05JyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5OPC90ZXh0Pgo8dGV4dCB4PScyMTUuMicgeT0nMTc3LjQnIGNsYXNzPSdhdG9tLTExJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5PPC90ZXh0Pgo8dGV4dCB4PScxNzUuOCcgeT0nMTUzLjcnIGNsYXNzPSdhdG9tLTEyJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5IPC90ZXh0Pgo8dGV4dCB4PScxODIuMycgeT0nMTUzLjcnIGNsYXNzPSdhdG9tLTEyJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5OPC90ZXh0Pgo8dGV4dCB4PScxMzEuNicgeT0nMTg5LjQnIGNsYXNzPSdhdG9tLTIxJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5PPC90ZXh0Pgo8dGV4dCB4PScxMzUuNycgeT0nMTQ5LjEnIGNsYXNzPSdhdG9tLTIyJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5OPC90ZXh0Pgo8dGV4dCB4PScxNDIuMScgeT0nMTQ5LjEnIGNsYXNzPSdhdG9tLTIyJyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5IPC90ZXh0Pgo8dGV4dCB4PSc5MS45JyB5PScxODQuOCcgY2xhc3M9J2F0b20tMjUnIHN0eWxlPSdmb250LXNpemU6OXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9Jzc5LjQnIHk9JzE0My40JyBjbGFzcz0nYXRvbS0yNicgc3R5bGU9J2ZvbnQtc2l6ZTo5cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+TjwvdGV4dD4KPHRleHQgeD0nMTMuNicgeT0nMTI0LjYnIGNsYXNzPSdhdG9tLTI5JyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5IPC90ZXh0Pgo8dGV4dCB4PScxOS42JyB5PScxMjQuNicgY2xhc3M9J2F0b20tMjknIHN0eWxlPSdmb250LXNpemU6OXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9JzM0LjMnIHk9JzE2Mi40JyBjbGFzcz0nYXRvbS0zMCcgc3R5bGU9J2ZvbnQtc2l6ZTo5cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojRTg0MjM1JyA+TzwvdGV4dD4KPHRleHQgeD0nODkuMScgeT0nMTA2LjgnIGNsYXNzPSdhdG9tLTM0JyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNGQ0M2MzMnID5TPC90ZXh0Pgo8dGV4dCB4PScxMTcuOCcgeT0nMTE2LjgnIGNsYXNzPSdhdG9tLTM2JyBzdHlsZT0nZm9udC1zaXplOjlweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiMzQjQxNDMnID5IPC90ZXh0Pgo8L3N2Zz4K data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pgo8c3ZnIHZlcnNpb249JzEuMScgYmFzZVByb2ZpbGU9J2Z1bGwnCiAgICAgICAgICAgICAgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJwogICAgICAgICAgICAgICAgICAgICAgeG1sbnM6cmRraXQ9J2h0dHA6Ly93d3cucmRraXQub3JnL3htbCcKICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJwogICAgICAgICAgICAgICAgICB4bWw6c3BhY2U9J3ByZXNlcnZlJwp3aWR0aD0nODVweCcgaGVpZ2h0PSc4NXB4JyB2aWV3Qm94PScwIDAgODUgODUnPgo8IS0tIEVORCBPRiBIRUFERVIgLS0+CjxyZWN0IHN0eWxlPSdvcGFjaXR5OjEuMDtmaWxsOiNGRkZGRkY7c3Ryb2tlOm5vbmUnIHdpZHRoPSc4NS4wJyBoZWlnaHQ9Jzg1LjAnIHg9JzAuMCcgeT0nMC4wJz4gPC9yZWN0Pgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gNTUuOSwzMi4wIEwgNTguMSwzMi4yJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gNTguMSwzMi4yIEwgNjAuNCwzMi40JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gNTYuMSwzMC43IEwgNTguMywzMC45JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojRTg0MjM1O3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0wIGF0b20tMCBhdG9tLTEnIGQ9J00gNTguMywzMC45IEwgNjAuNSwzMS4xJyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0xIGF0b20tMSBhdG9tLTInIGQ9J00gNjAuNCwzMS44IEwgNjQuMiwyNi42JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC0zNSBhdG9tLTkgYXRvbS0xJyBkPSdNIDYyLjIsMzUuNyBMIDYxLjMsMzMuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzUgYXRvbS05IGF0b20tMScgZD0nTSA2MS4zLDMzLjcgTCA2MC40LDMxLjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSA2NC43LDI2LjMgTCA2NC4xLDI1LjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSA2NC4xLDI1LjAgTCA2My41LDIzLjYnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNFODQyMzU7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSA2My42LDI2LjggTCA2My4wLDI1LjUnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTIgYXRvbS0yIGF0b20tMycgZD0nTSA2My4wLDI1LjUgTCA2Mi40LDI0LjInIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiNFODQyMzU7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTMgYXRvbS0yIGF0b20tNCcgZD0nTSA2NC4yLDI2LjYgTCA2Ni40LDI2LjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTMgYXRvbS0yIGF0b20tNCcgZD0nTSA2Ni40LDI2LjggTCA2OC42LDI3LjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTQgYXRvbS00IGF0b20tNScgZD0nTSA3MS45LDI1LjMgTCA3My4xLDIzLjYnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTQgYXRvbS00IGF0b20tNScgZD0nTSA3My4xLDIzLjYgTCA3NC4zLDIyLjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTYgYXRvbS00IGF0b20tNycgZD0nTSA3Mi4wLDMwLjQgTCA3Mi42LDMxLjcnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTYgYXRvbS00IGF0b20tNycgZD0nTSA3Mi42LDMxLjcgTCA3My4yLDMzLjEnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTUgYXRvbS01IGF0b20tNicgZD0nTSA3NC4zLDIyLjAgTCA4MC42LDIyLjcnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTcgYXRvbS03IGF0b20tOCcgZD0nTSA3My4yLDMzLjEgTCA2OS40LDM4LjMnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTggYXRvbS04IGF0b20tOScgZD0nTSA2OS40LDM4LjMgTCA2Ny4yLDM4LjAnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiMzQjQxNDM7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTggYXRvbS04IGF0b20tOScgZD0nTSA2Ny4yLDM4LjAgTCA2NS4wLDM3LjgnIHN0eWxlPSdmaWxsOm5vbmU7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOiM0Mjg0RjQ7c3Ryb2tlLXdpZHRoOjEuMHB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEnIC8+CjxwYXRoIGNsYXNzPSdib25kLTkgYXRvbS05IGF0b20tMTAnIGQ9J00gNjEuMSw0MC4zIEwgNjAuMiw0MS42JyBzdHlsZT0nZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTojNDI4NEY0O3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxJyAvPgo8cGF0aCBjbGFzcz0nYm9uZC05IGF0b20tOSBhdG9tLTEwJyBkPSdNIDYwLjIsNDEuNiBMIDU5LjMsNDIuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTAgYXRvbS0xMCBhdG9tLTExJyBkPSdNIDU4LjcsNDMuMSBMIDU5LjYsNDUuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTAgYXRvbS0xMCBhdG9tLTExJyBkPSdNIDU5LjYsNDUuMCBMIDYwLjUsNDcuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTAgYXRvbS0xMCBhdG9tLTExJyBkPSdNIDU5LjksNDIuNiBMIDYwLjgsNDQuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTAgYXRvbS0xMCBhdG9tLTExJyBkPSdNIDYwLjgsNDQuNSBMIDYxLjYsNDYuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTEgYXRvbS0xMCBhdG9tLTEyJyBkPSdNIDU5LjMsNDIuOCBMIDU3LjEsNDIuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTEgYXRvbS0xMCBhdG9tLTEyJyBkPSdNIDU3LjEsNDIuNiBMIDU0LjksNDIuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTIgYXRvbS0xMyBhdG9tLTEyJyBkPSdNIDQ5LjksNDYuOCBMIDQ5LjUsNDYuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTIgYXRvbS0xMyBhdG9tLTEyJyBkPSdNIDUwLjUsNDYuMyBMIDQ5LjgsNDUuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTIgYXRvbS0xMyBhdG9tLTEyJyBkPSdNIDUxLjIsNDUuNyBMIDUwLjEsNDUuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTMgYXRvbS0xMyBhdG9tLTE0JyBkPSdNIDQ5LjIsNDcuNCBMIDUxLjgsNTMuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTkgYXRvbS0xMyBhdG9tLTIwJyBkPSdNIDQ5LjIsNDcuNCBMIDQyLjgsNDYuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTQgYXRvbS0xNCBhdG9tLTE1JyBkPSdNIDUxLjgsNTMuMiBMIDQ4LjEsNTguNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTQgYXRvbS0xNCBhdG9tLTE1JyBkPSdNIDUyLjMsNTQuNyBMIDQ5LjcsNTguNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzYgYXRvbS0xNCBhdG9tLTE5JyBkPSdNIDUxLjgsNTMuMiBMIDU4LjIsNTMuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTUgYXRvbS0xNSBhdG9tLTE2JyBkPSdNIDQ4LjEsNTguNCBMIDUwLjcsNjQuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTYgYXRvbS0xNiBhdG9tLTE3JyBkPSdNIDUwLjcsNjQuMiBMIDU3LjEsNjQuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTYgYXRvbS0xNiBhdG9tLTE3JyBkPSdNIDUxLjgsNjMuMSBMIDU2LjMsNjMuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTcgYXRvbS0xNyBhdG9tLTE4JyBkPSdNIDU3LjEsNjQuOSBMIDYwLjgsNTkuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTggYXRvbS0xOCBhdG9tLTE5JyBkPSdNIDYwLjgsNTkuNyBMIDU4LjIsNTMuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMTggYXRvbS0xOCBhdG9tLTE5JyBkPSdNIDU5LjMsNTkuMyBMIDU3LjQsNTUuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDQyLjMsNDYuNCBMIDQxLjEsNDguMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDQxLjEsNDguMCBMIDQwLjAsNDkuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDQzLjMsNDcuMSBMIDQyLjIsNDguNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjAgYXRvbS0yMCBhdG9tLTIxJyBkPSdNIDQyLjIsNDguNyBMIDQxLjAsNTAuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjEgYXRvbS0yMCBhdG9tLTIyJyBkPSdNIDQyLjgsNDYuNyBMIDQyLjIsNDUuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjEgYXRvbS0yMCBhdG9tLTIyJyBkPSdNIDQyLjIsNDUuNCBMIDQxLjYsNDQuMScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjIgYXRvbS0yMyBhdG9tLTIyJyBkPSdNIDM1LjMsNDAuNiBMIDM1LjMsNDAuMicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjIgYXRvbS0yMyBhdG9tLTIyJyBkPSdNIDM2LjcsNDEuMCBMIDM2LjgsNDAuMScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjIgYXRvbS0yMyBhdG9tLTIyJyBkPSdNIDM4LjIsNDEuMyBMIDM4LjMsNDAuMScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjMgYXRvbS0yMyBhdG9tLTI0JyBkPSdNIDMzLjgsNDAuMyBMIDI4LjksNDQuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzcgYXRvbS0zNSBhdG9tLTIzJyBkPSdNIDI5LjgsMzUuMyBMIDMzLjgsNDAuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjQgYXRvbS0yNCBhdG9tLTI1JyBkPSdNIDI4LjIsNDQuMiBMIDI4LjAsNDYuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjQgYXRvbS0yNCBhdG9tLTI1JyBkPSdNIDI4LjAsNDYuNCBMIDI3LjgsNDguNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjQgYXRvbS0yNCBhdG9tLTI1JyBkPSdNIDI5LjUsNDQuNCBMIDI5LjMsNDYuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjQgYXRvbS0yNCBhdG9tLTI1JyBkPSdNIDI5LjMsNDYuNiBMIDI5LjEsNDguOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjUgYXRvbS0yNCBhdG9tLTI2JyBkPSdNIDI4LjksNDQuMyBMIDI3LjgsNDMuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjUgYXRvbS0yNCBhdG9tLTI2JyBkPSdNIDI3LjgsNDMuMCBMIDI2LjgsNDEuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjYgYXRvbS0yNiBhdG9tLTI3JyBkPSdNIDIyLjksMzguMSBMIDIxLjEsMzcuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjYgYXRvbS0yNiBhdG9tLTI3JyBkPSdNIDIxLjEsMzcuMCBMIDE5LjQsMzUuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzggYXRvbS0zNSBhdG9tLTI2JyBkPSdNIDI5LjgsMzUuMyBMIDI4LjMsMzYuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzggYXRvbS0zNSBhdG9tLTI2JyBkPSdNIDI4LjMsMzYuNSBMIDI2LjgsMzcuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzQyODRGNDtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjcgYXRvbS0yNyBhdG9tLTI4JyBkPSdNIDE5LjQsMzUuOSBMIDEzLjIsMzcuNiBMIDEzLjcsMzguOCBaJyBzdHlsZT0nZmlsbDojM0I0MTQzO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxOycgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzAgYXRvbS0yNyBhdG9tLTMxJyBkPSdNIDE5LjQsMzUuOSBMIDIxLjEsMjkuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjggYXRvbS0yOCBhdG9tLTI5JyBkPSdNIDEzLjUsMzguMiBMIDExLjksMzcuMCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjggYXRvbS0yOCBhdG9tLTI5JyBkPSdNIDExLjksMzcuMCBMIDEwLjQsMzUuOCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjkgYXRvbS0yOCBhdG9tLTMwJyBkPSdNIDEyLjgsMzguMSBMIDEyLjUsNDAuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjkgYXRvbS0yOCBhdG9tLTMwJyBkPSdNIDEyLjUsNDAuMyBMIDEyLjIsNDIuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjkgYXRvbS0yOCBhdG9tLTMwJyBkPSdNIDE0LjEsMzguMyBMIDEzLjgsNDAuNScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMjkgYXRvbS0yOCBhdG9tLTMwJyBkPSdNIDEzLjgsNDAuNSBMIDEzLjQsNDIuNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0U4NDIzNTtzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzEgYXRvbS0zMSBhdG9tLTMyJyBkPSdNIDIxLjEsMjkuNyBMIDE0LjcsMjguNycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzIgYXRvbS0zMSBhdG9tLTMzJyBkPSdNIDIxLjEsMjkuNyBMIDIxLjQsMjMuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzMgYXRvbS0zMSBhdG9tLTM0JyBkPSdNIDIxLjEsMjkuNyBMIDIzLjMsMjkuNicgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzMgYXRvbS0zMSBhdG9tLTM0JyBkPSdNIDIzLjMsMjkuNiBMIDI1LjUsMjkuNCcgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0ZDQzYzMztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzQgYXRvbS0zNCBhdG9tLTM1JyBkPSdNIDI4LjcsMzIuNSBMIDI5LjIsMzMuOScgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6I0ZDQzYzMztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzQgYXRvbS0zNCBhdG9tLTM1JyBkPSdNIDI5LjIsMzMuOSBMIDI5LjgsMzUuMycgc3R5bGU9J2ZpbGw6bm9uZTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6IzNCNDE0MztzdHJva2Utd2lkdGg6MS4wcHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MScgLz4KPHBhdGggY2xhc3M9J2JvbmQtMzkgYXRvbS0zNSBhdG9tLTM2JyBkPSdNIDI5LjgsMzUuMyBMIDMzLjcsMzMuOCBMIDMzLjAsMzIuNyBaJyBzdHlsZT0nZmlsbDojM0I0MTQzO2ZpbGwtcnVsZTpldmVub2RkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTojM0I0MTQzO3N0cm9rZS13aWR0aDoxLjBweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxOycgLz4KPHRleHQgeD0nNTIuMicgeT0nMzQuMScgY2xhc3M9J2F0b20tMCcgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojRTg0MjM1JyA+TzwvdGV4dD4KPHRleHQgeD0nNTkuNycgeT0nMjMuNycgY2xhc3M9J2F0b20tMycgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojRTg0MjM1JyA+TzwvdGV4dD4KPHRleHQgeD0nNjguNycgeT0nMzAuMicgY2xhc3M9J2F0b20tNCcgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+TjwvdGV4dD4KPHRleHQgeD0nNjEuMicgeT0nNDAuNicgY2xhc3M9J2F0b20tOScgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+TjwvdGV4dD4KPHRleHQgeD0nNjAuMScgeT0nNTEuNycgY2xhc3M9J2F0b20tMTEnIHN0eWxlPSdmb250LXNpemU6NnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9JzQ3LjAnIHk9JzQ1LjInIGNsYXNzPSdhdG9tLTEyJyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5IPC90ZXh0Pgo8dGV4dCB4PSc1MS4xJyB5PSc0NS4yJyBjbGFzcz0nYXRvbS0xMicgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+TjwvdGV4dD4KPHRleHQgeD0nMzcuMycgeT0nNTQuOScgY2xhc3M9J2F0b20tMjEnIHN0eWxlPSdmb250LXNpemU6NnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9JzM4LjQnIHk9JzQzLjknIGNsYXNzPSdhdG9tLTIyJyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5OPC90ZXh0Pgo8dGV4dCB4PSc0Mi41JyB5PSc0My45JyBjbGFzcz0nYXRvbS0yMicgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojNDI4NEY0JyA+SDwvdGV4dD4KPHRleHQgeD0nMjYuNCcgeT0nNTMuNycgY2xhc3M9J2F0b20tMjUnIHN0eWxlPSdmb250LXNpemU6NnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0U4NDIzNScgPk88L3RleHQ+Cjx0ZXh0IHg9JzIzLjAnIHk9JzQyLjMnIGNsYXNzPSdhdG9tLTI2JyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiM0Mjg0RjQnID5OPC90ZXh0Pgo8dGV4dCB4PScyLjgnIHk9JzM3LjInIGNsYXNzPSdhdG9tLTI5JyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5IPC90ZXh0Pgo8dGV4dCB4PSc2LjcnIHk9JzM3LjInIGNsYXNzPSdhdG9tLTI5JyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNFODQyMzUnID5PPC90ZXh0Pgo8dGV4dCB4PScxMC43JyB5PSc0Ny41JyBjbGFzcz0nYXRvbS0zMCcgc3R5bGU9J2ZvbnQtc2l6ZTo2cHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7dGV4dC1hbmNob3I6c3RhcnQ7ZmlsbDojRTg0MjM1JyA+TzwvdGV4dD4KPHRleHQgeD0nMjUuNycgeT0nMzIuMycgY2xhc3M9J2F0b20tMzQnIHN0eWxlPSdmb250LXNpemU6NnB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I0ZDQzYzMycgPlM8L3RleHQ+Cjx0ZXh0IHg9JzMzLjUnIHk9JzM1LjEnIGNsYXNzPSdhdG9tLTM2JyBzdHlsZT0nZm9udC1zaXplOjZweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiMzQjQxNDMnID5IPC90ZXh0Pgo8L3N2Zz4K O=C1C(=O)N(CC)CCN1C(=O)N[[email protected]](C=1C=CC=CC=1)C(=O)N[[email protected]@H]1C(=O)N2[[email protected]@H](C(O)=O)C(C)(C)S[[email protected]@H]21 IVBHGBMCVLDMKU-GXNBUGAJSA-N 0.000 description 2
  • 238000004364 calculation method Methods 0.000 description 2
  • 230000003203 everyday Effects 0.000 description 2
  • 239000000835 fiber Substances 0.000 description 2
  • 230000000644 propagated Effects 0.000 description 2
  • 239000004065 semiconductor Substances 0.000 description 2
  • 210000003666 Nerve Fibers, Myelinated Anatomy 0.000 description 1
  • 230000006399 behavior Effects 0.000 description 1
  • 238000011030 bottleneck Methods 0.000 description 1
  • 239000000969 carrier Substances 0.000 description 1
  • 230000015556 catabolic process Effects 0.000 description 1
  • 230000019771 cognition Effects 0.000 description 1
  • 230000001276 controlling effect Effects 0.000 description 1
  • 230000004059 degradation Effects 0.000 description 1
  • 238000006731 degradation reaction Methods 0.000 description 1
  • 239000002360 explosive Substances 0.000 description 1
  • 239000003365 glass fiber Substances 0.000 description 1
  • 230000003993 interaction Effects 0.000 description 1
  • 239000004973 liquid crystal related substance Substances 0.000 description 1
  • 238000000638 solvent extraction Methods 0.000 description 1
  • 238000006467 substitution reaction Methods 0.000 description 1

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0608Saving storage space on storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0644Management of space entities, e.g. partitions, extents, pools
    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/067Distributed or networked storage systems, e.g. storage area networks [SAN], network attached storage [NAS]

Abstract

本发明公开了数据存储方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。从而,本发明的实施方式能够解决现有用户分层数据存储效率低,不易管理的问题。

Description

一种数据存储方法和装置

技术领域

本发明涉及计算机技术领域,尤其涉及一种数据存储方法和装置。

背景技术

电商平台需要为平台商家提供数字化用户运营系统,以支持其在平台的用户运营管理。为了使营销活动和用户运营策略更具有针对性,建立了4A用户分层模型,根据用户与品牌商品互动行为的深浅程度将用户分为认知(Aware)、吸引(Appeal)、行动(Act)和拥护(Advocate)四个层次模型。

由于商品的种类繁多,有些商品属于大众类型的爆品,有些商品比较小众新奇,因此不同模型用户分层数据数量差异极大,用户分层数据每天会出现上亿条用户分层数据与几百条用户分层数据的差异,计算每天的用户分层数据所占用的存储空间从几百GB到几百KB。

在实现本发明过程中,发明人发现现有技术中至少存在如下问题:

电商平台使用Apache Hive(Apache Hive,是Apache软件基金会开源的大规模数据仓库软件。)及其演化版本作为基础软件来建设数据仓库。Hive的底层文件存储系统为HDFS,将用户分层数据存储时,每个分区在HDFS中作为一个文件夹,产生过多小文件且难以整合。HDFS的NameNode(Namenode,负责管理HDFS文件系统名称空间和控制外部客户机的访问的软件。)会将所有的文件元信息加载到内存中,如果小文件过多,在NameNode中会占用大量内存空间,导致其性能下降和过大压力。还有,当Hive执行任务时,若小文件存储过多,产生更多的扫描任务、浪费资源,难以管理。

发明内容

有鉴于此,本发明实施例提供一种数据存储方法和装置,能够解决现有用户分层数据存储效率低,不易管理的问题。

为实现上述目的,根据本发明实施例的一个方面,提供了一种数据存储方法,包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;

根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;

调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

可选地,写入到数据库的数据归档元数据表中之后,还包括:

根据用户分层数据的读取任务,调用归档元数据读取服务,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,并返回分区编码,以根据所述分区编码读取冷数据集中的用户分层数据。

可选地,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,包括:

基于读取请求判断数据库的数据归档元数据表中是否存预设时间段内具有目标模型的存储信息,若是则提取版本号最大的存储信息,返回对应的分区编码,以根据所述分区编码读取冷数据集中的用户分层数据;若否则通知未归档,进而基于读取请求读取热数据集中的用户分层数据。

可选地,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,包括:

根据模型将满足预设周期的用户分层数据进行分组且按照保有的数据量从大到小排序;

获取满足预设周期的用户分层数据总量和分区个数,以得到每个分区的平均用户分层数据量;

按顺序依次取出一组用户分层数据,对于每组用户分层数据循环执行下面过程,直至全部用户分层数据转存完成:

判断当前组内未转存数据量是否大于或等于平均用户分层数据量,若是则判断冷数据集中是否存在数据量为0的分区,如果是则基于数据量为0的分区进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存;若否则判断是否存在平均用户分层数据量与当前保有数据量的差值大于或等于当前组内未转存数据量的分区,如果是则在所述分区中获取剩余空间最小进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存。

可选地,在进行转存时,包括:

按照组内存储时间从小到大的顺序,获取待转存用户分层数据;

基于冷数据集中本次用于转存的分区编码,对所述每个待转存用户分层数据打标签;

将打标签后的待转存用户分层数据合并成HDFS块存储的文件大小,写入冷数据集HIVE表中。

可选地,写入到数据库的数据归档元数据表中,包括:

判断当前数据归档元数据表中是否存在具有相同模型编码和存储时间的存储信息;

若是则设置该存储信息为无效,且将该存储信息中的版本号加1作为该归档的用户分层数据的版本号;若否则设置该归档的用户分层数据的版本号为1。

可选地,基于存储时间和模型将所述用户分层数据写入预设的热数据集中,包括:

根据存储时间和模型生成在热数据集中的分区编码,以将所述用户分层数据写入热数据集中。

另外,本发明还提供了一种数据存储装置,包括第一模块,用于接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;

第二模块,用于根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;

第三模块,用于调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

上述发明中的一个实施例具有如下优点或有益效果:因为采用基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中的技术手段,实现了能够适应多种数据处理的场景,在用户分层数据使用频率减少时,可以将小文件碎片进行整理,不会占用Namenode过多的内存,减小了Namenode以及存储系统的压力,保持了自定义用户分层模型数据的读取和写入效率的技术效果。

上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。

附图说明

附图用于更好地理解本发明,不构成对本发明的不当限定。其中:

图1是根据本发明一个实施例的数据存储方法的主要流程的示意图;

图2是根据本发明实施例的数据存储方法的架构图;

图3是根据本发明实施例热数据集归档的主要流程示意图;

图4是根据本发明实施例热数据集写入冷数据集的主要流程示意图;

图5是根据本发明实施例的用户分层数据读取的主要流程示意图;

图6是根据本发明实施例的数据存储装置的主要模块的示意图;

图7是本发明实施例可以应用于其中的示例性系统架构图;

图8是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。

具体实施方式

以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。

图1是根据本发明一个实施例的数据存储方法的主要流程的示意图,如图1所示,所述数据存储方法包括:

步骤S101,接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中。

在实施例中,本发明设置了热数据集和冷数据集。其中热数据集用于存放近期生产出的用户分层数据,供接下来的计算任务使用。冷数据集存放不再频繁使用的用户分层数据。例如:当一个用户分层模型计算得到的用户分层数据,在定义的周期内,全部生成,且固定的统计任务全部计算完毕后,可认为不再频繁使用。另外如下的表1和表2分别为用户分层计算任务计算出的热数据集包括的字段,以及归档任务写入的冷数据集包括的字段。

表1

表2

较佳的,本发明实施例中使用了Spark分布式计算框架来执行步骤S101至步骤S103。其中,Spark是Apache软件基金会开源的大规模分布式数据计算框架。

需要说明的是,本发明一个优选地实施例采用了根据存储时间和模型生成在热数据集中的分区编码,以将所述用户分层数据写入热数据集中。

步骤S102,根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码。

在一些实施例中,本发明将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中的过程,可以根据模型将满足预设周期的用户分层数据进行分组且按照保有的数据量从大到小排序;获取满足预设周期的用户分层数据总量和分区个数,以得到每个分区的平均用户分层数据量。

然后,按顺序依次取出一组用户分层数据,对于每组用户分层数据循环执行下面过程,直至全部用户分层数据转存完成:

判断当前组内未转存数据量是否大于或等于平均用户分层数据量,若是则判断冷数据集中是否存在数据量为0的分区,如果是则基于数据量为0的分区进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存;若否则判断是否存在平均用户分层数据量与当前保有数据量的差值大于或等于当前组内未转存数据量的分区,如果是则在所述分区中获取剩余空间最小进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存。

作为进一步地实施例,在将热数据集进行转存至冷数据集的过程中,可以按照组内存储时间从小到大的顺序,获取待转存用户分层数据;然后基于冷数据集中本次用于转存的分区编码,对所述每个待转存用户分层数据打标签;将打标签后的待转存用户分层数据合并成HDFS块存储的文件大小,写入冷数据集HIVE表中。其中,HDFS为布式文件存储系统。HIVE是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能。

可以看出,本发明将按照数据条数、模型大小和存储时间排序的顺序,对归档数据进行分区。从而实现了将数据量小的模型按照正常的存储文件大小进行整理,且保证了同一模型、同一模型下相近日期的数据尽量归档到一起,保证了使用冷数据集时扫描的效率。同时保证了冷数据集每个分区的数据量尽量均衡,不会产生数据倾斜严重的情况,在扫描数据时,不会产生因分区存储不均导致的性能瓶颈。

步骤S103,调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

在一些实施例中,写入到数据库的数据归档元数据表中之后,本发明能够根据用户分层数据的读取任务,调用归档元数据读取服务,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,并返回分区编码,以根据所述分区编码读取冷数据集中的用户分层数据。较佳的,数据库可以采用关系型数据库Mysql。

值得说明的是,写入到数据库的数据归档元数据表中之后,还可以根据用户分层数据的读取任务,调用归档元数据读取服务。然后,基于读取请求判断数据库的数据归档元数据表中是否存预设时间段内具有目标模型的存储信息,若是则提取版本号最大的存储信息,返回对应的分区编码,以根据所述分区编码读取冷数据集中的用户分层数据;若否则通知未归档,进而基于读取请求读取热数据集中的用户分层数据。

作为另一些实施例,在写入到数据库的数据归档元数据表中的过程中,本发明可以判断当前数据归档元数据表中是否存在具有相同模型编码和存储时间的存储信息。根据判断结果,若是则设置该存储信息为无效,且将该存储信息中的版本号加1作为该归档的用户分层数据的版本号;若否则设置该归档的用户分层数据的版本号为1。

可以看出,本发明通过读写服务对归档数据进行管理和维护,一是保证数据重刷时,归档元信息存储的数据完整性,通过版本号来区分数据是否最新有效。二是在需要使用到用户分层数据的场景时,直接调用归档元数据读服务就可以获取到相关模型用户分层数据的存储信息,不需要自己去根据业务场景去判断底层数据的存储位置。三是此功能可以拓展到其他类型数据的存储定位,有很好的可拓展性。

值得说明的是,本发明还可以按照模型进行分区存储用户分层数据,将新增的用户分层数据直接追加到相关分区中,一段时间进行一次文件合并。由于每个模型的数据量大小并不统一,如果遇到数据量较大的模型,扫描数据的任务效率会变低,对下游任务造成压力;如果遇到用户分层数据的数据量过小情况,小文件的问题依旧存在。其次由于HIVE对数据更新操作流程比较复杂,直接追加到相关分区,会造成用户分层数据难以维护。

综上所述,本发明所述数据存储方法,实现了大规模电商用户分层数据存取,一方面本发明将数据分为冷数据集和热数据集,能够适应多种数据处理的场景。在频繁使用自定义用户分层数据时,使用热数据集,保证当前模型用户分层数据扫描的效率,同时解决了HIVE分区过多导致的数据难以管理问题。另一方面本发明解决了因为分区过多导致的小文件问题,将数据量小的用户分层模型数据进行了合并整理,在用户分层数据使用频率减少时,可以将小文件碎片进行整理,不会占用Namenode过多的内存,减小了Namenode以及存储系统的压力。再者,本发明减轻了Namenode压力的同时,保持了自定义用户分层模型数据的读取和写入效率。

图2是根据本发明实施例的数据存储方法的架构图,所述数据存储方法通过用户分层计算任务获得用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中。根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中(即写入至冷数据集中),且得到所述用户分层数据在冷数据集中的分区编码。然后,根据归档任务调用归档元数据写入服务,获取用户分层数据对应的存储时间、模型、归档时间和分区编码,写入到Mysql数据库的数据归档元数据表中。同时,根据归档任务删除热数据集中已归档的用户分层数据。

另外,通过用户分层的数据计算任务,可以调用归档元数据读取服务从Mysql数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,并返回分区编码,以根据所述分区编码读取冷数据集中的用户分层数据。其中,如果没有返回分区编码,则说明热数据集中的用户分层数据还没有写入冷数据集,那么直接读取热数据集中的用户分层数据即可。

值得说明的是,用户分层计算任务、归档任务以及基于用户分层的数据计算任务(即读取服务)可以基于Spark引擎中执行。

图3是根据本发明实施例热数据集归档的主要流程示意图,包括:

步骤一:获取归档的基于模型和存储时间的列表。

步骤二:扫描热数据集中的用户分层数据。

步骤三:判断热数据集中是否存在归档列表对应的用户分层数据,若是则进行步骤四,若否则退出该流程。

步骤四:按照转存模型分配归档分区编码。

步骤五:按照所述分区编码写入冷数据集。

步骤六:判断是否全部写入成功,若是则进行步骤七,若否则删除此次归档冷数据集的用户分层数据并返回步骤五。

步骤七:调用归档元数据写入服务,写入此次归档的冷数据集的元数据信息。

步骤八:判断是否写入元信息成功,若是则删除此次归档成功热数据集中的用户分层数据,若否则返回步骤七。

图4是根据本发明实施例热数据集写入冷数据集的主要流程示意图,包括:

步骤一:根据预设周期,获取热数据集中的用户分层数据。

步骤二:按照模型进行分组,计算每个模型的总条数。

步骤三:按照模型总数从大到小排序,模型内按照日期从小到大排序。

步骤四:计算总条数,确认分区数量part_num,得到每个分区平均条数row_num。

步骤五:判断是否存在未分配的用户分层数据,若是则进行步骤六,否则退出该流程。

步骤六:从小到大的顺序取出一组模型,初始化模型总条数为剩余未分配条数left_count。

步骤七:判断left_count是否大于或等于row_num,若是则进行步骤八,若否则进行步骤九。

步骤八:判断是否存在未分配用户分层数据的分区,若是则进行步骤十,若否则进行步骤九。

步骤九:判断是否存在row_num减去block_num大于或等于left_count的分区,若是则进行步骤十一,若否则进行步骤十二。

其中,分区已存数据条数block_num。

步骤十:取出未分配过数据的分区,然后进行步骤十三。

步骤十一:查找到row_num减去block_num大于或等于left_count的模型列表,得到其中block_num最大的分区,然后进行步骤十三。

步骤十二:取出row_num减去block_num最大的分区,然后进行步骤十三。

步骤十三:按顺序取出未分配的用户分层数据,分配至取出的分区,更新block_num和left_count。

步骤十四:判断当前模型是否分配完成,若是则返回步骤五,若否则进行步骤十五。

步骤十五:判断block_num是否大于或等于row_num,若是则返回步骤七,若否则返回步骤十三。

图5是根据本发明实施例的用户分层数据读取的主要流程示意图,包括:

步骤一:基于用户分层数据的计算任务启动后,向归档元数据读取服务发送请求,请求所需用户分层数据的数据存储信息。

其中,请求中可以包括用户分层模型的编号、存储时间的开始时间、结束时间。

步骤二:归档元数据读取服务接收到请求,判断归档元数据表中是否存在请求的元信息,若是则进行步骤四,若否则进行步骤三。

步骤三:返回热数据集请求对应的用户分层数据的位置,进行步骤六。

在实施例中,此时虽然将热数据集中用户分层数据的元数据归档至了数据库的数据归档元数据表中,但并没有将热数据集中用户分层数据写入冷数据集中。也就是说,本发明实施例可以将热数据集中用户分层数据的元数据归档至数据库与用户分层数据写入冷数据集中可以分别进行。

步骤四:判断是否未多条元数据存储信息,若是则进行步骤五,若否则直接返回该条元数据存储信息并进行步骤六。

步骤五:返回最新有效的存储信息。

在实施例中,取最大版本号的有效元信息返回。

步骤六:解析返回的存储信息,以读取冷数据集中的用户分层数据。

图6是根据本发明实施例的数据存储装置的主要模块的示意图,如图6所示,所述数据存储装置600包括第一模块601、第二模块602和第三模块603。其中,第一模块601接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;第二模块602根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;第三模块603调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

在一些实施例中,第三模块603写入到数据库的数据归档元数据表中之后,还包括:

根据用户分层数据的读取任务,调用归档元数据读取服务,基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,并返回分区编码,以根据所述分区编码读取冷数据集中的用户分层数据。

在一些实施例中,第三模块603基于读取请求从数据库的数据归档元数据表中查询预设时间段内目标模型的存储信息,包括:

基于读取请求判断数据库的数据归档元数据表中是否存预设时间段内具有目标模型的存储信息,若是则提取版本号最大的存储信息,返回对应的分区编码,以根据所述分区编码读取冷数据集中的用户分层数据;若否则通知未归档,进而基于读取请求读取热数据集中的用户分层数据。

在一些实施例中,第二模块602将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,包括:

根据模型将满足预设周期的用户分层数据进行分组且按照保有的数据量从大到小排序;

获取满足预设周期的用户分层数据总量和分区个数,以得到每个分区的平均用户分层数据量;

按顺序依次取出一组用户分层数据,对于每组用户分层数据循环执行下面过程,直至全部用户分层数据转存完成:

判断当前组内未转存数据量是否大于或等于平均用户分层数据量,若是则判断冷数据集中是否存在数据量为0的分区,如果是则基于数据量为0的分区进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存;若否则判断是否存在平均用户分层数据量与当前保有数据量的差值大于或等于当前组内未转存数据量的分区,如果是则在所述分区中获取剩余空间最小进行转存,如果否则获取冷数据集中剩余空间最大的分区进行转存。

在一些实施例中,第二模块602在进行转存时,包括:

按照组内存储时间从小到大的顺序,获取待转存用户分层数据;

基于冷数据集中本次用于转存的分区编码,对所述每个待转存用户分层数据打标签;

将打标签后的待转存用户分层数据合并成HDFS块存储的文件大小,写入冷数据集HIVE表中。

在一些实施例中,第三模块603写入到数据库的数据归档元数据表中,包括:

判断当前数据归档元数据表中是否存在具有相同模型编码和存储时间的存储信息;

若是则设置该存储信息为无效,且将该存储信息中的版本号加1作为该归档的用户分层数据的版本号;若否则设置该归档的用户分层数据的版本号为1。

在一些实施例中,第一模块601基于存储时间和模型将所述用户分层数据写入预设的热数据集中,包括:

根据存储时间和模型生成在热数据集中的分区编码,以将所述用户分层数据写入热数据集中。

需要说明的是,在本发明所述数据存储方法和所述数据存储装置在具体实施内容上具有相应关系,故重复内容不再说明。

图7示出了可以应用本发明实施例的数据存储方法或数据存储装置,数据存储判别或数据存储判别装置的示例性系统架构700。

如图7所示,系统架构700可以包括终端设备701、702、703,网络704和服务器705。网络704用以在终端设备701、702、703和服务器705之间提供通信链路的介质。网络704可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。

用户可以使用终端设备701、702、703通过网络704与服务器705交互,以接收或发送消息等。终端设备701、702、703上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。

终端设备701、702、703可以是具有数据存储屏或者数据存储判别屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。

服务器705可以是提供各种服务的服务器,例如对用户利用终端设备701、702、703所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。

需要说明的是,本发明实施例所提供的数据存储方法或数据存储判别方法一般由服务器705执行,相应地,计算装置一般设置于服务器705中。

应该理解,图7中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。

下面参考图8,其示出了适于用来实现本发明实施例的终端设备的计算机系统800的结构示意图。图8示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图8所示,计算机系统800包括中央处理单元(CPU)801,其可以根据存储在只读存储器(ROM)802中的程序或者从存储部分808加载到随机访问存储器(RAM)803中的程序而执行各种适当的动作和处理。在RAM803中,还存储有计算机系统800操作所需的各种程序和数据。CPU801、ROM802以及RAM803通过总线804彼此相连。输入/输出(I/O)接口805也连接至总线804。

以下部件连接至I/O接口805:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(CRT)、液晶数据存储器(LCD)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至I/O接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。

特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在该计算机程序被中央处理单元(CPU)801执行时,执行本发明的系统中限定的上述功能。

需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括第一模块、第二模块和第三模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定。

作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括接收通过用户分层计算任务获得的用户分层数据,基于存储时间和模型将所述用户分层数据写入预设的热数据集中;根据归档任务,将热数据集中满足预设周期的用户分层数据按照转存模型归档至预设的冷数据集中,进而得到所述用户分层数据在冷数据集中的分区编码;调用归档元数据写入服务,获取所述用户分层数据对应的存储时间、模型、归档时间和分区编码,进而写入到数据库的数据归档元数据表中。

根据本发明实施例的技术方案,能够解决现有用户分层数据存储效率低,不易管理的问题。

上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

21页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:网卡的数据处理方法以及网卡

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类