diff --git a/attachments/russia b/attachments/russia deleted file mode 120000 index 99d463b..0000000 --- a/attachments/russia +++ /dev/null @@ -1 +0,0 @@ -/Users/andrew/dev/dev7r/html/webpage/russia \ No newline at end of file diff --git a/attachments/russia/.nojekyll b/attachments/russia/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/attachments/russia/010Sergiev.md b/attachments/russia/010Sergiev.md new file mode 100644 index 0000000..c44f8f8 --- /dev/null +++ b/attachments/russia/010Sergiev.md @@ -0,0 +1,25 @@ +# 谢尔盖耶夫镇 +谢尔盖耶夫镇位于莫斯科北部71公里。 +镇子不大,因为圣三一修道院坐落于此而繁荣。镇内有不少专门为旅游者服务的门店。 +从莫斯科出发向东北方向,游览数座古老城镇,最后再返回莫斯科的路线被称为“大金环线”,是一条著名的历史文化旅游路线。谢尔盖耶夫镇就是其中的第一站。金环线上的古镇也被称为“金环古城”。 +![](imgs/IMG_20230530_104112.dest.jpg) +![](imgs/IMG_20230530_121219.dest.jpg) +![](imgs/IMG_20230530_123222.dest.jpg) + +既然是为旅游者服务为主业,纪念品当然必不可少,除了全球可见的义乌生产,俄罗斯特色的商品也一样琳琅满目: +![](imgs/IMG_20230530_113109.dest.jpg) +![](imgs/IMG_20230530_113117.dest.jpg) +![](imgs/IMG_20230530_113240.dest.jpg) + +三一修道院前的广场上有很多鸽子,自由自在盘旋飞舞的样子吸引了众多游客: + + +游览结束的时候,在镇上的小饭店吃了简餐。俄餐属于典型的西餐,一道道菜上来,一道道吃,为了不被杯盘狼藉的画面破坏心情,这里只放一张餐前沙拉的照片。 +![](imgs/IMG_20230530_123458.dest.jpg) + +小饭店墙上的画作幽默而风趣,还有完全不同于东亚人隐忍含蓄的奔放。 +![](imgs/IMG_20230530_125037.dest.jpg) +![](imgs/IMG_20230530_125047.dest.jpg) +![](imgs/IMG_20230530_125101.dest.jpg) diff --git a/attachments/russia/020StSergiusLavra.md b/attachments/russia/020StSergiusLavra.md new file mode 100644 index 0000000..a660180 --- /dev/null +++ b/attachments/russia/020StSergiusLavra.md @@ -0,0 +1,42 @@ +# 圣三一修道院 +三一修道院全称为:谢尔盖圣三一修道院,是俄罗斯东正教教会的精神中心,俄罗斯最重要的寺院。据说,这是东正教传入俄罗斯之后的第一座修道院,标志着东正教成为俄罗斯国教的起点。 +修道院在1345年,由修道士谢尔盖·拉多涅日斯基(谢尔盖圣)创建。其后也经过多年不间断的扩建。 +院内有许多在时代和风格上都不同的建筑物。现为莫斯科和全俄牧首公署所在地,其重要性可见一斑。 +![](imgs/IMG_20230530_105212.dest.jpg) +![](imgs/IMG_20230530_110221.dest.jpg) + +修道院及教堂内有大量名家壁画作品,比如俄罗斯著名画家安德烈·鲁布廖夫的画作。 +修道院入口处的壁画记录了谢尔盖圣的几个广为流传的生平事迹。 +壁画维护精心,色彩鲜艳,五彩斑斓。 +![](imgs/IMG_20230530_110326.dest.jpg) +![](imgs/IMG_20230530_110524.dest.jpg) +![](imgs/IMG_20230530_110643.dest.jpg) + +修道院由多所教堂组成,还配套有多座修道士、工作人员生活的建筑。整个建筑群错落有致,环境整洁美观。除了少数国外的游客,更多是俄罗斯本地人在此参观、礼拜、祭奠。 +![](imgs/IMG_20230530_111317.dest.jpg) +![](imgs/IMG_20230530_111336.dest.jpg) + + +修道院中最重要的建筑是圣母大教堂,谢尔盖圣的棺木就安置在教堂里。可惜因为维修,整个建筑被防护网完全覆盖,我没能留下建筑宏伟的外观照片。(下图只是修道院一角,其中被部分覆盖的并不是圣母大教堂,被完全覆盖的圣母大教堂在下面的全景图中能看到) +![](imgs/IMG_20230530_111445.dest.jpg) +圣母大教堂的北侧是鲍利斯·戈东诺夫沙皇家族的墓地。但是因为俄罗斯人都认为是他引起了俄罗斯的混乱,所以他没能被安葬在教堂里面。作为皇族,没能在教堂内安葬,用中国的说法是无法享受后代香火供奉,被视为一件很不体面的事情。 + +教堂内有大量的珍贵文物、法器、壁画、油画等艺术品。装帧华贵炫目,大量的紫金镶嵌或紫金鎏镀让教堂呈现出一派富丽堂皇而又肃穆庄严。 +![](imgs/IMG_20230530_112311.dest.jpg) +![](imgs/IMG_20230530_112141.dest.jpg) +附带说一句,在俄罗斯,教堂内部对于是否允许拍照,不同的教堂有不同的规则。 +大多数的规则是不允许用相机,可以用手机,不能使用闪光灯,不能使用自拍杆。三一修道院也是这样的规则。但完全不允许拍照的教堂也不在少数。 +教堂外面修道院内露天部分的雕像、壁画倒是都允许拍照的。 +除了拍照的规则,教堂内不能打电话及大声喧哗,男士不许戴帽子进入教堂,男女均不可衣冠不整,短裤、短裙都是不能接受的。 + +教堂内的吊灯及天花板上绚丽的壁画: +![](imgs/IMG_20230530_112245.dest.jpg) + +下图是修道院广场的全景照片,加载可能比较慢,但只有全景才能更好的表现对于修道院的整体印象。 + + +北京的气温已经跃上35度,这里还只是初春。修道院内的青草树木透着新生的嫩绿,郁金香开得正艳: +![](imgs/IMG_20230530_114944.dest.jpg) + +院内的展厅也会不时开办一些艺术品的展览,游人络绎不绝。因为门票原因,及并非主要目标,没有入内参观。 +![](imgs/IMG_20230530_115030.dest.jpg) diff --git a/attachments/russia/030ExhibitionCentre.md b/attachments/russia/030ExhibitionCentre.md new file mode 100644 index 0000000..1e37b67 --- /dev/null +++ b/attachments/russia/030ExhibitionCentre.md @@ -0,0 +1,55 @@ +# 全俄展览中心 +全俄展览中心原名国民经济成就展览馆。顾名思义,是用来展示国家成就的。 +展览馆建成于1959年初,同年6月对外开放,之后也不断有扩建和维护。 +世界上有很多大型的展览馆和博览园,比如世博会、园博会都不鲜见,但比较而言,这个仍然是我见过最大的。 +占地300公顷,超过80个展馆。各展馆形态各异,风情万种。但共同的是高大雄伟,并且装饰精美。 + +入口大门: +![](imgs/IMG_20230530_145403.dest.jpg) + +主展馆前正在搭建舞台,估计到了晚上会有表演: +![](imgs/IMG_20230530_151208.dest.jpg) + +作为一个高纬度国家,漂亮的绿植和花草需要更精心的打理: +![](imgs/IMG_20230530_151703.dest.jpg) + +从园区可以看到相邻的摩天轮和更远一点的莫斯科电视塔: +![](imgs/IMG_20230530_151743.dest.jpg) + +坐落在园区中间位置的大喷泉绝对是吸睛亮点: + + +当然,作为世界淡水蓄有量最高的国家,多大的喷泉也不能只有一座: +![](imgs/IMG_20230530_152848.dest.jpg) +你肯定注意到了,照片中只能作为背景出现的一座座建筑,就是一个个的展览场馆。 +![](imgs/IMG_20230530_153012.dest.jpg) + +当然总有些场馆精致到你不忍心让它当配角,高耸的金色五角星和镰刀锤头有没有让你感觉亲切? +![](imgs/IMG_20230530_153109.dest.jpg) + +宏大的场面,照例是全景的强项,顺便我也露一小脸。全民抗疫三年都不带口罩的国度,我这样的总是凤毛麟角,万人中醒目: + + +然而宏大并不代表一切,细节才决定成败: +![](imgs/IMG_20230530_154151.dest.jpg) +花环上的鸽子,是这里随处可见的活体,并非雕塑的一部分。 +![](imgs/IMG_20230530_154317.dest.jpg) +![](imgs/IMG_20230530_154427.dest.jpg) +![](imgs/IMG_20230530_154642.dest.jpg) +![](imgs/IMG_20230530_154759.dest.jpg) + +1959年的场馆,也需要与时俱进,我相信他们也有类似的词: +![](imgs/IMG_20230530_155131.dest.jpg) + +如此大的展馆展园,还有一个意想不到的好处,那就是完全免费。 +这让我这个奥运场馆、园博园、世博园都要凭票入场熏陶而来的人,极度不适。 +谁认识普京大大辛苦给带个话,这样的园子一张票2000卢布绝不算贵,个别场馆还得考虑单独附加购票。不不不,你别跟我提什么医疗、教育也免费的事情,人是不能太贪心的。 + +参观完全俄展览中心回酒店的车程中,可以拍到路边跟楼差不多高的的镰刀锤头雕塑: +![](imgs/IMG_20230530_093931.dest.jpg) +有些痕迹,终究会长存。 + + + diff --git a/attachments/russia/040Kremlin.md b/attachments/russia/040Kremlin.md new file mode 100644 index 0000000..f0efcb2 --- /dev/null +++ b/attachments/russia/040Kremlin.md @@ -0,0 +1,57 @@ +# 克里姆林宫 + +克里姆林宫是访俄的重要行程,然而一早就下起了雨。气温瞬间也降到了10度以下,没有一件有些厚度的外套,就只能拼脂肪层了。 +![](imgs/IMG_20230531_100315.dest.jpg) + +入口塔楼顶部的红色五角星,据说是产于乌拉尔山的红宝石拼合而成,重达4吨。更难能可贵的是,红五星打造成风向标的形式,可以随风而动。 +在这个灰暗的天色下,手机长焦极不给力,借用一张别人的照片来看一下细节: +![](imgs/redStar.webp) + +克里姆林宫军械库外装饰用的古炮: +![](imgs/IMG_20230531_100933.dest.jpg) +军械库在地图上名称就是如此,但我实在无法理解这个面积远超总统官邸的楼难道真的只存军械? + +克里姆林宫大会堂楼顶的俄罗斯双头鹰国徽: +![](imgs/IMG_20230531_101154.dest.jpg) +虽然看上去面积要小一些,但克里姆林宫大会堂的样式,同中国人民大会的样式是有所相似的,据说是建设之前有借鉴中国的设计。 +所以在建国初期,的确中国大量的采用了前苏联的建设图纸,但双方还算的上互相借鉴,共同进步的。 + +总统官邸和其上飘扬的总统旗,旗子升起,表示普京大大正在其中办公: +![](imgs/IMG_20230531_102558.dest.jpg) +顺便一提,在俄罗斯,国旗、总统旗、莫斯科市旗,以及一些古老家族的旗帜,都是不同的。 +总统府的门窗玻璃采用特殊的设计,里面能清晰的看到外面,但外面是看不到里面任何情况的。 + +古代作为“核威慑”存在的炮王(唉,网友们已经毁了太多好词了),实际上一次也没有发射过。让我们共同祈祷从今以后直至千秋,核武也是共同的命运: +![](imgs/IMG_20230531_102347.dest.jpg) + +炮王旁边的钟王,重达202吨,运气更是多舛。1737年铸造将要完成时工场(不是工厂)发生大火,救火时冷水泼在了尚在炽热的大钟上,导致裂缝随后碎裂,11吨重的一个碎片脱落。钟王和碎片埋在废墟中99年,直至1836年尼古拉沙皇下令挖掘出来,于克里姆林宫收藏。毕竟这个世界上,没有什么东西是真正完美的。 +![](imgs/IMG_20230531_102852.dest.jpg) + +天使报喜大教堂看名字就是中国人最喜欢的地方,沙皇大婚的时候,会在这里举行婚礼,并在其中居住一夜。 +其后黄色的建筑物是大克里姆林宫,为总统接待重要国际友人的场所。比如习大大仿俄时,普京总统就在此接待。正式的仪式是国际友人向前,普京在右侧蓝色扶手的楼梯上拾级而下,双方握手成礼。 +![](imgs/IMG_20230531_110342.dest.jpg) + +下面的全景图是教堂内过厅的华丽场面,礼拜堂未能进入: + + +实际上圣母升天大教堂才是克里姆林宫最重要的建筑之一,也是整个俄罗斯国家最重要的大教堂。历代沙皇加冕会在此举行,也是莫斯科都主教和牧首的陵寝。 +![](imgs/IMG_20230531_103535.dest.jpg) + +教堂内的莫诺马赫宝座,是沙皇祈祷时的座位: +![](imgs/IMG_20230531_104029.dest.jpg) + +费拉基米尔圣母圣像是馆藏最重要的文物,此教堂的修建就是为了供奉据说曾于古时显灵的圣象。照片中的是1514年的摹本(左侧神龛中): +![](imgs/IMG_20230531_104508.dest.jpg) + +在克里姆林宫眺望一墙之隔红场上的圣瓦西里升天大教堂和左侧的救世主钟塔,其上有同样规格的红宝石五角星风向标。 +![](imgs/IMG_20230531_112222.dest.jpg) + +从克里姆林宫出来,斜向对着的建筑是俄罗斯国家图书馆(前列宁图书馆)。馆前的雕像是俄国作家陀思妥耶夫斯基。(请原谅我角度太小实在错不开那块交通路牌) +![](imgs/IMG_20230531_114404.dest.jpg) + +> 倘若你想征服世界,你就得征服你自己。 +> 最要紧的是,我们首先应该善良,其次要诚实,再其次是以后永远不要相互遗忘。 +> 我不忧伤,也不泄气。生活终究是生活,生活存在于感受我们自身之中,而不在于外界。 + +--摘自陀思妥耶夫斯基的语录,特别是《罪与罚》 + diff --git a/attachments/russia/050RedSquare.md b/attachments/russia/050RedSquare.md new file mode 100644 index 0000000..426732f --- /dev/null +++ b/attachments/russia/050RedSquare.md @@ -0,0 +1,52 @@ +# 红场 +红场对于俄国,就好像天安门广场对于中国。 +以一幅全景图片开始,是对其最好的尊重。 + + +红场入口的大门: +![](imgs/IMG_20230531_134433.dest.jpg) + +朱可夫元帅铜像,其后是国家博物馆: +![](imgs/IMG_20230531_135054.dest.jpg) + +二战无名烈士墓: +![](imgs/IMG_20230531_135308.dest.jpg) +不同于一般烈士墓的高大挺拔,红场的无名烈士墓碑看起来就像一个没有靠背的长条椅,碑身的右侧,覆盖着一面战旗,战旗上方放置着一面头盔和一束桂枝。这三者均以青铜雕刻而成,象征着无名烈士长眠于此,骤然间让人肃然起敬。 +在碑身正前方的地面上,雕刻着一个凸起的五角星。其正中,是一个熊熊燃烧的火炬,它自纪念碑开放之日起被点燃,几十年来从未熄灭,象征着烈士的精神之光永照人间。火炬所在的五角星四周下陷,形成一个壁龛。其中铭刻着俄文“имя твоё неизвестно подвиг твой бессмертен!”(你的名字无人知晓,你的功绩永世长存!)。 + +无名烈士墓两边的两个护卫战士,每当整点的时候,会有换岗仪式。如同天安门广场的升旗仪式一样,吸引无数游人参观: + + +红场一侧是GUM百货公司,也称国家百货商场: +![](imgs/IMG_20230531_140843.dest.jpg) +![](imgs/IMG_20230531_141301.dest.jpg) + +近观圣瓦西里升天大教堂: +![](imgs/IMG_20230531_141621.dest.jpg) +![](imgs/IMG_20230531_141956.dest.jpg) +照片顶部清晰可见飘落的雨滴,你肯定能体会我现在兴奋、遗憾而又不舍的纠结: +![](imgs/IMG_20230531_142945.dest.jpg) +![](imgs/IMG_20230531_143013.dest.jpg) +圣瓦西里升天大教堂是俄罗斯的标志性建筑,就好像中国的天安门。 +其中包含八个小教堂,围绕着中央教堂,其上的九个穹顶,实际上每一个穹顶对应一个教堂。 +整个16世纪,圣瓦西里教堂一直是莫斯科最高的建筑。1600年建设的伊凡大帝钟楼打破了它的记录。伊凡大帝钟楼位于克里姆林宫教堂广场,在大克里姆林宫对面,本文内没有放置对应照片,因为感觉它的色彩太单一了。 +教堂前的青铜雕像,名为“米宁与波扎尔斯基纪念碑”,是双人青铜像,站立者是库兹马·米宁,坐着手持剑与盾的是德米特里·波扎尔斯基。他们两个人的来源讲起来会非常冗长。大致是1610年8月,莫斯科曾经被波兰人攻陷,1612年9月,下诺夫哥诺德商人米宁组织起一支志愿军,在波扎尔斯基的指挥下历时3个月打败波兰军队,结束了他们对莫斯科两年多的占领。解放出关押在监狱里的所有犯人,其中包括第二年缙绅会议推选为新沙皇的米哈伊尔·罗曼诺夫。持续三百多年的罗曼诺夫王朝统治由此开始。 + +吉姆百货旁边的时光隧道,如果是晚上,星光璀璨映照着如织游人,会有时空穿梭之感: +![](imgs/IMG_20230531_151651.dest.jpg) + +吉姆百货内部装饰华丽,名店云集,不过商品价格,也挺华丽。我最终只是吃了一客冰激凌。就是照片中广告画上那个: +![](imgs/IMG_20230531_150756_2.dest.jpg) + +吉姆百货一端的地下室有一个中世纪的厕所,据说马桶圈都是紫金的,原来是皇家专用。我过去看了看,考虑到200卢布上一次厕所,很有点不过日子,所以放弃了。 + +全景图是在吉姆百货二层中间的一排拍摄的,对于只逛不买的人来说,看起来感受一下足够了: + + +广场上,经常还会有一些商店的促销活动,比如今天赶上的是来自北方的海鲜: +![](imgs/IMG_20230531_154216.dest.jpg) +离莫斯科最近的是波罗的海,但波罗的海作为一个被大陆包裹着的内海,大量的陆地河流冲刷和少量的洋流涌入,使得波罗的海含盐量非常低,基本接近淡水。所以波罗的海并没有海鲜出产,只有类似国内的一些河鱼。 + + diff --git a/attachments/russia/060MetorVictory.md b/attachments/russia/060MetorVictory.md new file mode 100644 index 0000000..6ee54d5 --- /dev/null +++ b/attachments/russia/060MetorVictory.md @@ -0,0 +1,40 @@ +## 地铁 + +由红场乘坐地铁,三站地就可以到达莫斯科胜利广场。 +战斗民族的地铁乘坐之前需要有心理准备。原因是莫斯科地铁在地下非常深,这导致进出站的扶梯即深且长,视觉观感非同一般的陡峭。扶梯速度也很快,大概是国内扶梯速度的三倍。照片实在难以表现那种如同临渊深探的心情: +![](imgs/IMG_20230531_163818.dest.jpg) + +地铁内壁画、雕塑也是随处可见,艺术家们似乎不肯放过一处空白。所以莫斯科地铁也被称为世界上最美的地铁: +![](imgs/IMG_20230531_161407.dest.jpg) +![](imgs/IMG_20230531_161810.dest.jpg) +![](imgs/IMG_20230531_163408.dest.jpg) + +车厢内布局跟国内大同小异,但不同的是人少得多: +![](imgs/IMG_20230531_162027.dest.jpg) + +## 凯旋门 +从地铁站上来,第一个路口,刚好看到凯旋门之上的胜利女神架着铜马车: +![](imgs/IMG_20230531_164516.dest.jpg) + +最戏剧性的是,莫斯科凯旋门,跟巴黎凯旋门,是为了纪念同一场战役而修建的。莫斯科当然是为了纪念俄军打败拿破仑。 +![](imgs/IMG_20230531_171315.dest.jpg) +![](imgs/IMG_20230531_171404.dest.jpg) + +## 胜利广场 +继续沿着过街地道到下一个路口,上来就是胜利公园。 +其中的胜利广场占地135万平方米,相比较红场:9万平方米,天安门广场:44万平方米。是我见过最大的广场。由2660万块方砖铺成,象征卫国战争中死难的2660万人。 +下图为在广场中央拍摄: +![](imgs/IMG_20230531_165305.dest.jpg) +图正中是胜利女神纪念碑,位于广场西侧。纪念碑高达141.8米,象征持续了1418天的卫国战争。纪念碑顶是胜利女神高举月桂花环,碑身形似利剑,雕刻有英雄人物浮雕,碑体下部是俄罗斯勇士格奥尔基持长矛英勇刺杀毒蛇的雕像。 +![](imgs/IMG_20230531_165854.dest.jpg) +纪念碑后面半圆形的建筑是中央博物馆,博物馆内纪念了莫斯科保卫战,列宁格勒反围困战,斯大林格勒战役,攻克柏林。荣誉厅的墙上,刻满了英雄的名字。纪念礼品中有中国人民解放军和张万年上将赠送的礼品。 + +广场的一侧是常胜圣格奥尔基大教堂: +![](imgs/IMG_20230531_170210.dest.jpg) + +胜利广场的卫国英雄雕塑: +![](imgs/IMG_20230531_164933.dest.jpg) + +胜利广场全景图: + + diff --git a/attachments/russia/070University.md b/attachments/russia/070University.md new file mode 100644 index 0000000..90d15e8 --- /dev/null +++ b/attachments/russia/070University.md @@ -0,0 +1,31 @@ +# 莫斯科大学 + +莫斯科大学位于麻雀山顶。东欧平原少山,仅仅海拔220米的麻雀山也成了珍藏。 +麻雀山以前其实叫列宁山,苏联解体后去列宁化,因山上麻雀数量很多,更名为麻雀山。 +莫斯科大学主教学楼是苏联时期斯大林下令修建的七所高层塔楼中最高的一座。完工于1953年,共有36层,最高处240米。 +![](imgs/IMG_20230604_125453.dest.jpg) + +这七座斯大林时期、“斯大林式”的高楼,结合了巴洛克式城堡塔、中世纪欧洲哥德式与美国1930年代摩天楼的特色。也被称做莫斯科七姐妹。 +从1948年起开始修建的七姐妹塔楼分别是: +* 莫斯科大学主教学楼,建造时间:1949-1953 +* 列宁格勒饭店,建造时间:1949-1953 +* 劳动模范公寓,建造时间:1948-1952 +* 重工业部大楼,建造时间:1949-1953 +* 乌克兰饭店,建造时间:1950-1956 +* 文化人公寓,建造时间:1950-1954 +* 外交部大楼,建造时间:1948-1953 + +作为世界上国土面积最大的国家,俄罗斯的广场给人的感觉首先就是大。 + + +莫斯科大学是俄罗斯排名第一的学府,在世界也有极高的声望。在数学、物理学、生物学、地质学、化学以及其他科学领域所取得的成就举世瞩目,共有11 位诺贝尔奖获得者,约300名俄罗斯科学院、俄罗斯教育院院士。2020年QS世界大学排名中莫斯科大学位居第84。2020年的QS世界专业排名(前50)方面:语言学第24名,自然科学第21名,现代语言学第34名,物理和天文学第33名,数学第43名,旅行第45名,人文科学第47名。 + +和大多欧美大学一样,莫斯科大学并不用围墙把校园同市区隔开。只是主楼的入口需要门禁。 +楼前宏大的广场上,有很多休闲的市民,和趁着气温转暖维护绿植的工作人员。 +![](imgs/IMG_20230604_125627.dest.jpg) + +莫斯科大学主楼隔着广场对面,在山边处有一个不大的观景台,可以眺望小半个莫斯科市区。 +图为不远处的卢日尼基体育场,是1980年俄罗斯奥运会的主会场。 +体育场前面靠近观景台一侧还有隐约可见的莫斯科河。 +![](imgs/IMG_20230604_124131.dest.jpg) + diff --git a/attachments/russia/080Kolomenskoye.md b/attachments/russia/080Kolomenskoye.md new file mode 100644 index 0000000..a7220cd --- /dev/null +++ b/attachments/russia/080Kolomenskoye.md @@ -0,0 +1,31 @@ +# 卡洛明斯克庄园 +卡洛明斯克庄园是俄罗斯最美的庄园之一,位于莫斯科东南,坐落在莫斯科河畔,占地面积达345公顷。 +是沙皇时期的皇家别苑,14世纪时是莫斯科大伊凡王子和俄国沙皇的避暑山庄。从16世纪开始,很多帝皇,如伊凡雷帝、彼得大帝等都在这里修建过别墅。 +![](imgs/IMG_20230604_142358.dest.jpg) + +庄园里有很多14~17世纪建造的教堂和木质建筑,就像博物馆里的陈列品一样排列着。 +![](imgs/IMG_20230604_141249.dest.jpg) +![](imgs/IMG_20230604_141458.dest.jpg) +![](imgs/IMG_20230604_142002.dest.jpg) +![](imgs/IMG_20230604_142404.dest.jpg) + +沿着甬道绕过教堂,可以到达莫斯科河河畔。春天的风景秀丽宜人,是恋爱的好地方。 +![](imgs/IMG_20230604_141916.dest.jpg) +看着男生手提的行李,似乎要远行的样子,希望不是去战场前的吻别。毕竟很多人嘴里说的再见,就是再也不见。 + +庄园内的教堂都很香火鼎盛的样子,并且头一次见到了类似国内少林寺一样,根据蜡烛大小的不同,分别标价。在俄罗斯教堂内的祈祷,需要供奉香烛。就跟国内烧香意思一样。 +教堂前的小广场上,会有修女向善众布道。 +![](imgs/IMG_20230604_142723.dest.jpg) + +彼得大帝在1702年居住的房子,也称为“彼得小屋”,是从阿尔汉格里斯克(俄罗斯西北部的一座沿海城市)搬过来的。原样重建在丛林边缘。 +![](imgs/IMG_20230604_143325.dest.jpg) +俄罗斯人民崇尚勇武,羡慕强者。作为俄罗斯第一大帝的彼得,这个起家的小房子,不时被游人光顾。 +![](imgs/IMG_20230604_143500.dest.jpg) + +庄园有面积巨大的草坪绿地,难得还保持的非常干净: + + +![](imgs/IMG_20230604_150801.dest.jpg) + + + diff --git a/attachments/russia/090circus.md b/attachments/russia/090circus.md new file mode 100644 index 0000000..3dd1b98 --- /dev/null +++ b/attachments/russia/090circus.md @@ -0,0 +1,39 @@ +# 马戏表演 + +莫斯科著名的马戏团有两个,一个是国立大马戏团,还有一个是坐落于市中心的尼库林马戏团(Nikulin Circus)。 +其中后者交通方便,位于商业区。除了看马戏,也能满足逛街的爱好,因此比较受观众的追捧。这是说观众而不说游客,是因为莫斯科本地人扶老携幼来看马戏的人,远远多于外来游客,不是那种草台班子专骗游客钱的表演可比。 +马戏团晚间票的时间通常是当地时间下午六点。这个时间肯定是错过了晚餐,所以可以早一点到,在闹市区觅觅食。 +隔壁商场的顶层,跟大多商场一样,是美食中心。会有各种各样、来自各地的特色餐饮。想快的话,两角牛肉奶酪馅饼也可以饱餐一顿: +![](imgs/IMG_20230604_161157.dest.jpg) + +吃完饭如果不到开场时间,在商场闲逛一下,也可以打发时间: +![](imgs/IMG_20230604_162954.dest.jpg) +![](imgs/IMG_20230604_162851.dest.jpg) + +男士通常是不爱逛店的。马路对面有一个街心公园,因为临近地铁站,人流涌动,会有很多小摊贩值得一看。如果是周末就更为热闹,通常都会有各种免费的表演。演员虽然大多是业余客串,但因为从小生长在俄罗斯这样的艺术国度,表演水平说得上非同一般。 +![](imgs/IMG_20230604_170032.dest.jpg) + + + +马戏表演通常由互动的暖场活动开始,本次是一个艺术家拿着画板出来,现场为小朋友做速写画像: +![](imgs/IMG_20230604_175342.dest.jpg) + +艺术家头顶会戴着摄像头,实时把绘制结果投放在大屏幕上: +![](imgs/IMG_20230604_175910.dest.jpg) +大屏幕下面是乐队的位置,马戏团聘请了莫斯科国立交响乐团作为全程的伴奏乐队,水平很高,被当做卖点之一。 + +马戏团舞台的设置是比较有创造力的亮点之一,结合了自动升降、音乐喷泉、高空悬吊等多种经典又结合现代化的功能,表演效果美轮美奂。剧场全景: + + +关于马戏表演,咳……全程是禁止拍照录像的。知道这个要求的时候,我大脑中首先浮现了冯德良的一句话:吃肉不吃蒜,香味儿减一半。 +不过规矩就是规矩,遵守还是必须的。只在表演开始前,以及最后谢幕的过程中,拍了几张聊胜于无。 +![](imgs/IMG_20230604_204344.dest.jpg) +![](imgs/IMG_20230604_204103.dest.jpg) +其实最后的照片我只是想让你看看全场的座位,已经是座无虚席。至于表演的内容,发挥想象力吧。 + +马戏剧场外观,散场时刻,人是显得很多的: +![](imgs/IMG_20230604_205352.dest.jpg) diff --git a/attachments/russia/100Krestovsky.md b/attachments/russia/100Krestovsky.md new file mode 100644 index 0000000..6304e56 --- /dev/null +++ b/attachments/russia/100Krestovsky.md @@ -0,0 +1,68 @@ +# 圣彼得堡 +前面的部分,都是在莫斯科和周边的城镇。由本篇开始,我们来到了圣彼得堡。 + +圣彼得堡是俄罗斯第二大城市,始建于1703年,已有320年的历史。 +每年5月27日,是圣彼得堡的城市日。我们5月31号到达圣彼得堡,城市中建城320周年的庆典气氛依然不减。 + +300多年前,彼得大帝为了取得波罗的海出海口,打通俄罗斯至欧洲诸国的海上商路,实现他将俄国建成海上强国的梦想。御驾亲征,从瑞典人手里夺得涅瓦河三角洲地带。然后下令在此建一座以他的名字命名的城市,并发誓要把它建成世界上最美的城市。 +1712年彼得一世迁都到彼得堡,一直到1918年的200多年的时间里这里都是俄罗斯文化、政治、经济的中心。所以俄罗斯旅游,圣彼得堡甚至重要于莫斯科是必至的一站。 + +也有一种说法是市名源自耶稣的弟子圣徒彼得,个人觉得合理性不足。否则干嘛不用耶稣第二个弟子、以忠厚和老实著称的圣安德鲁来命名? :) +二战时期,因为“堡”一词源于德语,作为交战国的俄罗斯将市名修改为“彼得格勒”,“格勒”是俄语城市的意思。 +1924年为纪念列宁,圣彼得堡曾更名为列宁格勒,1991年随着苏联解体,又恢复原名。圣彼得堡的命名可说一波三折。 + +圣彼得堡是俄罗斯最西方化的城市,是俄罗斯通往欧洲的窗口,许多外国领事馆、跨国公司、银行和其他业务据点均位于圣彼得堡,也是一座科学技术和工业高度发展的国际化城市。整体城市建设,建筑风格,文化氛围,都更接近于西欧诸国。 + +# 黄金三岛 +因为坐落于涅瓦河三角洲地带,涅瓦河及其支流将城市分割为大大小小多座岛屿。岛屿之间由桥梁相连,全市共有400多座桥梁。桥梁与河流汇集,因此圣彼得堡也被称为“北方威尼斯”。与此类似的别称,还有“雨中之都”,盖因为圣彼得堡一年差不多2/3的时间在阴雨或者风雪中度过。 +在组成圣彼得堡的这些岛屿中,有三个小岛环境优美,植被最丰盛,环境宜人,是圣彼得堡的富人区。所以也被称为“黄金三岛”,分别是十字架岛、埃尔金岛和兔子岛。 +当前时期,圣彼得堡平均房价折合人民币大概2万/平米。黄金三岛的豪宅则可以达到平均5万/平米。 +富人区实际是指前面两个岛屿,兔子岛当前是旅游景点,已经不用于居住。 + +## 十字架岛 +恐怕是自从几十年前中俄交恶后国内全面普及英语教育的原因,对于苏联地名的翻译有各种不规范。拿十字架岛来说,有简称“十字岛”,还有直接音译“克列斯托夫斯基岛”。再加上音译可能使用了不同的同音字,同一个岛屿,出现了很多个中文地名。 +从网上查到的资料看,十字架岛最适合秋季游览。金黄、火红的树叶,伴着蓝天碧水,的确增色不少。不过春天,也有春天的味道。 +![](imgs/IMG_20230601_080341.dest.jpg) + +岛上有一座克雷斯托夫斯基体育场,是2018年世界杯主场馆之一,也是俄罗斯足球超级联赛球队圣彼得堡泽尼特足球俱乐部的主场: +![](imgs/IMG_20230601_075800.dest.jpg) +![](imgs/IMG_20230601_074651.dest.jpg) +多个中文地名的情况再次出现,因为翻译方式不同,这个体育场还被称为“圣彼得堡体育场”、“阿瑞娜球场”等。再因为球场由国立天然气公司投资建设,也有人把这里叫做“国立天然气公司体育场”。 +在体育场对面海边处,可以隔海眺望国立天然气公司总部大厦,也是目前圣彼得堡最高楼: +![](imgs/IMG_20230601_074437.dest.jpg) + +## 埃尔金岛 +埃尔金宫是埃尔金岛上的重要的景点,是沙皇亚历山大一世期间夏季度假的地方。修建于凯瑟琳大帝统治期间的一座大厦遗址上,而起初它是为沙皇亚历山大一世的母亲而设计。二战期间宫殿受损,随后重新修缮,现在为博物馆。 +![](imgs/IMG_20230601_080954.dest.jpg) +![](imgs/IMG_20230601_082212.dest.jpg) + +植被丰茂,加上少人打扰。岛上的小动物也能悠闲的生活: +![](imgs/IMG_20230601_082821.dest.jpg) + +岛上有传统别墅,也有现代建筑,共同的特点是贵气十足: +![](imgs/IMG_20230601_081247.dest.jpg) +![](imgs/IMG_20230601_080529.dest.jpg) +![](imgs/IMG_20230601_081330.dest.jpg) + +花香和青草香弥漫的清晨中,沿着河边步道慢跑肯定是很惬意的事情。当然富人区还有更好的选择,比如增进感情和锻炼身体两不耽误的双人皮划艇: +![](imgs/IMG_20230601_083351.dest.jpg) + +## 兔子岛 +兔子岛位于涅瓦河最宽处,被涅瓦河和克容维尔科斯基海峡环绕。北面与彼得格勒岛和克容维尔科斯基岛隔水相望。岛长约750米,宽约400米。 +兔子岛是圣彼得堡诸岛中最小的一个,但位置险要,扼守在涅瓦河的入海口,属于兵家必争之地。 +所以在彼得大帝得到涅瓦河三角洲之后,第一个建设的岛屿就是兔子岛,彼得堡罗要塞即坐落于此。可以说圣彼得堡市的建设,是从兔子岛的建设开始的。 +![](imgs/IMG_20230601_151853.dest.jpg) +![](imgs/IMG_20230601_152556.dest.jpg) +![](imgs/IMG_20230601_152902.dest.jpg) + +兔子岛的名字来源于此处以前的芬兰名称,发音接近俄语“兔子”,由此命名。 +岛上大量的兔子雕像,说明俄罗斯人对这个名字还是喜爱有加的。 +![](imgs/IMG_20230601_153125.dest.jpg) +![](imgs/IMG_20230601_153555.dest.jpg) + +彼得堡罗要塞的一角被设计成了一个监狱,里面曾经关押过超过1500名犯人。大多是沙皇俄国时期的政治犯和搞各种政治活动的异见人士。很多人的名字说出来能吓死你,比如前面说过写了《罪与罚》的陀思妥耶夫斯基、布尔什维克主要领导人托洛茨基、《海燕》作者高尔基等等。 +被沙皇认定的罪犯,会通过涅瓦门投入监狱。而关进监狱的人,十去九不还。所以涅瓦门有一个令人闻风丧胆的名字:“死亡之门”。 +![](imgs/IMG_20230601_153357.dest.jpg) + +因为兔子岛小巧精致,环顾四周更容易看到涅瓦河围绕着要塞缓缓流淌。如今河上游船穿梭,再不复当年军事堡垒和政治犯四起的晦暗沉重了。 +![](imgs/IMG_20230601_153835.dest.jpg) diff --git a/attachments/russia/110SummerPalace.md b/attachments/russia/110SummerPalace.md new file mode 100644 index 0000000..e8dc0af --- /dev/null +++ b/attachments/russia/110SummerPalace.md @@ -0,0 +1,44 @@ +# 彼得大帝夏宫花园 +占地面积四百多公顷的彼得大帝夏宫距离圣彼得堡约40公里,位于芬兰湾南岸,紧邻波罗的海。 +夏宫分为上花园和下花园,很可惜,上花园因为例行维修并没有开放。 + +入口布满了卖旅游纪念品的小商铺,乍一看很有回到中国的感觉: +![](imgs/IMG_20230601_095644.dest.jpg) + +进入夏宫也需要额外购票,可以一览建筑物内彼得大帝避暑期间日常起居的地方。排队等待进入的人也不算少: +![](imgs/IMG_20230601_100546.dest.jpg) + +夏宫下花园核心的大喷泉在整个欧洲的皇家园林中也十分著名: +![](imgs/IMG_20230601_100627.dest.jpg) +![](imgs/IMG_20230601_101019.dest.jpg) +![](imgs/IMG_20230601_113931.dest.jpg) + + +沿运河直走到头就是波罗的海,小码头不大,有水翼船可以由水路返回圣彼得堡市区。 +![](imgs/IMG_20230601_105843.dest.jpg) + +下面的全景图是在海边所拍摄,一边是皇家园林,一边是波罗的海风光。皇家的奢华非我等可以想象。 + + +夏宫的地面采用了红色碎石屑铺幔在表层。俄罗斯的其它园林也多是同样的设计。其实很多国家都有类似的设计,比如日本的枯山水造园(原从中国宋朝流传至日本)。我做了认真的考证,发现实际上这是非常实用的一种方式。可以让降雨快速的渗透,不会积水。降雨也能快速补充进地下水源。 +反观我国很多广场地面采用沥青、水泥、大理石等材料,降雨只能流入下水道,当做污水排放完全浪费掉。地下水常年得不到补充,多个城市发生沉降。好在海绵城市的说法,已经受到越来越多人的重视。 + +夏宫园林内的建筑: +![](imgs/IMG_20230601_110100.dest.jpg) +![](imgs/IMG_20230601_111204.dest.jpg) +![](imgs/IMG_20230601_111533.dest.jpg) +![](imgs/IMG_20230601_112015.dest.jpg) +![](imgs/IMG_20230601_104829.dest.jpg) + +园林的设计以迷宫型的绿植造型和喷泉有机结合为主要形式: +![](imgs/IMG_20230601_111712.dest.jpg) +![](imgs/IMG_20230601_111747.dest.jpg) +![](imgs/IMG_20230601_113009.dest.jpg) + +夏宫主楼: +![](imgs/IMG_20230601_113432.dest.jpg) + +因为彼得大帝在海边夏宫的修建,附近的土地也快速升值。很多贵族在此修建度假别墅。普京总统也曾在下图的度假别墅中短住,别墅原主人的名字我没记住,俄国人的名字对于我来说太过聱牙拗口。但楼顶的三色国旗说明建筑当前已经属于国有: +![](imgs/IMG_20230601_121137.dest.jpg) diff --git a/attachments/russia/120SaintIsakievCathedral.md b/attachments/russia/120SaintIsakievCathedral.md new file mode 100644 index 0000000..b035623 --- /dev/null +++ b/attachments/russia/120SaintIsakievCathedral.md @@ -0,0 +1,30 @@ +# 伊萨基辅大教堂 +伊萨基辅大教堂,又称圣伊撒基耶夫大教堂,坐落在圣彼得堡市区(也译圣埃萨大教堂),曾是圣彼得堡市的最高建筑,也是圣彼得堡的标志性建筑。 +与梵蒂冈的圣彼得大教堂、伦敦的圣保罗大教堂和佛罗伦萨的花之圣母大教堂并称为世界四大圆顶教堂。 +因为教堂位置正是市区交通要道,周边车流密集,经常拥堵。 +![](imgs/IMG_20230601_140354.dest.jpg) +![](imgs/IMG_20230601_141754.dest.jpg) +![](imgs/IMG_20230601_140204.dest.jpg) + +因为教堂非常宏伟,实际上坐车、乘船,在很远处就能见到教堂的金顶: +![](imgs/IMG_20230601_135034.dest.jpg) + +每天来教堂的参观者众多,周边很多专门做游客生意的人,比如童话故事般的古典马车,比如遍身金粉的雕塑人: +![](imgs/IMG_20230601_142834.dest.jpg) +![](imgs/IMG_20230601_142446.dest.jpg) + +教堂的修建当然一如既往的华丽而精致: +![](imgs/IMG_20230601_141955.dest.jpg) +![](imgs/IMG_20230601_142023.dest.jpg) + +因为教堂同圣彼得堡市一起,在卫国战争中挺过了长达900多天的列宁格勒保卫战。建筑本身被大量损坏,战后的修复中,政府保留了损害最轻的一面原样不动。至今大门、柱子上,仍能看到弹片的痕迹。 +![](imgs/IMG_20230601_141910.dest.jpg) + +教堂对面的街心公园中鲜花盛开: +![](imgs/IMG_20230601_140257.dest.jpg) + +公园内靠近涅瓦河边一侧有一座著名的彼得大帝青铜骑士像,用以展示彼得大帝的勇武: +![](imgs/IMG_20230601_140730.dest.jpg) + +雕像一侧对面,是俄罗斯陆军总部办公大楼: +![](imgs/IMG_20230601_141130.dest.jpg) diff --git a/attachments/russia/130SeaGodPilla.md b/attachments/russia/130SeaGodPilla.md new file mode 100644 index 0000000..ba373d1 --- /dev/null +++ b/attachments/russia/130SeaGodPilla.md @@ -0,0 +1,16 @@ +# 圣彼得堡海神柱 +海神柱原来就是灯塔,两个海神柱坐落于海神交易所门前海边,塔顶的长明灯指引着来自欧洲的商船不迷失方向。 +![](imgs/IMG_20230601_145346.dest.jpg) +![](imgs/IMG_20230601_145943.dest.jpg) + +海神交易所曾是波罗的海沿岸最大的商品交易所之一,俄罗斯的矿产、宝石由此销往欧洲: +![](imgs/IMG_20230601_150010.dest.jpg) + +海神柱旁边有斜坡可以下到涅瓦河边,眺望沿河而建的冬宫: +![](imgs/IMG_20230601_145509.dest.jpg) + +彼得堡罗要塞也清晰可见: +![](imgs/IMG_20230601_145611.dest.jpg) + +还有刚刚见过的圣伊撒基耶夫大教堂金顶: +![](imgs/IMG_20230601_145736_1.dest.jpg) diff --git a/attachments/russia/140Catherine.md b/attachments/russia/140Catherine.md new file mode 100644 index 0000000..93c5f77 --- /dev/null +++ b/attachments/russia/140Catherine.md @@ -0,0 +1,102 @@ +# 叶卡捷琳娜宫 +叶卡捷琳娜宫建于18世纪初,是彼得大帝专门为其爱妻叶卡捷琳娜一世建造的消暑宫殿。在此后数百年的光阴中,彼得大帝之女伊丽莎白·彼得罗夫娜和著名的叶卡捷琳娜大帝都曾对这座宫殿进行设计和改变。 +叶卡捷琳娜实际是俄文的直接音译,罗马文和英文的读音也会翻译做凯瑟琳(Catherine)。 +此外还要注意,彼得大帝的妻子叶卡捷琳娜一世,和通常所说的叶卡捷琳娜大帝并不是一个人。前者是彼得大帝去世后按照彼得大帝遗愿继位的女皇。后者也称为叶卡捷琳娜二世,实际是第八任沙皇。是发动宫廷政变,推翻丈夫彼得三世后就任沙皇的。 +叶卡捷琳娜大帝在位时期因治国有方、功绩显赫,使当时的俄罗斯成为名符其实的欧洲第一强国。其才干与名气也闻名海内外,成为俄罗斯人心目中和彼得一世齐名的一代英主,因此尊享大帝称号。 + +叶宫位于圣彼得堡南部的皇村。因为相邻叶宫还有一座皇家贵族学院,著名大文豪普希金是这个学院第一届的学生,在此读书6年。因此普希金成名后,这里也被称为普希金村,而皇家贵族学院也更名为普希金学院。 +路边公园中的普希金雕像: +![](imgs/IMG_20230602_100200.dest.jpg) + +普希金学院正门: +![](imgs/IMG_20230602_100522.dest.jpg) + +> 假如生活欺骗了你, +> 不要悲伤,不要心急! +> 忧郁的日子里需要镇静; +> 相信吧,快乐的日子将会来临。 +> 心儿永远向往着未来; +> 现在却常是忧郁。 +> 一切都是瞬息, +> 一切都将会过去; +> 而那过去了的, +> 就会成为亲切的怀恋。 + +《假如生活欺骗了你》是普希金的代表作之一,我国初中语文课本中也有收录。普希金才华横溢,然而为情所困,并在同妻子出轨的情人决斗中丧生,终年仅30岁。 +普希金的声名显赫,其才华当然是一方面。其悲剧的一生和为情所困的八卦也不得不说起了推波助澜的作用。 +正是古来经典无人问,唯有八卦动人心。在八卦情结上,古今中外没有什么区别。 + +叶卡捷琳娜宫具有巴洛克式风格。外墙采用天蓝色、白色和金色这三种颜色,还搭配了精美的浮雕。远远的看去,既富丽奢华又浪漫梦幻。而皇宫教堂上五个金光灿灿的圆葱头式尖顶,则是宫殿中最为耀眼的存在。与其它宫殿相比,叶卡捷琳娜宫给人的感觉更为柔美清新,这显然代表着女王的喜好。 +蓝色、白色和金色的配色方式,实际在许多俄罗斯建筑中都能看到。据说也是俄罗斯国旗配色的延伸。俄罗斯国旗是白、蓝、红三色,白色象征慷慨与坦率;蓝色象征忠诚和诚实;红色象征勇气与热情。建筑物上的金色,一般使用紫金或者紫金色,是最接近红色的华丽装饰。 + + +叶宫特色鲜明,不少普希金学院的学生选择在此写生,吸引了大量游客围观,成为额外一景: +![](imgs/IMG_20230602_101217.dest.jpg) +![](imgs/IMG_20230602_101417.dest.jpg) +![](imgs/IMG_20230602_101737.dest.jpg) + +宫殿的雕像: +![](imgs/IMG_20230602_102303.dest.jpg) + +楼梯间的一角: +![](imgs/IMG_20230602_104237.dest.jpg) + +门边的人像柱: +![](imgs/IMG_20230602_104311.dest.jpg) + +金色大厅: +![](imgs/IMG_20230602_104553.dest.jpg) + +大厅鎏金璀璨的一角: +![](imgs/IMG_20230602_104625.dest.jpg) + +门上繁复的金饰: +![](imgs/IMG_20230602_105020.dest.jpg) + +大厅中,可以与游人合影(收费)的艺人,所穿服饰模仿叶卡捷琳娜大帝,右侧是她的摄影师: +![](imgs/IMG_20230602_105601.dest.jpg) + +叶卡捷琳娜大帝的宴客厅,招待文武大臣: +![](imgs/IMG_20230602_110948.dest.jpg) + +另一间宴客厅,招待王公贵族: +![](imgs/IMG_20230602_111321.dest.jpg) + +被称为“世界第八大奇迹的”琥珀宫最初是在18世纪初,由普鲁士国王弗里德里希一世下令,历时10年建造的,耗费各色顶级琥珀6吨。 +作为国礼赠送给俄罗斯之后,又经过大幅扩建,继续增加琥珀、紫金、红宝石、变色石等贵重材料,从20平米,扩建到55平米。就当时的物价,琥珀比黄金贵12倍。 +当前的琥珀宫为复制品,原琥珀宫在二战时遗失,至今是世界级悬案。琥珀宫原为叶卡捷琳娜大帝的寝宫: +![](imgs/IMG_20230602_112353.dest.jpg) + +附一张琥珀宫全景图,贫穷真的能限制你的想象力: + + +宫内的藏品油画: +![](imgs/IMG_20230602_112729.dest.jpg) +![](imgs/IMG_20230602_113624.dest.jpg) + +享誉欧洲皇室建筑的金色长廊,全长300多米,完全没有障碍物。当然因为如织的游客,那种华贵无尽的氛围可能体会不到了: +![](imgs/IMG_20230602_113243.dest.jpg) + +叶宫花园的军乐队,可以与游客合影: +![](imgs/IMG_20230602_115055.dest.jpg) + +花园中喂野鸭的俄罗斯少女: +![](imgs/IMG_20230602_120840.dest.jpg) + +虽然有夏宫花园珠玉在前,叶宫花园依然美不胜收: +![](imgs/IMG_20230602_121106.dest.jpg) +![](imgs/IMG_20230602_122306.dest.jpg) +![](imgs/IMG_20230602_122934.dest.jpg) +![](imgs/IMG_20230602_124153.dest.jpg) +![](imgs/IMG_20230602_121847.dest.jpg) +![](imgs/IMG_20230602_124835.dest.jpg) +![](imgs/IMG_20230602_115418.dest.jpg) + +叶宫主建筑: +![](imgs/IMG_20230602_125712.dest.jpg) + +叶宫花园的生态维护也非常之好,偶遇两只筑巢的水鸟卿卿我我: +![](imgs/IMG_20230602_122720.dest.jpg) + diff --git a/attachments/russia/150WinterPalace.md b/attachments/russia/150WinterPalace.md new file mode 100644 index 0000000..4e3a3d7 --- /dev/null +++ b/attachments/russia/150WinterPalace.md @@ -0,0 +1,144 @@ +# 冬宫和冬宫藏品 +冬宫原为俄罗斯帝国沙皇的皇宫。同中国的紫禁城一样,历代皇帝都在此生活,以及同文武大臣一起办公。 +直到“十月革命”,著名的“一声炮响”,推翻沙皇统治后,被辟为圣彼得堡国立艾尔米塔什博物馆的一部分。 +俄罗斯艾尔米塔什博物馆,共有六个宫殿组成,是一个宏伟的建筑群。冬宫是其中的一座宫殿,建于1754年至1762年。博物馆坐落在圣彼得堡宫殿广场上。圣彼得堡在城市建设基本完成以后,一直是俄罗斯的首都,1918年才迁都莫斯科。 +冬宫是18世纪中叶俄罗斯新古典主义建筑的杰出典范,艾尔米塔什博物馆藏品超过270万件,与伦敦的大英博物馆、巴黎的卢浮宫、纽约的大都会艺术博物馆一起,并称为世界四大博物馆。艾尔米塔什博物馆最早是俄罗斯女皇叶卡捷琳娜二世(叶卡捷琳娜大帝)的私人博物馆。 +不得不承认,从面积(艾尔米塔什博物馆是多层建筑)、藏品数量、馆藏价值等多方面来说,艾尔米塔什博物馆都超过我国故宫甚多。 + +从冬宫广场上看冬宫: +![](imgs/IMG_20230602_162024.dest.jpg) +![](imgs/IMG_20230602_162414.dest.jpg) + +门票: +![](imgs/IMG_20230602_145326.dest.jpg) + +华丽的门厅和“约旦楼梯”: +![](imgs/IMG_20230602_150019.dest.jpg) +![](imgs/IMG_20230602_150055.dest.jpg) + +天顶的壁画《奥林匹斯山》,作者提香·韦切利奥。在文武众臣、达官显贵进入冬宫的门厅天顶放置这样一幅作品,喻义是十分明显的: +![](imgs/IMG_20230602_150027.dest.jpg) + +门前的小吊灯: +![](imgs/IMG_20230602_150244.dest.jpg) + +走廊口柱帽上的天使雕塑,相对两座雕塑,有把守入口的意思: +![](imgs/IMG_20230602_155529.dest.jpg) + +第一间藏品室是埃及文物: +![](imgs/IMG_20230602_145706.dest.jpg) +![](imgs/IMG_20230602_145734.dest.jpg) +能从别的国家掠夺真是一件幸福的事,可惜我们一直是被别人抢。 + +沙皇的王座和其上的穹顶: +![](imgs/IMG_20230602_150506.dest.jpg) +华丽的议事厅: +![](imgs/IMG_20230602_150542.dest.jpg) +象征皇权的装饰雕塑《俄罗斯勇士护卫权杖》: +![](imgs/IMG_20230602_150635.dest.jpg) +青铜门饰: +![](imgs/IMG_20230602_150824.dest.jpg) + +《基督降架》,也称:《卸下圣体》,作者:尼德兰最伟大的画家 韦登: +![](imgs/IMG_20230602_151504.dest.jpg) +《圣禄嘉绘圣母像》,也是韦登作品: +![](imgs/IMG_20230602_151512.dest.jpg) + +《圣母子》,作者:菲利波·里皮,意大利画家 +![](imgs/IMG_20230602_152302.dest.jpg) +《圣奥古斯丁的愿景》,作者:菲利波·里皮 +![](imgs/IMG_20230602_152359.dest.jpg) + +《柏诺瓦的圣母》,也称《持花圣母》,作者:达芬奇。作品创作于1478年左右,被视为达芬奇创作道路上的一个里程碑。画面中圣母的微笑反映的是尘世中年轻少妇面对自己孩子的幸福之感,是世俗的母性,这同以前圣母画像的严肃和呆板大异其趣。这幅作品之后,有大量的此类模仿出现。 +![](imgs/IMG_20230602_152606.dest.jpg) +达芬奇创作过很多幅圣母与花的主题,比如《拈花圣母》、《康乃馨圣母》。 + +《玛丹娜·利塔圣母像》,也译作《圣母丽达》,作者:达芬奇,达芬奇工作室的乔瓦尼·安东尼奥·博尔特拉菲奥也参与了创作,这幅作品过于珍贵,原画框也被保留装帧在内沿。作品中圣母的微笑掩饰着圣母内心情感:温柔悲伤,专心注视,似乎已然感受到了婴孩耶稣未来坎坷不平的命运;圣母衣着的红蓝组合、圣婴手中的小鸟,象征耶稣为人类牺牲所流出的鲜血。同《持花圣母》一样,达·芬奇刻意淡化了画作的宗教色彩,而赋予圣母人性的辉光: +![](imgs/IMG_20230602_152628.dest.jpg) + +《情人》,也叫做《偷窥》,讲述的是罗密欧与朱丽叶的故事。画面中床下的黑猫、偷窥者身边的狗都有不同的隐喻。作者是意大利画家朱利奥·罗曼诺,如果你没听说过他的名字,他有个更出名的老师:拉斐尔 +![](imgs/IMG_20230602_152937.dest.jpg) + +《康那斯圣母》,作者:拉斐尔,画框也由拉斐尔设计。圣母右手的形状不像是拿着一本书,似乎是在“握着”什么东西。这是暗示“书”代表了此类主题中常用的“石榴”。而裂开的石榴象征着耶稣受难又复原而达成圆满。 +![](imgs/IMG_20230602_153111.dest.jpg) +《圣母与无须圣约瑟》,也称《神圣家族》。作者:拉斐尔。画面中圣约瑟愁容满面的注视着这个将来饱受磨难的孩子,传闻说圣约瑟的形象参考了作者的父亲,这内涵,不敢深想: +![](imgs/IMG_20230602_153230.dest.jpg) + +《圣凯瑟琳神秘的婚姻》,作者:意大利画家多梅尼科·贝卡富米 +![](imgs/IMG_20230602_153003.dest.jpg) + +《圣母奉献日》,作者:意大利艺术家彼得罗·泰斯塔 +![](imgs/IMG_20230602_153633.dest.jpg) + +《基督墓前的圣女》,作者:卡拉奇 +![](imgs/IMG_20230602_153642.dest.jpg) + +《克利奥帕特拉》,作者:意大利画家马西莫·斯坦齐奥。这个主题有非常多的作品流传于世,本幅作品的处理极有特色。垂死的女主角面部看不出多少痛苦,如同熟睡一般的恬静而满足。从左手指缝中游过的毒蛇“aspis”像一件饰品,将邪恶隐藏在阴影的部分。厚重的金色窗帘和深樱桃色的帷幔,衬托着克利奥帕特拉的奇妙裸体形象。让画面更具装饰性。 +![](imgs/IMG_20230602_153651.dest.jpg) + +《法国大使抵达威尼斯》,创作于1724年,作者:卡纳莱托。这幅作品刚问世时曾被认为是有魔力的画作,因为不管从哪个角度看上去,画面都符合观众的视角。作者在创作中使用轨尺精确的测算画面每部分的比例,大到建筑物,小到每一个人像。从而让画面的展现异常真实。这幅画作被认为是透视画法大规模在油画创作中应用的转折点之一: +![](imgs/IMG_20230602_153934.dest.jpg) + +《德累斯顿的新市场》,作者:伯纳迪诺·贝洛托 +![](imgs/IMG_20230602_153908.dest.jpg) + +《女士和她的厨师》,作者:霍赫 +![](imgs/IMG_20230602_154654.dest.jpg) + +《女演员安东尼娅·扎拉特的肖像》,作者:西班牙艺术家弗朗西斯科·戈雅 +![](imgs/IMG_20230602_154518.dest.jpg) + +《戴手套的男人》,作者:哈尔斯 +![](imgs/IMG_20230602_154855.dest.jpg) + +《巴克斯》,也叫《酒神像》,作者:彼得·保罗·鲁本斯 +![](imgs/IMG_20230602_155155.dest.jpg) + +梵高的《丁香花》可能出借了,没有看到 sigh...。 +不过俄罗斯国家博物馆没有去成,《伏尔加河上的纤夫》没能看到,遗憾并不止这一点。 + +十五世纪哥特风格的法式梳妆台一角: +![](imgs/IMG_20230602_151532.dest.jpg) + +《爱与心理》雕塑,作者:意大利雕塑家 乔瓦尼·玛丽亚·本佐尼 +![](imgs/IMG_20230602_152235.dest.jpg) + +《贝壳中的维纳斯》,作者:卡洛·费内利 +![](imgs/IMG_20230602_153023.dest.jpg) + +《海豚上的男孩》,作者:洛伦泽蒂,洛伦泽蒂也是拉斐尔的学生,这幅作品是根据拉斐尔的同名素描像创作的。 +![](imgs/IMG_20230602_153359.dest.jpg) + +《狄奥尼索斯(酒神)雕像》,大理石雕像,罗马仿制的古希腊作品,公元前三世纪,镇馆之宝: +![](imgs/IMG_20230602_160304.dest.jpg) + +《断臂维纳斯》(不是罗浮宫那座),公元前1世纪作品,镇馆之宝 +![](imgs/IMG_20230602_160342.dest.jpg) + +《阿多尼斯之死》,作者:朱塞佩·马佐利,镇馆之宝 +![](imgs/IMG_20230602_153756.dest.jpg) +这座雕塑所描述的传说故事极为意味深长。 +阿多尼斯是希腊神话中的植物神,是西方世界“美男子”最早的出处。也是爱神阿芙罗狄蒂唯一挚爱的情人。阿芙罗狄蒂也就是所熟知的维纳斯,维纳斯是罗马神话中,对希腊神话中爱神的称呼。 +阿多尼斯没有听从爱神的劝告,受战神蛊惑,执意去森林中狩猎。过程中被箭猪咬伤后死去。悲痛的爱神诅咒世间男女的爱情,永远渗有猜疑、恐惧及悲痛。从此,世间的爱情,才有了那么多的曲折。 + +《卡尔瓦托尼的胜利女神》,青铜雕像,展现了胜利女神尼姬(Nike)站在地球上的场景。创作于约公元161-169年。最初于1836年在意大利卡尔瓦托尼(Calvatone)地区被发现时还是碎片,1841年后为柏林博物馆所有,其缺失的部分,包括翅膀,被重新修复粘接。1939年前在柏林埃提斯博物馆(Berlin’s Altes Museum)展出。最终被冬宫博物馆收藏的时间不为人知。 +这尊雕像是如此的栩栩如生,被认为是公元前后时期战争女神雕像中,现存最完整而完美的一座。其形象设计曾被很多艺术作品、甚至电脑游戏中引用,也在很多珠宝饰品中使用。这也是第一次见就会感觉似曾相识的原因。是冬宫镇馆之宝。 +![](imgs/IMG_20230602_160606.dest.jpg) + +《万神之王宙斯》,公元76年作品,镇馆之宝 +![](imgs/IMG_20230602_160654.dest.jpg) + +中世纪彩色玻璃窗: +![](imgs/IMG_20230602_151541.dest.jpg) + +某个大厅的角门: +![](imgs/IMG_20230602_152308.dest.jpg) + +镇馆之宝《黄金孔雀钟》,原为英国著名的钟表设计师詹姆斯·考克斯以及他的工匠团队一起专门为中国打造的。而乾隆帝不喜欢,没有接受。但叶卡捷琳娜大帝十分钟爱,收藏在私人博物馆。孔雀钟制作精良,至今可以正常运转,每到整点时,站在金树桩上的孔雀便缓缓张开美丽的羽翼,并同时环360度转行一圈,其身边的各种动、植物也开始各种作秀表演,与此同时时钟发出清脆悦耳的报时声,整个场面令人惊叹叫绝。当它上满发条时,蜻蜓就会一秒一秒地转动,起到秒针的作用,而蜻蜓下面的大蘑菇盘上,可以看到小时和分钟的刻度。 +![](imgs/IMG_20230602_151756.dest.jpg) + +隔窗看冬宫空中花园: +![](imgs/IMG_20230602_151831.dest.jpg) +窗外的涅瓦河: +![](imgs/IMG_20230602_152205.dest.jpg) + diff --git a/attachments/russia/160AlexanderColumn.md b/attachments/russia/160AlexanderColumn.md new file mode 100644 index 0000000..bf83b54 --- /dev/null +++ b/attachments/russia/160AlexanderColumn.md @@ -0,0 +1,30 @@ +# 亚历山大柱和冬宫广场 +上一篇图片太多了,还有至少2倍的照片忍痛舍弃。 +即便这样,为了网络流量,也没敢放视频和全景照。 +所以虽然是同一个游览行程,冬宫广场和位于广场中央的亚历山大柱还是单独开一篇。 + +亚历山大柱是1834年沙皇亚历山大为了纪念1812年俄法战争胜利而修建的。大理石柱青铜底座的浮雕代表着荣誉,光辉和胜利。 +![](imgs/IMG_20230602_162352.dest.jpg) +石柱高35米,净重600吨,是一块完整的大理石。在建造的过程中,没有开挖地基。大理石柱、底座和顶端的青铜天使像间也没有任何支撑点,完全靠重力保持不倒。算的上是建筑史上的一个奇迹。 +嗯,运气也是奇迹的一部分。自建成至今,圣彼得堡没有发生过一次地震。 +![](imgs/IMG_20230602_162523.dest.jpg) + +亚历山大柱后面黄白相间的建筑是俄罗斯总参谋部大楼,楼顶的胜利女神像用来保佑俄军战无不胜: +![](imgs/IMG_20230602_163042.dest.jpg) + +广场一角,圣彼得堡建立320周年的庆典活动舞台还没有拆除。背景画像上是圣彼得堡的缔造者彼得大帝。右侧的路灯灯杆上依稀可见320周年字样的宣传画。这样的宣传画全市街道随处可见。 +![](imgs/IMG_20230602_162031.dest.jpg) + +远处依然是几乎在全城都能看到的伊萨基辅大教堂的紫金穹顶: +![](imgs/IMG_20230602_162357.dest.jpg) + +冬宫广场的全景照片: + + +俄罗斯海军总部大楼离冬宫广场隔着一条街。照片中是侧门,时间关系,没有绕道正门拍摄。 +![](imgs/IMG_20230602_165218.dest.jpg) + +冬宫一带的建筑,或者说市中心涅瓦河主干两岸,自古就是重要国家建筑或权贵豪宅,墙体装饰繁复华贵。当然即便在现代,这样的建筑也非同一般。照片中左侧的楼属于列宾美院。懂行的都知道,这是俄罗斯排名第一、世界排名第二的高等艺术学府。至于为什么没有拍到门口...我坐在车上,从发现,到取出手机快速拍摄,能拍到个边算的上反应快了... +![](imgs/IMG_20230602_165124.dest.jpg) +做个比较,中国中央美院全球排名第十;清华大学美术学院世界排名十九。 + diff --git a/attachments/russia/170SaviorOnBlood.md b/attachments/russia/170SaviorOnBlood.md new file mode 100644 index 0000000..79fbe47 --- /dev/null +++ b/attachments/russia/170SaviorOnBlood.md @@ -0,0 +1,31 @@ +# 基督复活大教堂 +基督复活大教堂通常被称为“滴血救世主大教堂”。是1883年,亚历山大三世为纪念被刺杀的亡父在此地点修建。工程进展缓慢,直到1907年尼古拉二世在位时期才最终完成。1881年3月13日,亚历山大二世的马车通过格里博耶多夫运河河堤时,被一个无政府主义者的炸弹炸伤,送回冬宫紧急抢救几个小时后宣告死亡。 +暗杀发生现场的一段街道被封闭在教堂的墙内,因此该段堤防延伸到运河中。在内部,在亚历山大遇刺的精确地点设计了一个祭坛,装饰以黄玉、琉璃和其他宝石。沙皇的血从简单的鹅卵石中溢出,溅到地板上,与周围与极为丰富的装饰形成鲜明对照。“滴血救世主大教堂”的俗称由此而来。 +祭坛的位置,据介绍就在照片中,门前的位置。第二幅照片中能看得很清楚。 +![](imgs/IMG_20230603_125439.dest.jpg) +![](imgs/IMG_20230603_125521.dest.jpg) + +滴血救世主大教堂从未充当公众礼拜场所,只是专门用来纪念被暗杀的皇帝,和举行东正教的追思礼拜。也曾当做马赛克博物馆。现在则是圣彼得堡重要的旅游景点。 +![](imgs/IMG_20230603_125359.dest.jpg) +因为没有能入内参观,以上三张照片,翻拍自教堂的馆藏介绍,细微偏色难以避免。 + +教堂的外观极为宏伟,且风格迥异于圣彼得堡的其他教堂。形式上类似中世纪俄罗斯建筑,看起来像17世纪的雅罗斯拉夫尔教堂和前面介绍过的莫斯科红场瓦西里升天大教堂。滴血大教堂内有7500平方米的马赛克——超过世界上任何其它教堂。 +照片中,大教堂向运河中的延伸看的很清楚。 +![](imgs/IMG_20230603_113128.dest.jpg) + +因滴血大教堂不同于其它圣彼得堡教堂的建筑风格,周边有很多画家、学生写生: +![](imgs/IMG_20230603_113037.dest.jpg) +还有不少人兜售自己的作品,一百人民币买了一幅小品: +![](imgs/IMG_20230603_115416.dest.jpg) + +教堂小广场上,流浪艺人用酒瓶组成的乐器表演: + + +教堂后面人来人往,沿着格里博耶多夫运河成了一条小步行街。很多小的纪念品商店看起来都像义乌专卖,让人没有什么购买欲: +![](imgs/IMG_20230603_114410.dest.jpg) + +教堂对面是一个柔道俱乐部,墙上刷着大幅2020年欧冠联赛的广告: +![](imgs/IMG_20230603_112917.dest.jpg) + diff --git a/attachments/russia/180SMOLNY.md b/attachments/russia/180SMOLNY.md new file mode 100644 index 0000000..f60f14e --- /dev/null +++ b/attachments/russia/180SMOLNY.md @@ -0,0 +1,34 @@ +# 斯莫尔尼宫 +斯莫尔尼宫(Smolny),位于圣彼得堡市的东北部,在涅瓦河转弯的地方,是一座外观典雅的三层建筑。 +它建于1806-1808年,原为贵族女子学院。"斯莫尔尼"一词来自俄语"沥青",初建时这里属于沥青厂,在苏联时期作为列宁格勒市政府办公楼,现为圣彼得堡市政府,从市长到各处、陆军部、内务部仍在此办公。 +斯莫尔尼宫整体色彩和皇村的叶卡捷琳娜宫的色彩相同,为拜占庭蓝白相间,是巴洛克风格和拜占庭风格的融合,在圣彼得堡的诸多宫殿里具有相当高的代表性。 +![](imgs/IMG_20230603_131936.dest.jpg) + +而原来使得斯莫尼尔宫闻名的历史事件,因为苏联解体,已经逐渐被人有意识的遗忘。 +1917年“十月革命”期间,布尔什维克党军事革命委员会设在斯莫尔尼宫,为十月革命司令部。1917年11月中旬至1918年3月列宁曾在这里办公和居住。 +现在十月革命司令部所使用的房间,除了修道院,基本是被圣彼得堡大学的学生作为宿舍使用。圣彼得堡大学的政治经济专业、国际关系专业学生,均在此学习。国外大学很多都是“散装”的,分散在不同的地点。顺便,圣彼得堡大学在俄罗斯的排名仅次于莫斯科大学排行第二。 +![](imgs/IMG_20230603_132224.dest.jpg) + +在教堂前广场拍摄的全景: + + +教堂因为新修建的原因,内部空间有更高的整洁度和更明亮的玻璃窗: +![](imgs/IMG_20230603_132518.dest.jpg) + +做礼拜的人虽然不多,但似乎看起来更喜庆,只一会儿时间就有两对新人在亲友陪伴下来教堂接受牧师的祝福: +![](imgs/IMG_20230603_132940.dest.jpg) +后来的一对,因为我已经走出教堂很远而没能拍到,一直感觉很遗憾。因为白西服和白婚纱的新人远远看上去靓丽帅气。 + +老师带着一群小孩子前来参观,听不懂俄语,不知道他在讲解什么。 +![](imgs/IMG_20230603_133248.dest.jpg) +新修建的教堂有新修建的气质,一角还有大屏幕电视使用3D的方式展示教堂建筑结构(没有拍照)。 + +圣彼得堡大学,看起来环境很不错: +![](imgs/IMG_20230603_133740.dest.jpg) + +相邻和对面,都是圣彼得堡市政府办公场所: +![](imgs/IMG_20230603_133911.dest.jpg) + +路边再次碰到几个年轻的艺术家兜售自己的作品,看到一张水粉画挺喜欢,买了下来: +![](imgs/IMG_20230603_134743.dest.jpg) + diff --git a/attachments/russia/190KazanCathedral.md b/attachments/russia/190KazanCathedral.md new file mode 100644 index 0000000..e8c7cd1 --- /dev/null +++ b/attachments/russia/190KazanCathedral.md @@ -0,0 +1,30 @@ +# 喀山大教堂 +喀山大教堂位于圣彼得堡的涅瓦大街,具有一个半圆形的柱廊。柯尼斯式的长柱共有94根,形成一个很大的环抱广场。 +教堂是由俄罗斯建筑师沃罗尼欣以古罗马圣彼得教堂为原本设计,于1801年8月举行奠基仪式,历经10年于1811年竣工。 +![](imgs/IMG_20230603_141456.dest.jpg) +![](imgs/IMG_20230603_141715.dest.jpg) + +涅瓦大街上有很多商店,特别市区靠近教堂部分更是著名的商业区,因此单纯从人流看,喀山大教堂最为繁华。 +![](imgs/IMG_20230603_141538.dest.jpg) +![](imgs/IMG_20230603_141711.dest.jpg) +![](imgs/IMG_20230603_142821.dest.jpg) + +教堂内香火鼎盛: +![](imgs/IMG_20230603_141853.dest.jpg) +有大批的信众排队,到喀山圣母像前参拜: +![](imgs/IMG_20230603_142027.dest.jpg) + +喀山圣母像据称是俄罗斯最灵验的,经多次显灵展示神迹: +第一次于伊凡雷帝时期,在蒙古—鞑靼战争时期多次显灵使蒙古大军不战而逃。 +第二次于俄法战争,元帅库图佐夫在反攻前到喀山教堂到喀山圣母前祈祷,圣母托梦给库图佐夫将出现从没有过的寒流这次寒流使拿破仑·波拿巴军队不战而逃冻死过半而且全无战斗力使库图佐夫一战成功。 +第三次于第二次世界大战,东正教教皇向喀山圣母像祈祷,圣母再次托梦给教皇说寒流将第二次出现这次寒流使德军冻死过半坦克无法开动,飞机无法起飞手无法扣动扳机。 + +遗憾的是喀山圣母像在每次显灵后都会消失。喀山圣母像现保存在美国的博物馆内,但是俄罗斯人民坚信,当俄罗斯再次出现灾难的时候,圣母像将会再次回归。 + +当前供奉的是一幅摩品。受传说故事的影响,我使用手机最远的焦段拍了一张圣母像正面,即下图最左侧的部分: +![](imgs/IMG_20230603_142115.dest.jpg) + +教堂后面的小街上有很多小餐馆: +![](imgs/IMG_20230603_143043.dest.jpg) +看看这个,你得相信现在中国游客还是很有规模的: +![](imgs/IMG_20230603_143234.dest.jpg) diff --git a/attachments/russia/200NevaBoat.md b/attachments/russia/200NevaBoat.md new file mode 100644 index 0000000..f867720 --- /dev/null +++ b/attachments/russia/200NevaBoat.md @@ -0,0 +1,42 @@ +# 涅瓦河游船 +河流是一个城市的灵魂。在圣彼得堡,几乎所有的重要建筑,都坐落在涅瓦河两岸,特别是主干流。 +几天的行程,也基本是围绕着涅瓦河,在河边道路和桥梁间穿梭。 +而乘坐涅瓦河游船,则是对这些游览的一个总结。 + +彼得罗夫斯基体育场,2018年俄罗斯世界杯主场馆之一: +![](imgs/IMG_20230603_150538.dest.jpg) + +两岸风光: +![](imgs/IMG_20230603_151735.dest.jpg) +![](imgs/IMG_20230603_151256.dest.jpg) + +冬宫: +![](imgs/IMG_20230603_152228.dest.jpg) + +海神柱: +![](imgs/IMG_20230603_152223.dest.jpg) + +彼得堡罗要塞: +![](imgs/IMG_20230603_152341.dest.jpg) + +圣三一大桥: +![](imgs/IMG_20230603_152825.dest.jpg) + +彼得大帝亲自赴欧洲学习造船术,回国后亲自参与建设的俄罗斯第一艘巡洋舰,当前已经改建为一所餐厅: +![](imgs/IMG_20230603_152939.dest.jpg) + +海军阿芙乐尔号巡洋舰,“十月革命”一声炮响,指的就是阿芙乐尔号巡洋舰炮轰冬宫所发出的炮声。该舰现已退役,仅供游人参观: +![](imgs/IMG_20230603_153517.dest.jpg) + +游船上提供了水果、香槟、伏特加和鱼子酱给游客: +![](imgs/IMG_20230603_153728.dest.jpg) + +游船上有小乐队给游客表演俄罗斯民族歌曲和舞蹈.看到中国人,演员会用不太熟练的中文说:“习大大万岁!”: +![](imgs/IMG_20230603_155546.dest.jpg) + +表演互动性很强,很多游客也被拉入,成为舞蹈的一部分: +![](imgs/IMG_20230603_161743.dest.jpg) + + diff --git a/attachments/russia/210ArbatStreet.md b/attachments/russia/210ArbatStreet.md new file mode 100644 index 0000000..42f1534 --- /dev/null +++ b/attachments/russia/210ArbatStreet.md @@ -0,0 +1,42 @@ +# 阿尔巴特步行街 +步行街口的外交部大楼,也是斯大林时期“七姐妹”塔楼之一: +![](imgs/IMG_20230605_102916.dest.jpg) +近观很有时代感: +![](imgs/IMG_20230605_120225.dest.jpg) +![](imgs/IMG_20230605_120146.dest.jpg) + +步行街建筑物上的元帅像: +![](imgs/IMG_20230605_112541.dest.jpg) + +普希金故居和雕像: +![](imgs/IMG_20230605_103650.dest.jpg) + +街头涂鸦: +![](imgs/IMG_20230605_105117.dest.jpg) + +街头的雕像和喷泉: +![](imgs/IMG_20230605_105233.dest.jpg) + +广告牌不忘对战争英雄的宣传: +![](imgs/IMG_20230605_112757.dest.jpg) +艺术家则是广告牌另一个主题: +![](imgs/IMG_20230605_113444.dest.jpg) +这个就看不懂了,有懂俄文的给俺解说解说: +![](imgs/IMG_20230605_104943.dest.jpg) + +俄罗斯的美女热情大方,很愉快的接受了周哥的合影请求: +![](imgs/IMG_20230605_115445.dest.jpg) +感谢周哥出镜,感谢不知名的俄罗斯美女们。 + +步行街有不少餐馆和酒吧: +![](imgs/IMG_20230605_113845.dest.jpg) +![](imgs/IMG_20230605_115229.dest.jpg) + +街头很多艺术品小摊铺: +![](imgs/IMG_20230605_115141.dest.jpg) + +俄罗斯纪念品商店: +![](imgs/IMG_20230605_103808.dest.jpg) + +多走几个路口,莫斯科河岸边的青铜雕塑很有特色: +![](imgs/IMG_20230605_121955.dest.jpg) diff --git a/attachments/russia/220commute.md b/attachments/russia/220commute.md new file mode 100644 index 0000000..337d5ef --- /dev/null +++ b/attachments/russia/220commute.md @@ -0,0 +1,131 @@ +# 俄罗斯的交通 + +## 机场 +莫斯科谢列梅捷沃机场是1959年建设的。这么多年前的机场,现在看起来还是维护如新,各种设施运转正常: +![](imgs/IMG_20230605_160832.dest.jpg) +![](imgs/IMG_20230605_142540.dest.jpg) +![](imgs/IMG_20230605_143456.dest.jpg) + +主观感受是比首都机场1/2号航站楼略好。比首都机场3号航站楼和全新建设的大兴机场差距还是比较大,毕竟已经有了代差,不是良好维护就能弥补的。下图是大兴机场: +![](imgs/IMG_20230529_091547.dest.jpg) +![](imgs/IMG_20230529_110844.dest.jpg) + +## 火车站 +稍微大一点的城市都有多座火车站,中外都是如此。比如北京就有东西南北外加丰台站、朝阳站,看样子继续加下去的可能也是有的。这种划分方式通常是按照发车走向。规则整齐但也容易造成一些困惑,比如“北京西站南广场东”这样的站名绝对能让老外一脸懵逼。 +莫斯科的火车站也很类似,不过目标给的更精确,就是目的地方向。比如去往圣彼得堡的火车站就是列宁格勒火车站,列宁格勒是圣彼得堡在苏联时期的名字。同样道理,从圣彼得堡到莫斯科的列车,停靠在莫斯科火车站。 +![](imgs/IMG_20230601_061959.dest.jpg) + +俄罗斯的火车站首先有一条完全不同于国内的规矩: +就是进站不需要检票,安检当然还是有的,在站内候车、上站台,完全是不需要查票的。只有进入列车时,才会由门口的列车员检票上车。这样的情况下,再加上火车站通常人流非常多,随身物品的安全就是候车时的重点了。 +![](imgs/IMG_20230531_195336.dest.jpg) +![](imgs/IMG_20230531_201923.dest.jpg) + +可能是俄罗斯人少的原因,候车室座椅远远少于中国的同类车站,但仍然有很多空座: +![](imgs/IMG_20230601_061301.dest.jpg) + +雕像无处不在,彼得大帝半身胸像位于入口处: +![](imgs/IMG_20230601_061444.dest.jpg) + +出发的时间是晚上9点。极昼的黄昏缓慢悠长,落日透过半圆形的天窗映进来,在厚重的墙面上留下灿烂的余晖。 +![](imgs/IMG_20230531_203158.dest.jpg) + +站台看上去同国内基本一样: +![](imgs/IMG_20230531_212341.dest.jpg) + +卧铺车厢内延续了俄罗斯人在居住方面的抠门,空间明显狭窄,略差于国内的卧铺车厢。当然国内国外,卧铺都谈不上舒适。 +一直没说,俄罗斯哪怕是4星级酒店,床也非常的狭窄,真替俄罗斯那些常见的大个子担心。 +![](imgs/IMG_20230531_213635.dest.jpg) +卫生程度要好于国内,枕巾、床单、被套都保证是新洗净的,只是要自己铺。 +列车卫生间洁净程度也更高,有非常充裕的卫生纸和纸巾。实际上我见过大多国家的公共卫生间清洁水平都高于中国。 + +俄罗斯的高铁跑的是同样的铁轨。车型咱不懂,但外观上看也就是普通列车,通常时速160-200公里,基本是国内特快的速度。 +但车厢内的舒适度并不差,是包厢的形式,还提供了一次性拖鞋、耳机等: +![](imgs/IMG_20230604_065210.dest.jpg) +豪华列车会带早餐,有巧克力、饼干、水果、三明治。中间夹的一块三文鱼个头不小,在国内怎么也得给你做7、8个寿司。 +![](imgs/IMG_20230604_070809.dest.jpg) + +莫斯科至圣彼得堡全程约700公里,一路大多是连绵不绝的森林: + + +## 地铁 +地铁在前面有一篇已经介绍过了,这里补充一张外观图。莫斯科大多地铁站外观也非常宏伟,看上去像个宫殿而不是地铁入口。图为迪纳摩地铁站,寻找地铁站的技巧是看上面大大的M型标志: +![](imgs/IMG_20230530_192633.dest.jpg) +莫斯科的地铁有很多中国企业参与建设,据说建设质量评价不错。 + +## 公交 +毕竟是发展300多年的城市,公交车的通达程度感觉上要高于北京。很多偏僻的地点都有多趟公交到达: +![](imgs/IMG_20230601_084942.dest.jpg) +全透明的公交亭也能挡雨,遮风就不用想了: +![](imgs/IMG_20230604_054715.dest.jpg) + +并没有看到类似国内那样专门为公交车安排的专用道。但在我看起来,俄罗斯人口中说的拥堵,比起来北京也不过是毛毛雨。 +![](imgs/IMG_20230530_092934.dest.jpg) +而且公交上通常空位也比较多。 +![](imgs/IMG_20230603_115953.dest.jpg) + +## 轿车 +俄罗斯如果在街头看来往的车辆,完全看不出俄罗斯尚属于发展中国家。奔驰、宝马、法拉利拥有量很高,至少高于北京的水平: +![](imgs/IMG_20230531_114357.dest.jpg) +毕竟距离欧洲更近,德系车比较多。但日本车也能经常见到。 +据说最近因为战争制裁的原因,日系、德系轿车涨价超过三倍。带动中国产轿车销量大幅走高,俄罗斯自有LADA也卖的不错。但在街头看,中国产轿车和LADA的占有量仍然比较低。 +停车场有人工收费、电子收费两种,如果是后者,通常是在ATM机上刷卡交费。 +![](imgs/IMG_20230604_110548.dest.jpg) + +## 共享单车 +俄罗斯同样有共享单车,但是骑的人并不多,我见到的几个都是外卖小哥: +![](imgs/IMG_20230531_130536.dest.jpg) + + +更主流的是共享电动滑板,可说不管男女老幼都爱骑,几乎成了时尚: +![](imgs/IMG_20230531_130551.dest.jpg) + + +好奇心作祟,下了一个俄罗斯共享单车的APP,发现这种电动滑板车,月租价格低到不敢相信: +![](imgs/sharedbike.jpeg) + +所有的过街地道,都会有专门的自行车通道,保证自行车、滑板车顺利上下。大一些的过街地道干脆还有专门的自行车出入口: +![](imgs/IMG_20230530_190235.dest.jpg) + +## 摩托车 +俄罗斯的大摩托,肌肉感十足,在莫斯科和圣彼得堡的街头拥有量很高。看上去基本同共享滑板车数量级类似。 +有点怀念几个暖壶就能换辆摩托的年代: +![](imgs/IMG_20230604_052040.dest.jpg) + +## 行人 +在俄罗斯,人行道有很好的通行条件,几乎见不到国内那种商贩、自行车、轿车占用人行道甚至盲道的行为。所以到了俄罗斯,明显感觉自己更喜欢步行了。 +![](imgs/IMG_20230601_184152.dest.jpg) +![](imgs/IMG_20230601_154035.dest.jpg) +过马路如果没有地下通道,走人行横道是必须的。俄罗斯的车速非常快,据说市区也不限速,不在人行道行走非常危险: +![](imgs/IMG_20230601_154109.dest.jpg) +人行道有两种,跟国内一样,由白色斑马线组成的人行道,要看交通灯,绿灯通行。 +还有一种,由白色、黄色斑马线间隔组成的人行道,通常在较小的路口。人只要踏上,两边的车辆就会停下,等待行人通过后再恢复行驶。 +中国类似的设计也有很多,但从驾驶员的执行情况看,跟俄罗斯当然也比欧美差距很多年。 + +## 赛马 +不管在中国还是在俄罗斯,骑马早已经不是交通需求了,而是顶级奢华的运动项目。 +但是关于赛马的内容不多,也就只有放到交通这一篇勉强不算违和。 +作为战斗民族,哥萨克骑兵几乎是打遍世界无敌手。进入现代战争以后,骑兵的地位下降,但依然占有重要的地位。不管是叶卡捷琳娜大帝还是俄罗斯的将军,骑马都是必备技能: +![](imgs/IMG_20230602_150954.dest.jpg) +莫斯科赛马场(莫斯科中央马场)建成于1834年,在整个欧洲也算最古老的赛马场。因为标准等级高,很多国际赛事都会在这里举行: +![](imgs/IMG_20230604_121650.dest.jpg) +俄乌战争之后,国际制裁纷至,中央马场明显萧条。几次路过,只见到工作人员驱策在此寄养的赛马做维持状态的基础性训练: + + +赛马场墙上的素描: +![](imgs/IMG_20230604_120244.dest.jpg) + +## 道路卫生 +清洁的环境来之不易,通常很早就会有清洁车来往打扫: + +![](imgs/IMG_20230531_171456.dest.jpg) + diff --git a/attachments/russia/230freewill.md b/attachments/russia/230freewill.md new file mode 100644 index 0000000..ec10c62 --- /dev/null +++ b/attachments/russia/230freewill.md @@ -0,0 +1,47 @@ +# 市井街拍 +谁认识这位兄弟,看起来是在中国得了一个亚军,本想上前套套近乎,不过呼叫登机,错过了: +![](imgs/IMG_20230529_183546.dest.jpg) + +俄罗斯军事教育从娃娃抓起,照片中是相当于国内初中的俄罗斯海军学院学员: +![](imgs/IMG_20230601_142912.dest.jpg) + +战斗民族的警察很敦实,随身警械齐全,看着有安全感: +![](imgs/IMG_20230529_175931.dest.jpg) + +莫斯科在建工程很多,看上去经济依然有活力: +![](imgs/IMG_20230529_182248.dest.jpg) + +纪念俄罗斯帝国在拿破仑战争中取得胜利的圣彼得堡纳尔瓦凯旋门. +![](imgs/IMG_20230601_132121.dest.jpg) + +圣彼得堡一个消防站,逛街偶遇: +![](imgs/IMG_20230603_171328.dest.jpg) + +不管多么大的商店,总是只有很小的店门,甚至不大的店门还只肯开一半,据说是为了防寒。就这样的商店,搁中国连消防检查都过不了: +![](imgs/IMG_20230530_051950.dest.jpg) + +说到气候,照片中这样的打扮相伴而行,别的地方可不是很多见。莫斯科、圣彼得堡昼夜温差非常大,刚刚20多度,一下雨就是悬崖式降温。所以什么样的装束,在俄罗斯街头都看得到: +![](imgs/IMG_20230530_091849.dest.jpg) + +街头经常有些卖报纸、水、零食、纪念品的小亭子,样式看来是统一的: +![](imgs/IMG_20230531_130608.dest.jpg) + +这可能是比较传统的俄罗斯裙装了: +![](imgs/IMG_20230530_105203.dest.jpg) + +俄罗斯纬度高,种植业很少,水果蔬菜都靠进口,导致水果蔬菜及相关制品价格都很高: +![](imgs/IMG_20230601_191347.dest.jpg) +![](imgs/IMG_20230601_191355.dest.jpg) + +俄罗斯奶制品非常棒,可惜因为检疫要求,只能吃,不能带。 +![](imgs/IMG_20230531_180155.dest.jpg) + +俄罗斯显然了解中医的不多,路边的蒲公英生长茂盛: +![](imgs/IMG_20230601_083457.dest.jpg) + +莫斯科、圣彼得堡城区都比较大,农村比中国的农村看起来要整洁,更像欧美的农庄: +![](imgs/IMG_20230530_103325.dest.jpg) + +达官贵族的墓地会依托教堂,普通人则更多位于郊区的墓地: +![](imgs/IMG_20230530_103355.dest.jpg) + diff --git a/attachments/russia/990etc.md b/attachments/russia/990etc.md new file mode 100644 index 0000000..75847ed --- /dev/null +++ b/attachments/russia/990etc.md @@ -0,0 +1,88 @@ +# 杂七杂八 + +## 普京和列宁,是亲戚吗? +简单的回答:不是。 + +复杂的回答,还真有点长。 +列宁原名弗拉基米尔·伊里奇·乌里扬诺夫,后改名弗拉基米尔·伊里奇·列宁。 +普京大帝全名弗拉基米尔·弗拉基米罗维奇·普京。 +同样类似的还有,弗拉基米尔大公(行车图中拍到的渣照): +![](imgs/IMG_20230531_133107.dest.jpg) +再有弗拉基米尔圣母升天大教堂中的供奉圣母。 + +所以实际上,弗拉基米尔是一个地名。这样就容易理解了,弗拉基米尔大公这样的称呼,就类似纽约市长这样的称呼。 +而因为安德烈·博戈柳布斯基这位弗拉基米尔大公,在弗拉基米尔立都,最初称为罗斯公国。成为俄罗斯有文字记载以来最初的国家。从那以后,弗拉基米尔成为俄罗斯人最喜欢的姓氏之一。看起来能跟中国人的张王李赵相提并论。 +况且很多国家喜欢用地名当做姓氏,比如渡边,比如酒井,这没什么好奇怪的。 +因此列宁、普京重复的姓氏,跟随意两个姓张的中国人一样,并不代表两人有亲属关系。 + +## 为什么这么多教堂? +在欧美国家,宗教的地位曾经在很长的时间内大于皇权。 +事实证明,人是需要信仰而存在的。 +在中国,共产主义,就是中国人民共同的信仰。 +想想随处可见的街道办、社区居委会,这些我党的基层机构。 +欧美国家,包括东正教作为国教的俄罗斯,随处可见的教堂没有什么好奇怪。实际上每个建筑群,不管是商场还是学校,其核心位置,几乎必然是一座教堂。 + +## 升天大教堂为什么这么多? +其实不仅升天大教堂多,以“复活”为命名的教堂也非常多。 +实际上这代表了俄罗斯战斗民族的一种人生观。 +那就是死并没有什么可怕的,死去只是“升天”了。为了理想死去,也会以另外一种形式“复活”。 +所以俄罗斯军队作战中悍不畏死,那不是说说就算的,是真正印刻在DNA和信仰之中的本能。 +这种信仰与宗教教义相互影响,互相加强,此类命名的教堂恐怕还会更多。 + +## 俄乌战争 +简单来说,至少短期游看不出来俄乌战争对俄罗斯国内有什么影响。 +马照跑、舞照跳,商业区依然人流不绝。当然你别打算跟王府井比,你得先算一道数学题,俄罗斯陆地面积比中国陆地面积大两倍,而人口只相当于中国人口的1/14。 +![](imgs/IMG_20230605_112701.dest.jpg) +![](imgs/IMG_20230601_084500.dest.jpg) + +博物馆的俄罗斯人: +![](imgs/IMG_20230602_153434.dest.jpg) + +就走马观花的感觉看,俄罗斯民生经济自给率比较高,国外的制裁虽然造成一些经济困难,但想要大幅影响民生,别说刚打了一年,再打十年也不一定如何。那时候欧盟受到的伤害恐怕更大。 +比如现在俄罗斯民众,早就开始采购一些中国品牌的轿车,替代欧洲、日本的品牌。俄罗斯本土LADA,活的也不错: +![](imgs/IMG_20230602_191350.dest.jpg) + +当然在征兵方面,猜测俄罗斯政府还是遇到一些困难的。因为通常情况讲,俄罗斯人是极少做广告的。我曾开玩笑说,俄罗斯企业都应当派人去中国商学院读一读MBA。但在莫斯科街头,经常能见到征兵广告或者战斗英雄的宣传。毕竟现代社会,年轻人的思想,跟卫国战争时,想的并不一样了。 +![](imgs/IMG_20230529_183801.dest.jpg) +![](imgs/IMG_20230529_183853.dest.jpg) +![](imgs/IMG_20230530_053621.dest.jpg) +嗯,广告中的信息都是真实的,我可没有做PS,有兴趣去俄罗斯参军的,不妨联系联系。 + +## 说的都那么好,建筑物都那么富丽堂皇,就没有穷人吗? +当然不,在所有的社会,穷人都是存在的。一些数据表示,俄罗斯人有一半生活在贫困线及以下,当然这些人,较少在大城市,所以游客并不容易见到。 +但露宿街头的人,也见到过,虽然只有这一例: +![](imgs/IMG_20230603_095826.dest.jpg) +在车上拍的渣照,那个睡在路边的人,枕着一把大提琴。 + +再说建筑物,现代建筑,各国区别都没那么大。 +沙皇时期的皇家的建筑,王公贵族,当然是把欧式的建筑风格体现的淋漓尽致。 +苏联时期的建筑,很多低于平均水平。想一想中国的筒子楼。 +不过条件差的楼房居民,现在都已经基本迁出了,原来的建筑因为位置大多在市中心,多被重新装修,用作企业办公或商业。 +无法租出,年久失修的,也经常会见到。 +![](imgs/IMG_20230601_161939.dest.jpg) +![](imgs/IMG_20230530_190616.dest.jpg) + +即便皇家,彼得大帝刚刚督建圣彼得堡的时候,给自己盖的第一栋房子,看上去也就说的上整洁而已: +![](imgs/IMG_20230603_170717.dest.jpg) +后来靠战争、掠夺、剥削、贸易挣到了钱,夏宫、冬宫,那都已经成为世界的经典。 + +## 俄罗斯饮食 +俄罗斯是西餐,材料不错,做的水平一般,适应的还好啦。 +照片拍自部分自助早餐: +![](imgs/IMG_20230530_073959.dest.jpg) +![](imgs/IMG_20230530_074013.dest.jpg) +![](imgs/IMG_20230530_074029.dest.jpg) +![](imgs/IMG_20230530_074035.dest.jpg) +![](imgs/IMG_20230530_074042.dest.jpg) + +## 俄罗斯能买点什么? +大头娃娃巧克力、紫皮糖、蜂蜜、奶粉、玻尿酸、伏特加。 +这些东西淘宝上也有卖,不过至少巧克力亲测很难买到真品。都是外包装一模一样,一尝就发现,巧克力换成了代可可脂。 +还可以考虑跟我一样,买些喜欢又不贵的手绘作品。 +小纪念品、服装之类的,俄罗斯是弱项,大多是进口的中国造,完全没有必要。 +琥珀、紫金等制品,看自己喜欢吧。 + +## 愉快的行程 +依依不舍,不过还是要离开了: +![](imgs/IMG_20230605_165847.dest.jpg) +![](imgs/IMG_20230605_203548.dest.jpg) diff --git a/attachments/russia/999END.md b/attachments/russia/999END.md new file mode 100644 index 0000000..bc3d5e4 --- /dev/null +++ b/attachments/russia/999END.md @@ -0,0 +1,31 @@ +
+ + +
+ 我们来到这个世界上,只是为了看一看月亮 +
+
+ + +# 结尾 +文内记述的信息源自市井闲谈、道听途说以及八卦网站的搜罗。 +如有谬误,你知道就好,不用告诉我,反正我也是懒得改。 + +                    [Andrew](mailto:andrewwang@sina.com) 2023年6月 + diff --git a/attachments/russia/README.md b/attachments/russia/README.md new file mode 100644 index 0000000..1e24728 --- /dev/null +++ b/attachments/russia/README.md @@ -0,0 +1,14 @@ +# 俄罗斯纪行 +

Andrew

+ +![](imgs/f1.jpg) +
(题图为圣彼得堡原市政厅楼顶的雕塑,具备几乎独一无二的俄罗斯风格)
+ +# 前序 +刚刚闲暇下来,又是终于结束为期三年的静默。 +静而思动,于是在2023年5月末到6月初,赴莫斯科、圣彼得堡两个城市,来了一场9天的短游。 +这里使用文字、照片、视频、全景的形式,对本次行程做了粗略的记录。 +成文的顺序比较随性,但大体上是根据游览的次序,并没有轻重之分。 +本文建议使用电脑、平板来阅读,手机虽然也能打开,但逼仄的空间对于视频、全景图的展示非常不友好。 + + diff --git a/attachments/russia/_sidebar.md b/attachments/russia/_sidebar.md new file mode 100644 index 0000000..c435cc4 --- /dev/null +++ b/attachments/russia/_sidebar.md @@ -0,0 +1,27 @@ +* [前序](README) +* [谢尔盖耶夫镇](010Sergiev.md) +* [圣三一修道院](020StSergiusLavra.md) +* [全俄展览中心](030ExhibitionCentre.md) +* [克里姆林宫](040Kremlin.md) +* [红场](050RedSquare.md) +* [地铁、凯旋门和胜利广场](060MetorVictory.md) +* [莫斯科大学](070University.md) +* [卡洛明斯克庄园](080Kolomenskoye.md) +* [马戏表演](090circus.md) +* [阿尔巴特步行街](210ArbatStreet.md) +* [黄金三岛](100Krestovsky.md) +* [彼得大帝夏宫花园](110SummerPalace.md) +* [伊萨基辅大教堂](120SaintIsakievCathedral.md) +* [圣彼得堡海神柱](130SeaGodPilla.md) +* [叶卡捷琳娜宫](140Catherine.md) +* [冬宫和冬宫藏品](150WinterPalace.md) +* [亚历山大柱](160AlexanderColumn.md) +* [基督复活大教堂](170SaviorOnBlood.md) +* [斯莫尔尼宫](180SMOLNY.md) +* [喀山大教堂](190KazanCathedral.md) +* [涅瓦河游船](200NevaBoat.md) +* [俄罗斯的交通](220commute.md) +* [市井街拍](230freewill.md) +* [杂七杂八](990etc.md) +* [结尾](999END.md) + diff --git a/attachments/russia/cdn/lib/docsify.js b/attachments/russia/cdn/lib/docsify.js new file mode 100644 index 0000000..4a7e75f --- /dev/null +++ b/attachments/russia/cdn/lib/docsify.js @@ -0,0 +1,10226 @@ +(function () { + /** + * Create a cached version of a pure function. + * @param {*} fn The function call to be cached + * @void + */ + + function cached(fn) { + var cache = Object.create(null); + return function (str) { + var key = isPrimitive(str) ? str : JSON.stringify(str); + var hit = cache[key]; + return hit || (cache[key] = fn(str)); + }; + } + + /** + * Hyphenate a camelCase string. + */ + var hyphenate = cached(function (str) { + return str.replace(/([A-Z])/g, function (m) { return '-' + m.toLowerCase(); }); + }); + + var hasOwn = Object.prototype.hasOwnProperty; + + /** + * Simple Object.assign polyfill + * @param {Object} to The object to be merged with + * @returns {Object} The merged object + */ + var merge = + Object.assign || + function (to) { + var arguments$1 = arguments; + + for (var i = 1; i < arguments.length; i++) { + var from = Object(arguments$1[i]); + + for (var key in from) { + if (hasOwn.call(from, key)) { + to[key] = from[key]; + } + } + } + + return to; + }; + + /** + * Check if value is primitive + * @param {*} value Checks if a value is primitive + * @returns {Boolean} Result of the check + */ + function isPrimitive(value) { + return typeof value === 'string' || typeof value === 'number'; + } + + /** + * Performs no operation. + * @void + */ + function noop() {} + + /** + * Check if value is function + * @param {*} obj Any javascript object + * @returns {Boolean} True if the passed-in value is a function + */ + function isFn(obj) { + return typeof obj === 'function'; + } + + /** + * Check if url is external + * @param {String} string url + * @returns {Boolean} True if the passed-in url is external + */ + function isExternal(url) { + var match = url.match( + /^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/ + ); + + if ( + typeof match[1] === 'string' && + match[1].length > 0 && + match[1].toLowerCase() !== location.protocol + ) { + return true; + } + if ( + typeof match[2] === 'string' && + match[2].length > 0 && + match[2].replace( + new RegExp( + ':(' + { 'http:': 80, 'https:': 443 }[location.protocol] + ')?$' + ), + '' + ) !== location.host + ) { + return true; + } + return false; + } + + var inBrowser = !false; + + var isMobile = document.body.clientWidth <= 600; + + /** + * @see https://github.com/MoOx/pjax/blob/master/lib/is-supported.js + */ + var supportsPushState = + + (function () { + // Borrowed wholesale from https://github.com/defunkt/jquery-pjax + return ( + window.history && + window.history.pushState && + window.history.replaceState && + // PushState isn’t reliable on iOS until 5. + !navigator.userAgent.match( + /((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/ + ) + ); + })(); + + var cacheNode = {}; + + /** + * Get Node + * @param {String|Element} el A DOM element + * @param {Boolean} noCache Flag to use or not use the cache + * @return {Element} The found node element + */ + function getNode(el, noCache) { + if ( noCache === void 0 ) noCache = false; + + if (typeof el === 'string') { + if (typeof window.Vue !== 'undefined') { + return find(el); + } + + el = noCache ? find(el) : cacheNode[el] || (cacheNode[el] = find(el)); + } + + return el; + } + + var $ = document; + + var body = $.body; + + var head = $.head; + + /** + * Find elements + * @param {String|Element} el The root element where to perform the search from + * @param {Element} node The query + * @returns {Element} The found DOM element + * @example + * find('nav') => document.querySelector('nav') + * find(nav, 'a') => nav.querySelector('a') + */ + function find(el, node) { + return node ? el.querySelector(node) : $.querySelector(el); + } + + /** + * Find all elements + * @param {String|Element} el The root element where to perform the search from + * @param {Element} node The query + * @returns {Array} An array of DOM elements + * @example + * findAll('a') => [].slice.call(document.querySelectorAll('a')) + * findAll(nav, 'a') => [].slice.call(nav.querySelectorAll('a')) + */ + function findAll(el, node) { + return [].slice.call( + node ? el.querySelectorAll(node) : $.querySelectorAll(el) + ); + } + + function create(node, tpl) { + node = $.createElement(node); + if (tpl) { + node.innerHTML = tpl; + } + + return node; + } + + function appendTo(target, el) { + return target.appendChild(el); + } + + function before(target, el) { + return target.insertBefore(el, target.children[0]); + } + + function on(el, type, handler) { + isFn(type) + ? window.addEventListener(el, type) + : el.addEventListener(type, handler); + } + + function off(el, type, handler) { + isFn(type) + ? window.removeEventListener(el, type) + : el.removeEventListener(type, handler); + } + + /** + * Toggle class + * @param {String|Element} el The element that needs the class to be toggled + * @param {Element} type The type of action to be performed on the classList (toggle by default) + * @param {String} val Name of the class to be toggled + * @void + * @example + * toggleClass(el, 'active') => el.classList.toggle('active') + * toggleClass(el, 'add', 'active') => el.classList.add('active') + */ + function toggleClass(el, type, val) { + el && el.classList[val ? type : 'toggle'](val || type); + } + + function style(content) { + appendTo(head, create('style', content)); + } + + /** + * Fork https://github.com/bendrucker/document-ready/blob/master/index.js + * @param {Function} callback The callbacack to be called when the page is loaded + * @returns {Number|void} If the page is already laoded returns the result of the setTimeout callback, + * otherwise it only attaches the callback to the DOMContentLoaded event + */ + function documentReady(callback, doc) { + if ( doc === void 0 ) doc = document; + + var state = doc.readyState; + + if (state === 'complete' || state === 'interactive') { + return setTimeout(callback, 0); + } + + doc.addEventListener('DOMContentLoaded', callback); + } + + var dom = /*#__PURE__*/Object.freeze({ + __proto__: null, + getNode: getNode, + $: $, + body: body, + head: head, + find: find, + findAll: findAll, + create: create, + appendTo: appendTo, + before: before, + on: on, + off: off, + toggleClass: toggleClass, + style: style, + documentReady: documentReady + }); + + function startsWith(str, prefix) { + return str.indexOf(prefix) === 0; + } + + function endsWith(str, suffix) { + return str.indexOf(suffix, str.length - suffix.length) !== -1; + } + + var decode = decodeURIComponent; + var encode = encodeURIComponent; + + function parseQuery(query) { + var res = {}; + + query = query.trim().replace(/^(\?|#|&)/, ''); + + if (!query) { + return res; + } + + // Simple parse + query.split('&').forEach(function (param) { + var parts = param.replace(/\+/g, ' ').split('='); + + res[parts[0]] = parts[1] && decode(parts[1]); + }); + + return res; + } + + function stringifyQuery(obj, ignores) { + if ( ignores === void 0 ) ignores = []; + + var qs = []; + + for (var key in obj) { + if (ignores.indexOf(key) > -1) { + continue; + } + + qs.push( + obj[key] + ? ((encode(key)) + "=" + (encode(obj[key]))).toLowerCase() + : encode(key) + ); + } + + return qs.length ? ("?" + (qs.join('&'))) : ''; + } + + var isAbsolutePath = cached(function (path) { + return /(:|(\/{2}))/g.test(path); + }); + + var removeParams = cached(function (path) { + return path.split(/[?#]/)[0]; + }); + + var getParentPath = cached(function (path) { + if (/\/$/g.test(path)) { + return path; + } + + var matchingParts = path.match(/(\S*\/)[^/]+$/); + return matchingParts ? matchingParts[1] : ''; + }); + + var cleanPath = cached(function (path) { + return path.replace(/^\/+/, '/').replace(/([^:])\/{2,}/g, '$1/'); + }); + + var resolvePath = cached(function (path) { + var segments = path.replace(/^\//, '').split('/'); + var resolved = []; + for (var i = 0, len = segments.length; i < len; i++) { + var segment = segments[i]; + if (segment === '..') { + resolved.pop(); + } else if (segment !== '.') { + resolved.push(segment); + } + } + + return '/' + resolved.join('/'); + }); + + /** + * Normalises the URI path to handle the case where Docsify is + * hosted off explicit files, i.e. /index.html. This function + * eliminates any path segments that contain `#` fragments. + * + * This is used to map browser URIs to markdown file sources. + * + * For example: + * + * http://example.org/base/index.html#/blah + * + * would be mapped to: + * + * http://example.org/base/blah.md. + * + * See here for more information: + * + * https://github.com/docsifyjs/docsify/pull/1372 + * + * @param {string} path The URI path to normalise + * @return {string} { path, query } + */ + + function normaliseFragment(path) { + return path + .split('/') + .filter(function (p) { return p.indexOf('#') === -1; }) + .join('/'); + } + + function getPath() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + return cleanPath(args.map(normaliseFragment).join('/')); + } + + var replaceSlug = cached(function (path) { + return path.replace('#', '?id='); + }); + + var cached$1 = {}; + + function getAlias(path, alias, last) { + var match = Object.keys(alias).filter(function (key) { + var re = cached$1[key] || (cached$1[key] = new RegExp(("^" + key + "$"))); + return re.test(path) && path !== last; + })[0]; + + return match + ? getAlias(path.replace(cached$1[match], alias[match]), alias, path) + : path; + } + + function getFileName(path, ext) { + return new RegExp(("\\.(" + (ext.replace(/^\./, '')) + "|html)$"), 'g').test(path) + ? path + : /\/$/g.test(path) + ? (path + "README" + ext) + : ("" + path + ext); + } + + var History = function History(config) { + this.config = config; + }; + + History.prototype.getBasePath = function getBasePath () { + return this.config.basePath; + }; + + History.prototype.getFile = function getFile (path, isRelative) { + if ( path === void 0 ) path = this.getCurrentPath(); + + var ref = this; + var config = ref.config; + var base = this.getBasePath(); + var ext = typeof config.ext === 'string' ? config.ext : '.md'; + + path = config.alias ? getAlias(path, config.alias) : path; + path = getFileName(path, ext); + path = path === ("/README" + ext) ? config.homepage || path : path; + path = isAbsolutePath(path) ? path : getPath(base, path); + + if (isRelative) { + path = path.replace(new RegExp(("^" + base)), ''); + } + + return path; + }; + + History.prototype.onchange = function onchange (cb) { + if ( cb === void 0 ) cb = noop; + + cb(); + }; + + History.prototype.getCurrentPath = function getCurrentPath () {}; + + History.prototype.normalize = function normalize () {}; + + History.prototype.parse = function parse () {}; + + History.prototype.toURL = function toURL (path, params, currentRoute) { + var local = currentRoute && path[0] === '#'; + var route = this.parse(replaceSlug(path)); + + route.query = merge({}, route.query, params); + path = route.path + stringifyQuery(route.query); + path = path.replace(/\.md(\?)|\.md$/, '$1'); + + if (local) { + var idIndex = currentRoute.indexOf('?'); + path = + (idIndex > 0 ? currentRoute.substring(0, idIndex) : currentRoute) + + path; + } + + if (this.config.relativePath && path.indexOf('/') !== 0) { + var currentDir = currentRoute.substring( + 0, + currentRoute.lastIndexOf('/') + 1 + ); + return cleanPath(resolvePath(currentDir + path)); + } + + return cleanPath('/' + path); + }; + + function replaceHash(path) { + var i = location.href.indexOf('#'); + location.replace(location.href.slice(0, i >= 0 ? i : 0) + '#' + path); + } + var HashHistory = /*@__PURE__*/(function (History) { + function HashHistory(config) { + History.call(this, config); + this.mode = 'hash'; + } + + if ( History ) HashHistory.__proto__ = History; + HashHistory.prototype = Object.create( History && History.prototype ); + HashHistory.prototype.constructor = HashHistory; + + HashHistory.prototype.getBasePath = function getBasePath () { + var path = window.location.pathname || ''; + var base = this.config.basePath; + + // This handles the case where Docsify is served off an + // explicit file path, i.e.`/base/index.html#/blah`. This + // prevents the `/index.html` part of the URI from being + // remove during routing. + // See here: https://github.com/docsifyjs/docsify/pull/1372 + var basePath = endsWith(path, '.html') + ? path + '#/' + base + : path + '/' + base; + return /^(\/|https?:)/g.test(base) ? base : cleanPath(basePath); + }; + + HashHistory.prototype.getCurrentPath = function getCurrentPath () { + // We can't use location.hash here because it's not + // consistent across browsers - Firefox will pre-decode it! + var href = location.href; + var index = href.indexOf('#'); + return index === -1 ? '' : href.slice(index + 1); + }; + + /** @param {((params: {source: TODO}) => void)} [cb] */ + HashHistory.prototype.onchange = function onchange (cb) { + if ( cb === void 0 ) cb = noop; + + // The hashchange event does not tell us if it originated from + // a clicked link or by moving back/forward in the history; + // therefore we set a `navigating` flag when a link is clicked + // to be able to tell these two scenarios apart + var navigating = false; + + on('click', function (e) { + var el = e.target.tagName === 'A' ? e.target : e.target.parentNode; + + if (el && el.tagName === 'A' && !/_blank/.test(el.target)) { + navigating = true; + } + }); + + on('hashchange', function (e) { + var source = navigating ? 'navigate' : 'history'; + navigating = false; + cb({ event: e, source: source }); + }); + }; + + HashHistory.prototype.normalize = function normalize () { + var path = this.getCurrentPath(); + + path = replaceSlug(path); + + if (path.charAt(0) === '/') { + return replaceHash(path); + } + + replaceHash('/' + path); + }; + + /** + * Parse the url + * @param {string} [path=location.herf] URL to be parsed + * @return {object} { path, query } + */ + HashHistory.prototype.parse = function parse (path) { + if ( path === void 0 ) path = location.href; + + var query = ''; + + var hashIndex = path.indexOf('#'); + if (hashIndex >= 0) { + path = path.slice(hashIndex + 1); + } + + var queryIndex = path.indexOf('?'); + if (queryIndex >= 0) { + query = path.slice(queryIndex + 1); + path = path.slice(0, queryIndex); + } + + return { + path: path, + file: this.getFile(path, true), + query: parseQuery(query), + }; + }; + + HashHistory.prototype.toURL = function toURL (path, params, currentRoute) { + return '#' + History.prototype.toURL.call(this, path, params, currentRoute); + }; + + return HashHistory; + }(History)); + + /** @typedef {any} TODO */ + + var HTML5History = /*@__PURE__*/(function (History) { + function HTML5History(config) { + History.call(this, config); + this.mode = 'history'; + } + + if ( History ) HTML5History.__proto__ = History; + HTML5History.prototype = Object.create( History && History.prototype ); + HTML5History.prototype.constructor = HTML5History; + + HTML5History.prototype.getCurrentPath = function getCurrentPath () { + var base = this.getBasePath(); + var path = window.location.pathname; + + if (base && path.indexOf(base) === 0) { + path = path.slice(base.length); + } + + return (path || '/') + window.location.search + window.location.hash; + }; + + HTML5History.prototype.onchange = function onchange (cb) { + var this$1 = this; + if ( cb === void 0 ) cb = noop; + + on('click', function (e) { + var el = e.target.tagName === 'A' ? e.target : e.target.parentNode; + + if (el && el.tagName === 'A' && !/_blank/.test(el.target)) { + e.preventDefault(); + var url = el.href; + // solve history.pushState cross-origin issue + if (this$1.config.crossOriginLinks.indexOf(url) !== -1) { + window.open(url, '_self'); + } else { + window.history.pushState({ key: url }, '', url); + } + cb({ event: e, source: 'navigate' }); + } + }); + + on('popstate', function (e) { + cb({ event: e, source: 'history' }); + }); + }; + + /** + * Parse the url + * @param {string} [path=location.href] URL to be parsed + * @return {object} { path, query } + */ + HTML5History.prototype.parse = function parse (path) { + if ( path === void 0 ) path = location.href; + + var query = ''; + + var queryIndex = path.indexOf('?'); + if (queryIndex >= 0) { + query = path.slice(queryIndex + 1); + path = path.slice(0, queryIndex); + } + + var base = getPath(location.origin); + var baseIndex = path.indexOf(base); + + if (baseIndex > -1) { + path = path.slice(baseIndex + base.length); + } + + return { + path: path, + file: this.getFile(path), + query: parseQuery(query), + }; + }; + + return HTML5History; + }(History)); + + /** + * @typedef {{ + * path?: string + * }} Route + */ + + /** @type {Route} */ + var lastRoute = {}; + + /** @typedef {import('../Docsify').Constructor} Constructor */ + + /** + * @template {!Constructor} T + * @param {T} Base - The class to extend + */ + function Router(Base) { + return /*@__PURE__*/(function (Base) { + function Router() { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + Base.apply(this, args); + + this.route = {}; + } + + if ( Base ) Router.__proto__ = Base; + Router.prototype = Object.create( Base && Base.prototype ); + Router.prototype.constructor = Router; + + Router.prototype.updateRender = function updateRender () { + this.router.normalize(); + this.route = this.router.parse(); + body.setAttribute('data-page', this.route.file); + }; + + Router.prototype.initRouter = function initRouter () { + var this$1 = this; + + var config = this.config; + var mode = config.routerMode || 'hash'; + var router; + + if (mode === 'history' && supportsPushState) { + router = new HTML5History(config); + } else { + router = new HashHistory(config); + } + + this.router = router; + this.updateRender(); + lastRoute = this.route; + + // eslint-disable-next-line no-unused-vars + router.onchange(function (params) { + this$1.updateRender(); + this$1._updateRender(); + + if (lastRoute.path === this$1.route.path) { + this$1.$resetEvents(params.source); + return; + } + + this$1.$fetch(noop, this$1.$resetEvents.bind(this$1, params.source)); + lastRoute = this$1.route; + }); + }; + + return Router; + }(Base)); + } + + var RGX = /([^{]*?)\w(?=\})/g; + + var MAP = { + YYYY: 'getFullYear', + YY: 'getYear', + MM: function (d) { + return d.getMonth() + 1; + }, + DD: 'getDate', + HH: 'getHours', + mm: 'getMinutes', + ss: 'getSeconds', + fff: 'getMilliseconds' + }; + + function tinydate (str, custom) { + var parts=[], offset=0; + + str.replace(RGX, function (key, _, idx) { + // save preceding string + parts.push(str.substring(offset, idx - 1)); + offset = idx += key.length + 1; + // save function + parts.push(custom && custom[key] || function (d) { + return ('00' + (typeof MAP[key] === 'string' ? d[MAP[key]]() : MAP[key](d))).slice(-key.length); + }); + }); + + if (offset !== str.length) { + parts.push(str.substring(offset)); + } + + return function (arg) { + var out='', i=0, d=arg||new Date(); + for (; i 80 ? 80 : num; + } else { + num = Math.floor((loaded / total) * 100); + } + + barEl.style.opacity = 1; + barEl.style.width = num >= 95 ? '100%' : num + '%'; + + if (num >= 95) { + clearTimeout(timeId); + // eslint-disable-next-line no-unused-vars + timeId = setTimeout(function (_) { + barEl.style.opacity = 0; + barEl.style.width = '0%'; + }, 200); + } + } + + /* eslint-disable no-unused-vars */ + + var cache = {}; + + /** + * Ajax GET implmentation + * @param {string} url Resource URL + * @param {boolean} [hasBar=false] Has progress bar + * @param {String[]} headers Array of headers + * @return {Promise} Promise response + */ + function get(url, hasBar, headers) { + if ( hasBar === void 0 ) hasBar = false; + if ( headers === void 0 ) headers = {}; + + var xhr = new XMLHttpRequest(); + var on = function () { + xhr.addEventListener.apply(xhr, arguments); + }; + + var cached = cache[url]; + + if (cached) { + return { then: function (cb) { return cb(cached.content, cached.opt); }, abort: noop }; + } + + xhr.open('GET', url); + for (var i in headers) { + if (hasOwn.call(headers, i)) { + xhr.setRequestHeader(i, headers[i]); + } + } + + xhr.send(); + + return { + then: function (success, error) { + if ( error === void 0 ) error = noop; + + if (hasBar) { + var id = setInterval( + function (_) { return progressbar({ + step: Math.floor(Math.random() * 5 + 1), + }); }, + 500 + ); + + on('progress', progressbar); + on('loadend', function (evt) { + progressbar(evt); + clearInterval(id); + }); + } + + on('error', error); + on('load', function (ref) { + var target = ref.target; + + if (target.status >= 400) { + error(target); + } else { + var result = (cache[url] = { + content: target.response, + opt: { + updatedAt: xhr.getResponseHeader('last-modified'), + }, + }); + + success(result.content, result.opt); + } + }); + }, + abort: function (_) { return xhr.readyState !== 4 && xhr.abort(); }, + }; + } + + function replaceVar(block, color) { + block.innerHTML = block.innerHTML.replace( + /var\(\s*--theme-color.*?\)/g, + color + ); + } + + function cssVars (color) { + // Variable support + if (window.CSS && window.CSS.supports && window.CSS.supports('(--v:red)')) { + return; + } + + var styleBlocks = findAll('style:not(.inserted),link'); + [].forEach.call(styleBlocks, function (block) { + if (block.nodeName === 'STYLE') { + replaceVar(block, color); + } else if (block.nodeName === 'LINK') { + var href = block.getAttribute('href'); + + if (!/\.css$/.test(href)) { + return; + } + + get(href).then(function (res) { + var style = create('style', res); + + head.appendChild(style); + replaceVar(style, color); + }); + } + }); + } + + /* eslint-disable no-unused-vars */ + + var title = $.title; + /** + * Toggle button + * @param {Element} el Button to be toggled + * @void + */ + function btn(el) { + var toggle = function (_) { return body.classList.toggle('close'); }; + + el = getNode(el); + if (el === null || el === undefined) { + return; + } + + on(el, 'click', function (e) { + e.stopPropagation(); + toggle(); + }); + + isMobile && + on( + body, + 'click', + function (_) { return body.classList.contains('close') && toggle(); } + ); + } + + function collapse(el) { + el = getNode(el); + if (el === null || el === undefined) { + return; + } + + on(el, 'click', function (ref) { + var target = ref.target; + + if ( + target.nodeName === 'A' && + target.nextSibling && + target.nextSibling.classList && + target.nextSibling.classList.contains('app-sub-sidebar') + ) { + toggleClass(target.parentNode, 'collapse'); + } + }); + } + + function sticky() { + var cover = getNode('section.cover'); + if (!cover) { + return; + } + + var coverHeight = cover.getBoundingClientRect().height; + + if (window.pageYOffset >= coverHeight || cover.classList.contains('hidden')) { + toggleClass(body, 'add', 'sticky'); + } else { + toggleClass(body, 'remove', 'sticky'); + } + } + + /** + * Get and active link + * @param {Object} router Router + * @param {String|Element} el Target element + * @param {Boolean} isParent Active parent + * @param {Boolean} autoTitle Automatically set title + * @return {Element} Active element + */ + function getAndActive(router, el, isParent, autoTitle) { + el = getNode(el); + var links = []; + if (el !== null && el !== undefined) { + links = findAll(el, 'a'); + } + + var hash = decodeURI(router.toURL(router.getCurrentPath())); + var target; + + links + .sort(function (a, b) { return b.href.length - a.href.length; }) + .forEach(function (a) { + var href = decodeURI(a.getAttribute('href')); + var node = isParent ? a.parentNode : a; + + a.title = a.title || a.innerText; + + if (hash.indexOf(href) === 0 && !target) { + target = a; + toggleClass(node, 'add', 'active'); + } else { + toggleClass(node, 'remove', 'active'); + } + }); + + if (autoTitle) { + $.title = target + ? target.title || ((target.innerText) + " - " + title) + : title; + } + + return target; + } + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var SingleTweener = function () { + function SingleTweener() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, SingleTweener); + + this.start = opts.start; + this.end = opts.end; + this.decimal = opts.decimal; + } + + _createClass(SingleTweener, [{ + key: "getIntermediateValue", + value: function getIntermediateValue(tick) { + if (this.decimal) { + return tick; + } else { + return Math.round(tick); + } + } + }, { + key: "getFinalValue", + value: function getFinalValue() { + return this.end; + } + }]); + + return SingleTweener; + }(); + + var _createClass$1 = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); + + function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var Tweezer = function () { + function Tweezer() { + var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck$1(this, Tweezer); + + this.duration = opts.duration || 1000; + this.ease = opts.easing || this._defaultEase; + this.tweener = opts.tweener || new SingleTweener(opts); + this.start = this.tweener.start; + this.end = this.tweener.end; + + this.frame = null; + this.next = null; + this.isRunning = false; + this.events = {}; + this.direction = this.start < this.end ? 'up' : 'down'; + } + + _createClass$1(Tweezer, [{ + key: 'begin', + value: function begin() { + if (!this.isRunning && this.next !== this.end) { + this.frame = window.requestAnimationFrame(this._tick.bind(this)); + } + return this; + } + }, { + key: 'stop', + value: function stop() { + window.cancelAnimationFrame(this.frame); + this.isRunning = false; + this.frame = null; + this.timeStart = null; + this.next = null; + return this; + } + }, { + key: 'on', + value: function on(name, handler) { + this.events[name] = this.events[name] || []; + this.events[name].push(handler); + return this; + } + }, { + key: '_emit', + value: function _emit(name, val) { + var _this = this; + + var e = this.events[name]; + e && e.forEach(function (handler) { + return handler.call(_this, val); + }); + } + }, { + key: '_tick', + value: function _tick(currentTime) { + this.isRunning = true; + + var lastTick = this.next || this.start; + + if (!this.timeStart) { this.timeStart = currentTime; } + this.timeElapsed = currentTime - this.timeStart; + this.next = this.ease(this.timeElapsed, this.start, this.end - this.start, this.duration); + + if (this._shouldTick(lastTick)) { + this._emit('tick', this.tweener.getIntermediateValue(this.next)); + this.frame = window.requestAnimationFrame(this._tick.bind(this)); + } else { + this._emit('tick', this.tweener.getFinalValue()); + this._emit('done', null); + } + } + }, { + key: '_shouldTick', + value: function _shouldTick(lastTick) { + return { + up: this.next < this.end && lastTick <= this.next, + down: this.next > this.end && lastTick >= this.next + }[this.direction]; + } + }, { + key: '_defaultEase', + value: function _defaultEase(t, b, c, d) { + if ((t /= d / 2) < 1) { return c / 2 * t * t + b; } + return -c / 2 * (--t * (t - 2) - 1) + b; + } + }]); + + return Tweezer; + }(); + + var currentScript = document.currentScript; + + /** @param {import('./Docsify').Docsify} vm */ + function config (vm) { + var config = merge( + { + auto2top: false, + autoHeader: false, + basePath: '', + catchPluginErrors: true, + cornerExternalLinkTarget: '_blank', + coverpage: '', + crossOriginLinks: [], + el: '#app', + executeScript: null, + ext: '.md', + externalLinkRel: 'noopener', + externalLinkTarget: '_blank', + formatUpdated: '', + ga: '', + homepage: 'README.md', + loadNavbar: null, + loadSidebar: null, + maxLevel: 6, + mergeNavbar: false, + name: '', + nameLink: window.location.pathname, + nativeEmoji: false, + noCompileLinks: [], + noEmoji: false, + notFoundPage: true, + relativePath: false, + repo: '', + routes: {}, + routerMode: 'hash', + subMaxLevel: 0, + themeColor: '', + topMargin: 0, + }, + typeof window.$docsify === 'function' + ? window.$docsify(vm) + : window.$docsify + ); + + var script = + currentScript || + [].slice + .call(document.getElementsByTagName('script')) + .filter(function (n) { return /docsify\./.test(n.src); })[0]; + + if (script) { + for (var prop in config) { + if (hasOwn.call(config, prop)) { + var val = script.getAttribute('data-' + hyphenate(prop)); + + if (isPrimitive(val)) { + config[prop] = val === '' ? true : val; + } + } + } + } + + if (config.loadSidebar === true) { + config.loadSidebar = '_sidebar' + config.ext; + } + + if (config.loadNavbar === true) { + config.loadNavbar = '_navbar' + config.ext; + } + + if (config.coverpage === true) { + config.coverpage = '_coverpage' + config.ext; + } + + if (config.repo === true) { + config.repo = ''; + } + + if (config.name === true) { + config.name = ''; + } + + window.$docsify = config; + + return config; + } + + var nav = {}; + var hoverOver = false; + var scroller = null; + var enableScrollEvent = true; + var coverHeight = 0; + + function scrollTo(el, offset) { + if ( offset === void 0 ) offset = 0; + + if (scroller) { + scroller.stop(); + } + + enableScrollEvent = false; + scroller = new Tweezer({ + start: window.pageYOffset, + end: + Math.round(el.getBoundingClientRect().top) + window.pageYOffset - offset, + duration: 500, + }) + .on('tick', function (v) { return window.scrollTo(0, v); }) + .on('done', function () { + enableScrollEvent = true; + scroller = null; + }) + .begin(); + } + + function highlight(path) { + if (!enableScrollEvent) { + return; + } + + var sidebar = getNode('.sidebar'); + var anchors = findAll('.anchor'); + var wrap = find(sidebar, '.sidebar-nav'); + var active = find(sidebar, 'li.active'); + var doc = document.documentElement; + var top = ((doc && doc.scrollTop) || document.body.scrollTop) - coverHeight; + var last; + + for (var i = 0, len = anchors.length; i < len; i += 1) { + var node = anchors[i]; + + if (node.offsetTop > top) { + if (!last) { + last = node; + } + + break; + } else { + last = node; + } + } + + if (!last) { + return; + } + + var li = nav[getNavKey(path, last.getAttribute('data-id'))]; + + if (!li || li === active) { + return; + } + + active && active.classList.remove('active'); + li.classList.add('active'); + active = li; + + // Scroll into view + // https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297 + if (!hoverOver && body.classList.contains('sticky')) { + var height = sidebar.clientHeight; + var curOffset = 0; + var cur = active.offsetTop + active.clientHeight + 40; + var isInView = + active.offsetTop >= wrap.scrollTop && cur <= wrap.scrollTop + height; + var notThan = cur - curOffset < height; + + sidebar.scrollTop = isInView + ? wrap.scrollTop + : notThan + ? curOffset + : cur - height; + } + } + + function getNavKey(path, id) { + return ((decodeURIComponent(path)) + "?id=" + (decodeURIComponent(id))); + } + + function scrollActiveSidebar(router) { + var cover = find('.cover.show'); + coverHeight = cover ? cover.offsetHeight : 0; + + var sidebar = getNode('.sidebar'); + var lis = []; + if (sidebar !== null && sidebar !== undefined) { + lis = findAll(sidebar, 'li'); + } + + for (var i = 0, len = lis.length; i < len; i += 1) { + var li = lis[i]; + var a = li.querySelector('a'); + if (!a) { + continue; + } + + var href = a.getAttribute('href'); + + if (href !== '/') { + var ref = router.parse(href); + var id = ref.query.id; + var path$1 = ref.path; + if (id) { + href = getNavKey(path$1, id); + } + } + + if (href) { + nav[decodeURIComponent(href)] = li; + } + } + + if (isMobile) { + return; + } + + var path = removeParams(router.getCurrentPath()); + off('scroll', function () { return highlight(path); }); + on('scroll', function () { return highlight(path); }); + on(sidebar, 'mouseover', function () { + hoverOver = true; + }); + on(sidebar, 'mouseleave', function () { + hoverOver = false; + }); + } + + function scrollIntoView(path, id) { + if (!id) { + return; + } + var topMargin = config().topMargin; + var section = find('#' + id); + section && scrollTo(section, topMargin); + + var li = nav[getNavKey(path, id)]; + var sidebar = getNode('.sidebar'); + var active = find(sidebar, 'li.active'); + active && active.classList.remove('active'); + li && li.classList.add('active'); + } + + var scrollEl = $.scrollingElement || $.documentElement; + + function scroll2Top(offset) { + if ( offset === void 0 ) offset = 0; + + scrollEl.scrollTop = offset === true ? 0 : Number(offset); + } + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var defaults = createCommonjsModule(function (module) { + function getDefaults() { + return { + baseUrl: null, + breaks: false, + gfm: true, + headerIds: true, + headerPrefix: '', + highlight: null, + langPrefix: 'language-', + mangle: true, + pedantic: false, + renderer: null, + sanitize: false, + sanitizer: null, + silent: false, + smartLists: false, + smartypants: false, + tokenizer: null, + walkTokens: null, + xhtml: false + }; + } + + function changeDefaults(newDefaults) { + module.exports.defaults = newDefaults; + } + + module.exports = { + defaults: getDefaults(), + getDefaults: getDefaults, + changeDefaults: changeDefaults + }; + }); + var defaults_1 = defaults.defaults; + var defaults_2 = defaults.getDefaults; + var defaults_3 = defaults.changeDefaults; + + /** + * Helpers + */ + var escapeTest = /[&<>"']/; + var escapeReplace = /[&<>"']/g; + var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; + var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; + var escapeReplacements = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + var getEscapeReplacement = function (ch) { return escapeReplacements[ch]; }; + function escape(html, encode) { + if (encode) { + if (escapeTest.test(html)) { + return html.replace(escapeReplace, getEscapeReplacement); + } + } else { + if (escapeTestNoEncode.test(html)) { + return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + } + } + + return html; + } + + var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; + + function unescape(html) { + // explicitly match decimal, hex, and named HTML entities + return html.replace(unescapeTest, function (_, n) { + n = n.toLowerCase(); + if (n === 'colon') { return ':'; } + if (n.charAt(0) === '#') { + return n.charAt(1) === 'x' + ? String.fromCharCode(parseInt(n.substring(2), 16)) + : String.fromCharCode(+n.substring(1)); + } + return ''; + }); + } + + var caret = /(^|[^\[])\^/g; + function edit(regex, opt) { + regex = regex.source || regex; + opt = opt || ''; + var obj = { + replace: function (name, val) { + val = val.source || val; + val = val.replace(caret, '$1'); + regex = regex.replace(name, val); + return obj; + }, + getRegex: function () { + return new RegExp(regex, opt); + } + }; + return obj; + } + + var nonWordAndColonTest = /[^\w:]/g; + var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; + function cleanUrl(sanitize, base, href) { + if (sanitize) { + var prot; + try { + prot = decodeURIComponent(unescape(href)) + .replace(nonWordAndColonTest, '') + .toLowerCase(); + } catch (e) { + return null; + } + if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { + return null; + } + } + if (base && !originIndependentUrl.test(href)) { + href = resolveUrl(base, href); + } + try { + href = encodeURI(href).replace(/%25/g, '%'); + } catch (e) { + return null; + } + return href; + } + + var baseUrls = {}; + var justDomain = /^[^:]+:\/*[^/]*$/; + var protocol = /^([^:]+:)[\s\S]*$/; + var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; + + function resolveUrl(base, href) { + if (!baseUrls[' ' + base]) { + // we can ignore everything in base after the last slash of its path component, + // but we might need to add _that_ + // https://tools.ietf.org/html/rfc3986#section-3 + if (justDomain.test(base)) { + baseUrls[' ' + base] = base + '/'; + } else { + baseUrls[' ' + base] = rtrim(base, '/', true); + } + } + base = baseUrls[' ' + base]; + var relativeBase = base.indexOf(':') === -1; + + if (href.substring(0, 2) === '//') { + if (relativeBase) { + return href; + } + return base.replace(protocol, '$1') + href; + } else if (href.charAt(0) === '/') { + if (relativeBase) { + return href; + } + return base.replace(domain, '$1') + href; + } else { + return base + href; + } + } + + var noopTest = { exec: function noopTest() {} }; + + function merge$1(obj) { + var arguments$1 = arguments; + + var i = 1, + target, + key; + + for (; i < arguments.length; i++) { + target = arguments$1[i]; + for (key in target) { + if (Object.prototype.hasOwnProperty.call(target, key)) { + obj[key] = target[key]; + } + } + } + + return obj; + } + + function splitCells(tableRow, count) { + // ensure that every cell-delimiting pipe has a space + // before it to distinguish it from an escaped pipe + var row = tableRow.replace(/\|/g, function (match, offset, str) { + var escaped = false, + curr = offset; + while (--curr >= 0 && str[curr] === '\\') { escaped = !escaped; } + if (escaped) { + // odd number of slashes means | is escaped + // so we leave it alone + return '|'; + } else { + // add space before unescaped | + return ' |'; + } + }), + cells = row.split(/ \|/); + var i = 0; + + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) { cells.push(''); } + } + + for (; i < cells.length; i++) { + // leading or trailing whitespace is ignored per the gfm spec + cells[i] = cells[i].trim().replace(/\\\|/g, '|'); + } + return cells; + } + + // Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). + // /c*$/ is vulnerable to REDOS. + // invert: Remove suffix of non-c chars instead. Default falsey. + function rtrim(str, c, invert) { + var l = str.length; + if (l === 0) { + return ''; + } + + // Length of suffix matching the invert condition. + var suffLen = 0; + + // Step left until we fail to match the invert condition. + while (suffLen < l) { + var currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } else if (currChar !== c && invert) { + suffLen++; + } else { + break; + } + } + + return str.substr(0, l - suffLen); + } + + function findClosingBracket(str, b) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + var l = str.length; + var level = 0, + i = 0; + for (; i < l; i++) { + if (str[i] === '\\') { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + return -1; + } + + function checkSanitizeDeprecation(opt) { + if (opt && opt.sanitize && !opt.silent) { + console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); + } + } + + // copied from https://stackoverflow.com/a/5450113/806777 + function repeatString(pattern, count) { + if (count < 1) { + return ''; + } + var result = ''; + while (count > 1) { + if (count & 1) { + result += pattern; + } + count >>= 1; + pattern += pattern; + } + return result + pattern; + } + + var helpers = { + escape: escape, + unescape: unescape, + edit: edit, + cleanUrl: cleanUrl, + resolveUrl: resolveUrl, + noopTest: noopTest, + merge: merge$1, + splitCells: splitCells, + rtrim: rtrim, + findClosingBracket: findClosingBracket, + checkSanitizeDeprecation: checkSanitizeDeprecation, + repeatString: repeatString + }; + + var defaults$1 = defaults.defaults; + + var rtrim$1 = helpers.rtrim; + var splitCells$1 = helpers.splitCells; + var escape$1 = helpers.escape; + var findClosingBracket$1 = helpers.findClosingBracket; + + function outputLink(cap, link, raw) { + var href = link.href; + var title = link.title ? escape$1(link.title) : null; + var text = cap[1].replace(/\\([\[\]])/g, '$1'); + + if (cap[0].charAt(0) !== '!') { + return { + type: 'link', + raw: raw, + href: href, + title: title, + text: text + }; + } else { + return { + type: 'image', + raw: raw, + href: href, + title: title, + text: escape$1(text) + }; + } + } + + function indentCodeCompensation(raw, text) { + var matchIndentToCode = raw.match(/^(\s+)(?:```)/); + + if (matchIndentToCode === null) { + return text; + } + + var indentToCode = matchIndentToCode[1]; + + return text + .split('\n') + .map(function (node) { + var matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; + } + + var indentInNode = matchIndentInNode[0]; + + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + + return node; + }) + .join('\n'); + } + + /** + * Tokenizer + */ + var Tokenizer = /*@__PURE__*/(function () { + function Tokenizer(options) { + this.options = options || defaults$1; + } + + Tokenizer.prototype.space = function space (src) { + var cap = this.rules.block.newline.exec(src); + if (cap) { + if (cap[0].length > 1) { + return { + type: 'space', + raw: cap[0] + }; + } + return { raw: '\n' }; + } + }; + + Tokenizer.prototype.code = function code (src, tokens) { + var cap = this.rules.block.code.exec(src); + if (cap) { + var lastToken = tokens[tokens.length - 1]; + // An indented code block cannot interrupt a paragraph. + if (lastToken && lastToken.type === 'paragraph') { + return { + raw: cap[0], + text: cap[0].trimRight() + }; + } + + var text = cap[0].replace(/^ {1,4}/gm, ''); + return { + type: 'code', + raw: cap[0], + codeBlockStyle: 'indented', + text: !this.options.pedantic + ? rtrim$1(text, '\n') + : text + }; + } + }; + + Tokenizer.prototype.fences = function fences (src) { + var cap = this.rules.block.fences.exec(src); + if (cap) { + var raw = cap[0]; + var text = indentCodeCompensation(raw, cap[3] || ''); + + return { + type: 'code', + raw: raw, + lang: cap[2] ? cap[2].trim() : cap[2], + text: text + }; + } + }; + + Tokenizer.prototype.heading = function heading (src) { + var cap = this.rules.block.heading.exec(src); + if (cap) { + var text = cap[2].trim(); + + // remove trailing #s + if (/#$/.test(text)) { + var trimmed = rtrim$1(text, '#'); + if (this.options.pedantic) { + text = trimmed.trim(); + } else if (!trimmed || / $/.test(trimmed)) { + // CommonMark requires space before trailing #s + text = trimmed.trim(); + } + } + + return { + type: 'heading', + raw: cap[0], + depth: cap[1].length, + text: text + }; + } + }; + + Tokenizer.prototype.nptable = function nptable (src) { + var cap = this.rules.block.nptable.exec(src); + if (cap) { + var item = { + type: 'table', + header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')), + align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), + cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [], + raw: cap[0] + }; + + if (item.header.length === item.align.length) { + var l = item.align.length; + var i; + for (i = 0; i < l; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } + } + + l = item.cells.length; + for (i = 0; i < l; i++) { + item.cells[i] = splitCells$1(item.cells[i], item.header.length); + } + + return item; + } + } + }; + + Tokenizer.prototype.hr = function hr (src) { + var cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: 'hr', + raw: cap[0] + }; + } + }; + + Tokenizer.prototype.blockquote = function blockquote (src) { + var cap = this.rules.block.blockquote.exec(src); + if (cap) { + var text = cap[0].replace(/^ *> ?/gm, ''); + + return { + type: 'blockquote', + raw: cap[0], + text: text + }; + } + }; + + Tokenizer.prototype.list = function list (src) { + var cap = this.rules.block.list.exec(src); + if (cap) { + var raw = cap[0]; + var bull = cap[2]; + var isordered = bull.length > 1; + + var list = { + type: 'list', + raw: raw, + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : '', + loose: false, + items: [] + }; + + // Get each top-level item. + var itemMatch = cap[0].match(this.rules.block.item); + + var next = false, + item, + space, + bcurr, + bnext, + addBack, + loose, + istask, + ischecked; + + var l = itemMatch.length; + bcurr = this.rules.block.listItemStart.exec(itemMatch[0]); + for (var i = 0; i < l; i++) { + item = itemMatch[i]; + raw = item; + + // Determine whether the next list item belongs here. + // Backpedal if it does not belong in this list. + if (i !== l - 1) { + bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]); + if ( + !this.options.pedantic + ? bnext[1].length > bcurr[0].length || bnext[1].length > 3 + : bnext[1].length > bcurr[1].length + ) { + // nested list + itemMatch.splice(i, 2, itemMatch[i] + '\n' + itemMatch[i + 1]); + i--; + l--; + continue; + } else { + if ( + // different bullet style + !this.options.pedantic || this.options.smartLists + ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1] + : isordered === (bnext[2].length === 1) + ) { + addBack = itemMatch.slice(i + 1).join('\n'); + list.raw = list.raw.substring(0, list.raw.length - addBack.length); + i = l - 1; + } + } + bcurr = bnext; + } + + // Remove the list item's bullet + // so it is seen as the next token. + space = item.length; + item = item.replace(/^ *([*+-]|\d+[.)]) ?/, ''); + + // Outdent whatever the + // list item contains. Hacky. + if (~item.indexOf('\n ')) { + space -= item.length; + item = !this.options.pedantic + ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') + : item.replace(/^ {1,4}/gm, ''); + } + + // Determine whether item is loose or not. + // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/ + // for discount behavior. + loose = next || /\n\n(?!\s*$)/.test(item); + if (i !== l - 1) { + next = item.charAt(item.length - 1) === '\n'; + if (!loose) { loose = next; } + } + + if (loose) { + list.loose = true; + } + + // Check for task list items + if (this.options.gfm) { + istask = /^\[[ xX]\] /.test(item); + ischecked = undefined; + if (istask) { + ischecked = item[1] !== ' '; + item = item.replace(/^\[[ xX]\] +/, ''); + } + } + + list.items.push({ + type: 'list_item', + raw: raw, + task: istask, + checked: ischecked, + loose: loose, + text: item + }); + } + + return list; + } + }; + + Tokenizer.prototype.html = function html (src) { + var cap = this.rules.block.html.exec(src); + if (cap) { + return { + type: this.options.sanitize + ? 'paragraph' + : 'html', + raw: cap[0], + pre: !this.options.sanitizer + && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), + text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0])) : cap[0] + }; + } + }; + + Tokenizer.prototype.def = function def (src) { + var cap = this.rules.block.def.exec(src); + if (cap) { + if (cap[3]) { cap[3] = cap[3].substring(1, cap[3].length - 1); } + var tag = cap[1].toLowerCase().replace(/\s+/g, ' '); + return { + tag: tag, + raw: cap[0], + href: cap[2], + title: cap[3] + }; + } + }; + + Tokenizer.prototype.table = function table (src) { + var cap = this.rules.block.table.exec(src); + if (cap) { + var item = { + type: 'table', + header: splitCells$1(cap[1].replace(/^ *| *\| *$/g, '')), + align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), + cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [] + }; + + if (item.header.length === item.align.length) { + item.raw = cap[0]; + + var l = item.align.length; + var i; + for (i = 0; i < l; i++) { + if (/^ *-+: *$/.test(item.align[i])) { + item.align[i] = 'right'; + } else if (/^ *:-+: *$/.test(item.align[i])) { + item.align[i] = 'center'; + } else if (/^ *:-+ *$/.test(item.align[i])) { + item.align[i] = 'left'; + } else { + item.align[i] = null; + } + } + + l = item.cells.length; + for (i = 0; i < l; i++) { + item.cells[i] = splitCells$1( + item.cells[i].replace(/^ *\| *| *\| *$/g, ''), + item.header.length); + } + + return item; + } + } + }; + + Tokenizer.prototype.lheading = function lheading (src) { + var cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: 'heading', + raw: cap[0], + depth: cap[2].charAt(0) === '=' ? 1 : 2, + text: cap[1] + }; + } + }; + + Tokenizer.prototype.paragraph = function paragraph (src) { + var cap = this.rules.block.paragraph.exec(src); + if (cap) { + return { + type: 'paragraph', + raw: cap[0], + text: cap[1].charAt(cap[1].length - 1) === '\n' + ? cap[1].slice(0, -1) + : cap[1] + }; + } + }; + + Tokenizer.prototype.text = function text (src, tokens) { + var cap = this.rules.block.text.exec(src); + if (cap) { + var lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === 'text') { + return { + raw: cap[0], + text: cap[0] + }; + } + + return { + type: 'text', + raw: cap[0], + text: cap[0] + }; + } + }; + + Tokenizer.prototype.escape = function escape$1$1 (src) { + var cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: 'escape', + raw: cap[0], + text: escape$1(cap[1]) + }; + } + }; + + Tokenizer.prototype.tag = function tag (src, inLink, inRawBlock) { + var cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!inLink && /^/i.test(cap[0])) { + inLink = false; + } + if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + inRawBlock = true; + } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + inRawBlock = false; + } + + return { + type: this.options.sanitize + ? 'text' + : 'html', + raw: cap[0], + inLink: inLink, + inRawBlock: inRawBlock, + text: this.options.sanitize + ? (this.options.sanitizer + ? this.options.sanitizer(cap[0]) + : escape$1(cap[0])) + : cap[0] + }; + } + }; + + Tokenizer.prototype.link = function link (src) { + var cap = this.rules.inline.link.exec(src); + if (cap) { + var trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl))) { + return; + } + + // ending angle bracket cannot be escaped + var rtrimSlash = rtrim$1(trimmedUrl.slice(0, -1), '\\'); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + // find closing parenthesis + var lastParenIndex = findClosingBracket$1(cap[2], '()'); + if (lastParenIndex > -1) { + var start = cap[0].indexOf('!') === 0 ? 5 : 4; + var linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ''; + } + } + var href = cap[2]; + var title = ''; + if (this.options.pedantic) { + // split pedantic href and title + var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + + if (link) { + href = link[1]; + title = link[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ''; + } + + href = href.trim(); + if (/^$/.test(trimmedUrl))) { + // pedantic allows starting angle bracket without ending angle bracket + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline._escapes, '$1') : href, + title: title ? title.replace(this.rules.inline._escapes, '$1') : title + }, cap[0]); + } + }; + + Tokenizer.prototype.reflink = function reflink (src, links) { + var cap; + if ((cap = this.rules.inline.reflink.exec(src)) + || (cap = this.rules.inline.nolink.exec(src))) { + var link = (cap[2] || cap[1]).replace(/\s+/g, ' '); + link = links[link.toLowerCase()]; + if (!link || !link.href) { + var text = cap[0].charAt(0); + return { + type: 'text', + raw: text, + text: text + }; + } + return outputLink(cap, link, cap[0]); + } + }; + + Tokenizer.prototype.strong = function strong (src, maskedSrc, prevChar) { + if ( prevChar === void 0 ) prevChar = ''; + + var match = this.rules.inline.strong.start.exec(src); + + if (match && (!match[1] || (match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))))) { + maskedSrc = maskedSrc.slice(-1 * src.length); + var endReg = match[0] === '**' ? this.rules.inline.strong.endAst : this.rules.inline.strong.endUnd; + + endReg.lastIndex = 0; + + var cap; + while ((match = endReg.exec(maskedSrc)) != null) { + cap = this.rules.inline.strong.middle.exec(maskedSrc.slice(0, match.index + 3)); + if (cap) { + return { + type: 'strong', + raw: src.slice(0, cap[0].length), + text: src.slice(2, cap[0].length - 2) + }; + } + } + } + }; + + Tokenizer.prototype.em = function em (src, maskedSrc, prevChar) { + if ( prevChar === void 0 ) prevChar = ''; + + var match = this.rules.inline.em.start.exec(src); + + if (match && (!match[1] || (match[1] && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))))) { + maskedSrc = maskedSrc.slice(-1 * src.length); + var endReg = match[0] === '*' ? this.rules.inline.em.endAst : this.rules.inline.em.endUnd; + + endReg.lastIndex = 0; + + var cap; + while ((match = endReg.exec(maskedSrc)) != null) { + cap = this.rules.inline.em.middle.exec(maskedSrc.slice(0, match.index + 2)); + if (cap) { + return { + type: 'em', + raw: src.slice(0, cap[0].length), + text: src.slice(1, cap[0].length - 1) + }; + } + } + } + }; + + Tokenizer.prototype.codespan = function codespan (src) { + var cap = this.rules.inline.code.exec(src); + if (cap) { + var text = cap[2].replace(/\n/g, ' '); + var hasNonSpaceChars = /[^ ]/.test(text); + var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text = text.substring(1, text.length - 1); + } + text = escape$1(text, true); + return { + type: 'codespan', + raw: cap[0], + text: text + }; + } + }; + + Tokenizer.prototype.br = function br (src) { + var cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: 'br', + raw: cap[0] + }; + } + }; + + Tokenizer.prototype.del = function del (src) { + var cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: 'del', + raw: cap[0], + text: cap[2] + }; + } + }; + + Tokenizer.prototype.autolink = function autolink (src, mangle) { + var cap = this.rules.inline.autolink.exec(src); + if (cap) { + var text, href; + if (cap[2] === '@') { + text = escape$1(this.options.mangle ? mangle(cap[1]) : cap[1]); + href = 'mailto:' + text; + } else { + text = escape$1(cap[1]); + href = text; + } + + return { + type: 'link', + raw: cap[0], + text: text, + href: href, + tokens: [ + { + type: 'text', + raw: text, + text: text + } + ] + }; + } + }; + + Tokenizer.prototype.url = function url (src, mangle) { + var cap; + if (cap = this.rules.inline.url.exec(src)) { + var text, href; + if (cap[2] === '@') { + text = escape$1(this.options.mangle ? mangle(cap[0]) : cap[0]); + href = 'mailto:' + text; + } else { + // do extended autolink path validation + var prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; + } while (prevCapZero !== cap[0]); + text = escape$1(cap[0]); + if (cap[1] === 'www.') { + href = 'http://' + text; + } else { + href = text; + } + } + return { + type: 'link', + raw: cap[0], + text: text, + href: href, + tokens: [ + { + type: 'text', + raw: text, + text: text + } + ] + }; + } + }; + + Tokenizer.prototype.inlineText = function inlineText (src, inRawBlock, smartypants) { + var cap = this.rules.inline.text.exec(src); + if (cap) { + var text; + if (inRawBlock) { + text = this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$1(cap[0])) : cap[0]; + } else { + text = escape$1(this.options.smartypants ? smartypants(cap[0]) : cap[0]); + } + return { + type: 'text', + raw: cap[0], + text: text + }; + } + }; + + return Tokenizer; + }()); + + var noopTest$1 = helpers.noopTest; + var edit$1 = helpers.edit; + var merge$2 = helpers.merge; + + /** + * Block-Level Grammar + */ + var block = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/, + hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/, + html: '^ {0,3}(?:' // optional indentation + + '<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) + + '|comment[^\\n]*(\\n+|$)' // (2) + + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3) + + '|\\n*|$)' // (4) + + '|\\n*|$)' // (5) + + '|)[\\s\\S]*?(?:\\n{2,}|$)' // (6) + + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag + + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag + + ')', + def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, + nptable: noopTest$1, + table: noopTest$1, + lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, + // regex template, placeholders will be replaced according to different paragraph + // interruption rules of commonmark and the original markdown spec: + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/, + text: /^[^\n]+/ + }; + + block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; + block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; + block.def = edit$1(block.def) + .replace('label', block._label) + .replace('title', block._title) + .getRegex(); + + block.bullet = /(?:[*+-]|\d{1,9}[.)])/; + block.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/; + block.item = edit$1(block.item, 'gm') + .replace(/bull/g, block.bullet) + .getRegex(); + + block.listItemStart = edit$1(/^( *)(bull)/) + .replace('bull', block.bullet) + .getRegex(); + + block.list = edit$1(block.list) + .replace(/bull/g, block.bullet) + .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))') + .replace('def', '\\n+(?=' + block.def.source + ')') + .getRegex(); + + block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + + '|track|ul'; + block._comment = /|$)/; + block.html = edit$1(block.html, 'i') + .replace('comment', block._comment) + .replace('tag', block._tag) + .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) + .getRegex(); + + block.paragraph = edit$1(block._paragraph) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs + .replace('blockquote', ' {0,3}>') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|!--)') + .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks + .getRegex(); + + block.blockquote = edit$1(block.blockquote) + .replace('paragraph', block.paragraph) + .getRegex(); + + /** + * Normal Block Grammar + */ + + block.normal = merge$2({}, block); + + /** + * GFM Block Grammar + */ + + block.gfm = merge$2({}, block.normal, { + nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header + + ' {0,3}([-:]+ *\\|[-| :]*)' // Align + + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', // Cells + table: '^ *\\|(.+)\\n' // Header + + ' {0,3}\\|?( *[-:]+[-| :]*)' // Align + + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells + }); + + block.gfm.nptable = edit$1(block.gfm.nptable) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('blockquote', ' {0,3}>') + .replace('code', ' {4}[^\\n]') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|!--)') + .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks + .getRegex(); + + block.gfm.table = edit$1(block.gfm.table) + .replace('hr', block.hr) + .replace('heading', ' {0,3}#{1,6} ') + .replace('blockquote', ' {0,3}>') + .replace('code', ' {4}[^\\n]') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|!--)') + .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks + .getRegex(); + + /** + * Pedantic grammar (original John Gruber's loose markdown specification) + */ + + block.pedantic = merge$2({}, block.normal, { + html: edit$1( + '^ *(?:comment *(?:\\n|\\s*$)' + + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') + .replace('comment', block._comment) + .replace(/tag/g, '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest$1, // fences not supported + paragraph: edit$1(block.normal._paragraph) + .replace('hr', block.hr) + .replace('heading', ' *#{1,6} *[^\n]') + .replace('lheading', block.lheading) + .replace('blockquote', ' {0,3}>') + .replace('|fences', '') + .replace('|list', '') + .replace('|html', '') + .getRegex() + }); + + /** + * Inline-Level Grammar + */ + var inline = { + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: noopTest$1, + tag: '^comment' + + '|^' // self-closing tag + + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag + + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. + + '|^' // declaration, e.g. + + '|^', // CDATA section + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, + nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, + reflinkSearch: 'reflink|nolink(?!\\()', + strong: { + start: /^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/, // (1) returns if starts w/ punctuation + middle: /^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/, + endAst: /[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/, // last char can't be punct, or final * must also be followed by punct (or endline) + endUnd: /[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline) + }, + em: { + start: /^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/, // (1) returns if starts w/ punctuation + middle: /^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/, + endAst: /[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/, // last char can't be punct, or final * must also be followed by punct (or endline) + endUnd: /[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/ // last char can't be a space, and final _ must preceed punct or \s (or endline) + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: noopTest$1, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~'; + inline.punctuation = edit$1(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); + + // sequences em should skip over [title](link), `code`, + inline._blockSkip = '\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>'; + inline._overlapSkip = '__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*'; + + inline._comment = edit$1(block._comment).replace('(?:-->|$)', '-->').getRegex(); + + inline.em.start = edit$1(inline.em.start) + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.em.middle = edit$1(inline.em.middle) + .replace(/punctuation/g, inline._punctuation) + .replace(/overlapSkip/g, inline._overlapSkip) + .getRegex(); + + inline.em.endAst = edit$1(inline.em.endAst, 'g') + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.em.endUnd = edit$1(inline.em.endUnd, 'g') + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.strong.start = edit$1(inline.strong.start) + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.strong.middle = edit$1(inline.strong.middle) + .replace(/punctuation/g, inline._punctuation) + .replace(/overlapSkip/g, inline._overlapSkip) + .getRegex(); + + inline.strong.endAst = edit$1(inline.strong.endAst, 'g') + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.strong.endUnd = edit$1(inline.strong.endUnd, 'g') + .replace(/punctuation/g, inline._punctuation) + .getRegex(); + + inline.blockSkip = edit$1(inline._blockSkip, 'g') + .getRegex(); + + inline.overlapSkip = edit$1(inline._overlapSkip, 'g') + .getRegex(); + + inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; + + inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; + inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; + inline.autolink = edit$1(inline.autolink) + .replace('scheme', inline._scheme) + .replace('email', inline._email) + .getRegex(); + + inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; + + inline.tag = edit$1(inline.tag) + .replace('comment', inline._comment) + .replace('attribute', inline._attribute) + .getRegex(); + + inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; + inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; + inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; + + inline.link = edit$1(inline.link) + .replace('label', inline._label) + .replace('href', inline._href) + .replace('title', inline._title) + .getRegex(); + + inline.reflink = edit$1(inline.reflink) + .replace('label', inline._label) + .getRegex(); + + inline.reflinkSearch = edit$1(inline.reflinkSearch, 'g') + .replace('reflink', inline.reflink) + .replace('nolink', inline.nolink) + .getRegex(); + + /** + * Normal Inline Grammar + */ + + inline.normal = merge$2({}, inline); + + /** + * Pedantic Inline Grammar + */ + + inline.pedantic = merge$2({}, inline.normal, { + strong: { + start: /^__|\*\*/, + middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g + }, + em: { + start: /^_|\*/, + middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g + }, + link: edit$1(/^!?\[(label)\]\((.*?)\)/) + .replace('label', inline._label) + .getRegex(), + reflink: edit$1(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace('label', inline._label) + .getRegex() + }); + + /** + * GFM Inline Grammar + */ + + inline.gfm = merge$2({}, inline.normal, { + escape: edit$1(inline.escape).replace('])', '~|])').getRegex(), + _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\ 0.5) { + ch = 'x' + ch.toString(16); + } + out += '&#' + ch + ';'; + } + + return out; + } + + /** + * Block Lexer + */ + var Lexer = /*@__PURE__*/(function () { + function Lexer(options) { + this.tokens = []; + this.tokens.links = Object.create(null); + this.options = options || defaults$2; + this.options.tokenizer = this.options.tokenizer || new Tokenizer(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + + var rules = { + block: block$1.normal, + inline: inline$1.normal + }; + + if (this.options.pedantic) { + rules.block = block$1.pedantic; + rules.inline = inline$1.pedantic; + } else if (this.options.gfm) { + rules.block = block$1.gfm; + if (this.options.breaks) { + rules.inline = inline$1.breaks; + } else { + rules.inline = inline$1.gfm; + } + } + this.tokenizer.rules = rules; + } + + var staticAccessors = { rules: { configurable: true } }; + + /** + * Expose Rules + */ + staticAccessors.rules.get = function () { + return { + block: block$1, + inline: inline$1 + }; + }; + + /** + * Static Lex Method + */ + Lexer.lex = function lex (src, options) { + var lexer = new Lexer(options); + return lexer.lex(src); + }; + + /** + * Static Lex Inline Method + */ + Lexer.lexInline = function lexInline (src, options) { + var lexer = new Lexer(options); + return lexer.inlineTokens(src); + }; + + /** + * Preprocessing + */ + Lexer.prototype.lex = function lex (src) { + src = src + .replace(/\r\n|\r/g, '\n') + .replace(/\t/g, ' '); + + this.blockTokens(src, this.tokens, true); + + this.inline(this.tokens); + + return this.tokens; + }; + + /** + * Lexing + */ + Lexer.prototype.blockTokens = function blockTokens (src, tokens, top) { + if ( tokens === void 0 ) tokens = []; + if ( top === void 0 ) top = true; + + if (this.options.pedantic) { + src = src.replace(/^ +$/gm, ''); + } + var token, i, l, lastToken; + + while (src) { + // newline + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + if (token.type) { + tokens.push(token); + } + continue; + } + + // code + if (token = this.tokenizer.code(src, tokens)) { + src = src.substring(token.raw.length); + if (token.type) { + tokens.push(token); + } else { + lastToken = tokens[tokens.length - 1]; + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.text; + } + continue; + } + + // fences + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // heading + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // table no leading pipe (gfm) + if (token = this.tokenizer.nptable(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // hr + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // blockquote + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + token.tokens = this.blockTokens(token.text, [], top); + tokens.push(token); + continue; + } + + // list + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + l = token.items.length; + for (i = 0; i < l; i++) { + token.items[i].tokens = this.blockTokens(token.items[i].text, [], false); + } + tokens.push(token); + continue; + } + + // html + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // def + if (top && (token = this.tokenizer.def(src))) { + src = src.substring(token.raw.length); + if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + + // table (gfm) + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // lheading + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // top-level paragraph + if (top && (token = this.tokenizer.paragraph(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // text + if (token = this.tokenizer.text(src, tokens)) { + src = src.substring(token.raw.length); + if (token.type) { + tokens.push(token); + } else { + lastToken = tokens[tokens.length - 1]; + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.text; + } + continue; + } + + if (src) { + var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + + return tokens; + }; + + Lexer.prototype.inline = function inline (tokens) { + var i, + j, + k, + l2, + row, + token; + + var l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + switch (token.type) { + case 'paragraph': + case 'text': + case 'heading': { + token.tokens = []; + this.inlineTokens(token.text, token.tokens); + break; + } + case 'table': { + token.tokens = { + header: [], + cells: [] + }; + + // header + l2 = token.header.length; + for (j = 0; j < l2; j++) { + token.tokens.header[j] = []; + this.inlineTokens(token.header[j], token.tokens.header[j]); + } + + // cells + l2 = token.cells.length; + for (j = 0; j < l2; j++) { + row = token.cells[j]; + token.tokens.cells[j] = []; + for (k = 0; k < row.length; k++) { + token.tokens.cells[j][k] = []; + this.inlineTokens(row[k], token.tokens.cells[j][k]); + } + } + + break; + } + case 'blockquote': { + this.inline(token.tokens); + break; + } + case 'list': { + l2 = token.items.length; + for (j = 0; j < l2; j++) { + this.inline(token.items[j].tokens); + } + break; + } + } + } + + return tokens; + }; + + /** + * Lexing/Compiling + */ + Lexer.prototype.inlineTokens = function inlineTokens (src, tokens, inLink, inRawBlock) { + if ( tokens === void 0 ) tokens = []; + if ( inLink === void 0 ) inLink = false; + if ( inRawBlock === void 0 ) inRawBlock = false; + + var token; + + // String with links masked to avoid interference with em and strong + var maskedSrc = src; + var match; + var keepPrevChar, prevChar; + + // Mask out reflinks + if (this.tokens.links) { + var links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + // Mask out other blocks + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString$1('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + + while (src) { + if (!keepPrevChar) { + prevChar = ''; + } + keepPrevChar = false; + // escape + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // tag + if (token = this.tokenizer.tag(src, inLink, inRawBlock)) { + src = src.substring(token.raw.length); + inLink = token.inLink; + inRawBlock = token.inRawBlock; + tokens.push(token); + continue; + } + + // link + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + if (token.type === 'link') { + token.tokens = this.inlineTokens(token.text, [], true, inRawBlock); + } + tokens.push(token); + continue; + } + + // reflink, nolink + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + if (token.type === 'link') { + token.tokens = this.inlineTokens(token.text, [], true, inRawBlock); + } + tokens.push(token); + continue; + } + + // strong + if (token = this.tokenizer.strong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); + tokens.push(token); + continue; + } + + // em + if (token = this.tokenizer.em(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); + tokens.push(token); + continue; + } + + // code + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // br + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // del (gfm) + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock); + tokens.push(token); + continue; + } + + // autolink + if (token = this.tokenizer.autolink(src, mangle)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // url (gfm) + if (!inLink && (token = this.tokenizer.url(src, mangle))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + + // text + if (token = this.tokenizer.inlineText(src, inRawBlock, smartypants)) { + src = src.substring(token.raw.length); + prevChar = token.raw.slice(-1); + keepPrevChar = true; + tokens.push(token); + continue; + } + + if (src) { + var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + + return tokens; + }; + + Object.defineProperties( Lexer, staticAccessors ); + + return Lexer; + }()); + + var defaults$3 = defaults.defaults; + + var cleanUrl$1 = helpers.cleanUrl; + var escape$2 = helpers.escape; + + /** + * Renderer + */ + var Renderer = /*@__PURE__*/(function () { + function Renderer(options) { + this.options = options || defaults$3; + } + + Renderer.prototype.code = function code (code$1, infostring, escaped) { + var lang = (infostring || '').match(/\S*/)[0]; + if (this.options.highlight) { + var out = this.options.highlight(code$1, lang); + if (out != null && out !== code$1) { + escaped = true; + code$1 = out; + } + } + + code$1 = code$1.replace(/\n$/, '') + '\n'; + + if (!lang) { + return '
'
+          + (escaped ? code$1 : escape$2(code$1, true))
+          + '
\n'; + } + + return '
'
+        + (escaped ? code$1 : escape$2(code$1, true))
+        + '
\n'; + }; + + Renderer.prototype.blockquote = function blockquote (quote) { + return '
\n' + quote + '
\n'; + }; + + Renderer.prototype.html = function html (html$1) { + return html$1; + }; + + Renderer.prototype.heading = function heading (text, level, raw, slugger) { + if (this.options.headerIds) { + return '' + + text + + '\n'; + } + // ignore IDs + return '' + text + '\n'; + }; + + Renderer.prototype.hr = function hr () { + return this.options.xhtml ? '
\n' : '
\n'; + }; + + Renderer.prototype.list = function list (body, ordered, start) { + var type = ordered ? 'ol' : 'ul', + startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; + return '<' + type + startatt + '>\n' + body + '\n'; + }; + + Renderer.prototype.listitem = function listitem (text) { + return '
  • ' + text + '
  • \n'; + }; + + Renderer.prototype.checkbox = function checkbox (checked) { + return ' '; + }; + + Renderer.prototype.paragraph = function paragraph (text) { + return '

    ' + text + '

    \n'; + }; + + Renderer.prototype.table = function table (header, body) { + if (body) { body = '' + body + ''; } + + return '\n' + + '\n' + + header + + '\n' + + body + + '
    \n'; + }; + + Renderer.prototype.tablerow = function tablerow (content) { + return '\n' + content + '\n'; + }; + + Renderer.prototype.tablecell = function tablecell (content, flags) { + var type = flags.header ? 'th' : 'td'; + var tag = flags.align + ? '<' + type + ' align="' + flags.align + '">' + : '<' + type + '>'; + return tag + content + '\n'; + }; + + // span level renderer + Renderer.prototype.strong = function strong (text) { + return '' + text + ''; + }; + + Renderer.prototype.em = function em (text) { + return '' + text + ''; + }; + + Renderer.prototype.codespan = function codespan (text) { + return '' + text + ''; + }; + + Renderer.prototype.br = function br () { + return this.options.xhtml ? '
    ' : '
    '; + }; + + Renderer.prototype.del = function del (text) { + return '' + text + ''; + }; + + Renderer.prototype.link = function link (href, title, text) { + href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text; + } + var out = '
    '; + return out; + }; + + Renderer.prototype.image = function image (href, title, text) { + href = cleanUrl$1(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text; + } + + var out = '' + text + '' : '>'; + return out; + }; + + Renderer.prototype.text = function text (text$1) { + return text$1; + }; + + return Renderer; + }()); + + /** + * TextRenderer + * returns only the textual part of the token + */ + var TextRenderer = /*@__PURE__*/(function () { + function TextRenderer () {} + + TextRenderer.prototype.strong = function strong (text) { + return text; + }; + + TextRenderer.prototype.em = function em (text) { + return text; + }; + + TextRenderer.prototype.codespan = function codespan (text) { + return text; + }; + + TextRenderer.prototype.del = function del (text) { + return text; + }; + + TextRenderer.prototype.html = function html (text) { + return text; + }; + + TextRenderer.prototype.text = function text (text$1) { + return text$1; + }; + + TextRenderer.prototype.link = function link (href, title, text) { + return '' + text; + }; + + TextRenderer.prototype.image = function image (href, title, text) { + return '' + text; + }; + + TextRenderer.prototype.br = function br () { + return ''; + }; + + return TextRenderer; + }()); + + /** + * Slugger generates header id + */ + var Slugger = /*@__PURE__*/(function () { + function Slugger() { + this.seen = {}; + } + + Slugger.prototype.serialize = function serialize (value) { + return value + .toLowerCase() + .trim() + // remove html tags + .replace(/<[!\/a-z].*?>/ig, '') + // remove unwanted chars + .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '') + .replace(/\s/g, '-'); + }; + + /** + * Finds the next safe (unique) slug to use + */ + Slugger.prototype.getNextSafeSlug = function getNextSafeSlug (originalSlug, isDryRun) { + var slug = originalSlug; + var occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + '-' + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + }; + + /** + * Convert string to unique id + * @param {object} options + * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator. + */ + Slugger.prototype.slug = function slug (value, options) { + if ( options === void 0 ) options = {}; + + var slug = this.serialize(value); + return this.getNextSafeSlug(slug, options.dryrun); + }; + + return Slugger; + }()); + + var defaults$4 = defaults.defaults; + + var unescape$1 = helpers.unescape; + + /** + * Parsing & Compiling + */ + var Parser = /*@__PURE__*/(function () { + function Parser(options) { + this.options = options || defaults$4; + this.options.renderer = this.options.renderer || new Renderer(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.textRenderer = new TextRenderer(); + this.slugger = new Slugger(); + } + + /** + * Static Parse Method + */ + Parser.parse = function parse (tokens, options) { + var parser = new Parser(options); + return parser.parse(tokens); + }; + + /** + * Static Parse Inline Method + */ + Parser.parseInline = function parseInline (tokens, options) { + var parser = new Parser(options); + return parser.parseInline(tokens); + }; + + /** + * Parse Loop + */ + Parser.prototype.parse = function parse (tokens, top) { + if ( top === void 0 ) top = true; + + var out = '', + i, + j, + k, + l2, + l3, + row, + cell, + header, + body, + token, + ordered, + start, + loose, + itemBody, + item, + checked, + task, + checkbox; + + var l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + switch (token.type) { + case 'space': { + continue; + } + case 'hr': { + out += this.renderer.hr(); + continue; + } + case 'heading': { + out += this.renderer.heading( + this.parseInline(token.tokens), + token.depth, + unescape$1(this.parseInline(token.tokens, this.textRenderer)), + this.slugger); + continue; + } + case 'code': { + out += this.renderer.code(token.text, + token.lang, + token.escaped); + continue; + } + case 'table': { + header = ''; + + // header + cell = ''; + l2 = token.header.length; + for (j = 0; j < l2; j++) { + cell += this.renderer.tablecell( + this.parseInline(token.tokens.header[j]), + { header: true, align: token.align[j] } + ); + } + header += this.renderer.tablerow(cell); + + body = ''; + l2 = token.cells.length; + for (j = 0; j < l2; j++) { + row = token.tokens.cells[j]; + + cell = ''; + l3 = row.length; + for (k = 0; k < l3; k++) { + cell += this.renderer.tablecell( + this.parseInline(row[k]), + { header: false, align: token.align[k] } + ); + } + + body += this.renderer.tablerow(cell); + } + out += this.renderer.table(header, body); + continue; + } + case 'blockquote': { + body = this.parse(token.tokens); + out += this.renderer.blockquote(body); + continue; + } + case 'list': { + ordered = token.ordered; + start = token.start; + loose = token.loose; + l2 = token.items.length; + + body = ''; + for (j = 0; j < l2; j++) { + item = token.items[j]; + checked = item.checked; + task = item.task; + + itemBody = ''; + if (item.task) { + checkbox = this.renderer.checkbox(checked); + if (loose) { + if (item.tokens.length > 0 && item.tokens[0].type === 'text') { + item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { + item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; + } + } else { + item.tokens.unshift({ + type: 'text', + text: checkbox + }); + } + } else { + itemBody += checkbox; + } + } + + itemBody += this.parse(item.tokens, loose); + body += this.renderer.listitem(itemBody, task, checked); + } + + out += this.renderer.list(body, ordered, start); + continue; + } + case 'html': { + // TODO parse inline content if parameter markdown=1 + out += this.renderer.html(token.text); + continue; + } + case 'paragraph': { + out += this.renderer.paragraph(this.parseInline(token.tokens)); + continue; + } + case 'text': { + body = token.tokens ? this.parseInline(token.tokens) : token.text; + while (i + 1 < l && tokens[i + 1].type === 'text') { + token = tokens[++i]; + body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text); + } + out += top ? this.renderer.paragraph(body) : body; + continue; + } + default: { + var errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + + return out; + }; + + /** + * Parse Inline Tokens + */ + Parser.prototype.parseInline = function parseInline (tokens, renderer) { + renderer = renderer || this.renderer; + var out = '', + i, + token; + + var l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + switch (token.type) { + case 'escape': { + out += renderer.text(token.text); + break; + } + case 'html': { + out += renderer.html(token.text); + break; + } + case 'link': { + out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); + break; + } + case 'image': { + out += renderer.image(token.href, token.title, token.text); + break; + } + case 'strong': { + out += renderer.strong(this.parseInline(token.tokens, renderer)); + break; + } + case 'em': { + out += renderer.em(this.parseInline(token.tokens, renderer)); + break; + } + case 'codespan': { + out += renderer.codespan(token.text); + break; + } + case 'br': { + out += renderer.br(); + break; + } + case 'del': { + out += renderer.del(this.parseInline(token.tokens, renderer)); + break; + } + case 'text': { + out += renderer.text(token.text); + break; + } + default: { + var errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + }; + + return Parser; + }()); + + var merge$3 = helpers.merge; + var checkSanitizeDeprecation$1 = helpers.checkSanitizeDeprecation; + var escape$3 = helpers.escape; + + var getDefaults = defaults.getDefaults; + var changeDefaults = defaults.changeDefaults; + var defaults$5 = defaults.defaults; + + /** + * Marked + */ + function marked(src, opt, callback) { + // throw error in case of non string input + if (typeof src === 'undefined' || src === null) { + throw new Error('marked(): input parameter is undefined or null'); + } + if (typeof src !== 'string') { + throw new Error('marked(): input parameter is of type ' + + Object.prototype.toString.call(src) + ', string expected'); + } + + if (typeof opt === 'function') { + callback = opt; + opt = null; + } + + opt = merge$3({}, marked.defaults, opt || {}); + checkSanitizeDeprecation$1(opt); + + if (callback) { + var highlight = opt.highlight; + var tokens; + + try { + tokens = Lexer.lex(src, opt); + } catch (e) { + return callback(e); + } + + var done = function(err) { + var out; + + if (!err) { + try { + out = Parser.parse(tokens, opt); + } catch (e) { + err = e; + } + } + + opt.highlight = highlight; + + return err + ? callback(err) + : callback(null, out); + }; + + if (!highlight || highlight.length < 3) { + return done(); + } + + delete opt.highlight; + + if (!tokens.length) { return done(); } + + var pending = 0; + marked.walkTokens(tokens, function(token) { + if (token.type === 'code') { + pending++; + setTimeout(function () { + highlight(token.text, token.lang, function(err, code) { + if (err) { + return done(err); + } + if (code != null && code !== token.text) { + token.text = code; + token.escaped = true; + } + + pending--; + if (pending === 0) { + done(); + } + }); + }, 0); + } + }); + + if (pending === 0) { + done(); + } + + return; + } + + try { + var tokens$1 = Lexer.lex(src, opt); + if (opt.walkTokens) { + marked.walkTokens(tokens$1, opt.walkTokens); + } + return Parser.parse(tokens$1, opt); + } catch (e) { + e.message += '\nPlease report this to https://github.com/markedjs/marked.'; + if (opt.silent) { + return '

    An error occurred:

    '
    +          + escape$3(e.message + '', true)
    +          + '
    '; + } + throw e; + } + } + + /** + * Options + */ + + marked.options = + marked.setOptions = function(opt) { + merge$3(marked.defaults, opt); + changeDefaults(marked.defaults); + return marked; + }; + + marked.getDefaults = getDefaults; + + marked.defaults = defaults$5; + + /** + * Use Extension + */ + + marked.use = function(extension) { + var opts = merge$3({}, extension); + if (extension.renderer) { + var renderer = marked.defaults.renderer || new Renderer(); + var loop = function ( prop ) { + var prevRenderer = renderer[prop]; + renderer[prop] = function () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var ret = extension.renderer[prop].apply(renderer, args); + if (ret === false) { + ret = prevRenderer.apply(renderer, args); + } + return ret; + }; + }; + + for (var prop in extension.renderer) loop( prop ); + opts.renderer = renderer; + } + if (extension.tokenizer) { + var tokenizer = marked.defaults.tokenizer || new Tokenizer(); + var loop$1 = function ( prop ) { + var prevTokenizer = tokenizer[prop$1]; + tokenizer[prop$1] = function () { + var args = [], len = arguments.length; + while ( len-- ) args[ len ] = arguments[ len ]; + + var ret = extension.tokenizer[prop$1].apply(tokenizer, args); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args); + } + return ret; + }; + }; + + for (var prop$1 in extension.tokenizer) loop$1( prop ); + opts.tokenizer = tokenizer; + } + if (extension.walkTokens) { + var walkTokens = marked.defaults.walkTokens; + opts.walkTokens = function (token) { + extension.walkTokens(token); + if (walkTokens) { + walkTokens(token); + } + }; + } + marked.setOptions(opts); + }; + + /** + * Run callback for every token + */ + + marked.walkTokens = function(tokens, callback) { + for (var i$3 = 0, list$3 = tokens; i$3 < list$3.length; i$3 += 1) { + var token = list$3[i$3]; + + callback(token); + switch (token.type) { + case 'table': { + for (var i = 0, list = token.tokens.header; i < list.length; i += 1) { + var cell = list[i]; + + marked.walkTokens(cell, callback); + } + for (var i$2 = 0, list$2 = token.tokens.cells; i$2 < list$2.length; i$2 += 1) { + var row = list$2[i$2]; + + for (var i$1 = 0, list$1 = row; i$1 < list$1.length; i$1 += 1) { + var cell$1 = list$1[i$1]; + + marked.walkTokens(cell$1, callback); + } + } + break; + } + case 'list': { + marked.walkTokens(token.items, callback); + break; + } + default: { + if (token.tokens) { + marked.walkTokens(token.tokens, callback); + } + } + } + } + }; + + /** + * Parse Inline + */ + marked.parseInline = function(src, opt) { + // throw error in case of non string input + if (typeof src === 'undefined' || src === null) { + throw new Error('marked.parseInline(): input parameter is undefined or null'); + } + if (typeof src !== 'string') { + throw new Error('marked.parseInline(): input parameter is of type ' + + Object.prototype.toString.call(src) + ', string expected'); + } + + opt = merge$3({}, marked.defaults, opt || {}); + checkSanitizeDeprecation$1(opt); + + try { + var tokens = Lexer.lexInline(src, opt); + if (opt.walkTokens) { + marked.walkTokens(tokens, opt.walkTokens); + } + return Parser.parseInline(tokens, opt); + } catch (e) { + e.message += '\nPlease report this to https://github.com/markedjs/marked.'; + if (opt.silent) { + return '

    An error occurred:

    '
    +          + escape$3(e.message + '', true)
    +          + '
    '; + } + throw e; + } + }; + + /** + * Expose + */ + + marked.Parser = Parser; + marked.parser = Parser.parse; + + marked.Renderer = Renderer; + marked.TextRenderer = TextRenderer; + + marked.Lexer = Lexer; + marked.lexer = Lexer.lex; + + marked.Tokenizer = Tokenizer; + + marked.Slugger = Slugger; + + marked.parse = marked; + + var marked_1 = marked; + + /** + * Render github corner + * @param {Object} data URL for the View Source on Github link + * @param {String} cornerExternalLinkTarget value of the target attribute of the link + * @return {String} SVG element as string + */ + function corner(data, cornerExternalLinkTarget) { + if (!data) { + return ''; + } + + if (!/\/\//.test(data)) { + data = 'https://github.com/' + data; + } + + data = data.replace(/^git\+/, ''); + // Double check + cornerExternalLinkTarget = cornerExternalLinkTarget || '_blank'; + + return ( + "
    " + + '' + + '' + ); + } + + /** + * Renders main content + * @param {Object} config Configuration object + * @returns {String} HTML of the main content + */ + function main(config) { + var name = config.name ? config.name : ''; + + var aside = + '' + + ''; + return ( + "
    " + aside + + '
    ' + + '
    ' + + '
    ' + + '
    ' + ); + } + + /** + * Cover Page + * @returns {String} Cover page + */ + function cover() { + var SL = ', 100%, 85%'; + var bgc = + 'linear-gradient(to left bottom, ' + + "hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 0%," + + "hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 100%)"; + + return ( + "
    " + + '
    ' + + '
    ' + + '
    ' + ); + } + + /** + * Render tree + * @param {Array} toc Array of TOC section links + * @param {String} tpl TPL list + * @return {String} Rendered tree + */ + function tree(toc, tpl) { + if ( tpl === void 0 ) tpl = ''; + + if (!toc || !toc.length) { + return ''; + } + + var innerHTML = ''; + toc.forEach(function (node) { + var title = node.title.replace(/(<([^>]+)>)/g, ''); + innerHTML += "
  • " + (node.title) + "
  • "; + if (node.children) { + innerHTML += tree(node.children, tpl); + } + }); + return tpl.replace('{inner}', innerHTML); + } + + function helper(className, content) { + return ("

    " + (content.slice(5).trim()) + "

    "); + } + + function theme(color) { + return (""); + } + + /** + * Gen toc tree + * @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81 + * @param {Array} toc List of TOC elements + * @param {Number} maxLevel Deep level + * @return {Array} Headlines + */ + function genTree(toc, maxLevel) { + var headlines = []; + var last = {}; + + toc.forEach(function (headline) { + var level = headline.level || 1; + var len = level - 1; + + if (level > maxLevel) { + return; + } + + if (last[len]) { + last[len].children = (last[len].children || []).concat(headline); + } else { + headlines.push(headline); + } + + last[level] = headline; + }); + + return headlines; + } + + var cache$1 = {}; + var re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g; + + function lower(string) { + return string.toLowerCase(); + } + + function slugify(str) { + if (typeof str !== 'string') { + return ''; + } + + var slug = str + .trim() + .replace(/[A-Z]+/g, lower) + .replace(/<[^>]+>/g, '') + .replace(re, '') + .replace(/\s/g, '-') + .replace(/-+/g, '-') + .replace(/^(\d)/, '_$1'); + var count = cache$1[slug]; + + count = hasOwn.call(cache$1, slug) ? count + 1 : 0; + cache$1[slug] = count; + + if (count) { + slug = slug + '-' + count; + } + + return slug; + } + + slugify.clear = function () { + cache$1 = {}; + }; + + /* eslint-disable */ + + // ============================================================================= + // DO NOT EDIT: This file is auto-generated by an /build/emoji.js + // ============================================================================= + + var emojiData = { + "baseURL": "https://github.githubassets.com/images/icons/emoji/", + "data": { + "100": "unicode/1f4af.png?v8", + "1234": "unicode/1f522.png?v8", + "+1": "unicode/1f44d.png?v8", + "-1": "unicode/1f44e.png?v8", + "1st_place_medal": "unicode/1f947.png?v8", + "2nd_place_medal": "unicode/1f948.png?v8", + "3rd_place_medal": "unicode/1f949.png?v8", + "8ball": "unicode/1f3b1.png?v8", + "a": "unicode/1f170.png?v8", + "ab": "unicode/1f18e.png?v8", + "abacus": "unicode/1f9ee.png?v8", + "abc": "unicode/1f524.png?v8", + "abcd": "unicode/1f521.png?v8", + "accept": "unicode/1f251.png?v8", + "accordion": "unicode/1fa97.png?v8", + "adhesive_bandage": "unicode/1fa79.png?v8", + "adult": "unicode/1f9d1.png?v8", + "aerial_tramway": "unicode/1f6a1.png?v8", + "afghanistan": "unicode/1f1e6-1f1eb.png?v8", + "airplane": "unicode/2708.png?v8", + "aland_islands": "unicode/1f1e6-1f1fd.png?v8", + "alarm_clock": "unicode/23f0.png?v8", + "albania": "unicode/1f1e6-1f1f1.png?v8", + "alembic": "unicode/2697.png?v8", + "algeria": "unicode/1f1e9-1f1ff.png?v8", + "alien": "unicode/1f47d.png?v8", + "ambulance": "unicode/1f691.png?v8", + "american_samoa": "unicode/1f1e6-1f1f8.png?v8", + "amphora": "unicode/1f3fa.png?v8", + "anatomical_heart": "unicode/1fac0.png?v8", + "anchor": "unicode/2693.png?v8", + "andorra": "unicode/1f1e6-1f1e9.png?v8", + "angel": "unicode/1f47c.png?v8", + "anger": "unicode/1f4a2.png?v8", + "angola": "unicode/1f1e6-1f1f4.png?v8", + "angry": "unicode/1f620.png?v8", + "anguilla": "unicode/1f1e6-1f1ee.png?v8", + "anguished": "unicode/1f627.png?v8", + "ant": "unicode/1f41c.png?v8", + "antarctica": "unicode/1f1e6-1f1f6.png?v8", + "antigua_barbuda": "unicode/1f1e6-1f1ec.png?v8", + "apple": "unicode/1f34e.png?v8", + "aquarius": "unicode/2652.png?v8", + "argentina": "unicode/1f1e6-1f1f7.png?v8", + "aries": "unicode/2648.png?v8", + "armenia": "unicode/1f1e6-1f1f2.png?v8", + "arrow_backward": "unicode/25c0.png?v8", + "arrow_double_down": "unicode/23ec.png?v8", + "arrow_double_up": "unicode/23eb.png?v8", + "arrow_down": "unicode/2b07.png?v8", + "arrow_down_small": "unicode/1f53d.png?v8", + "arrow_forward": "unicode/25b6.png?v8", + "arrow_heading_down": "unicode/2935.png?v8", + "arrow_heading_up": "unicode/2934.png?v8", + "arrow_left": "unicode/2b05.png?v8", + "arrow_lower_left": "unicode/2199.png?v8", + "arrow_lower_right": "unicode/2198.png?v8", + "arrow_right": "unicode/27a1.png?v8", + "arrow_right_hook": "unicode/21aa.png?v8", + "arrow_up": "unicode/2b06.png?v8", + "arrow_up_down": "unicode/2195.png?v8", + "arrow_up_small": "unicode/1f53c.png?v8", + "arrow_upper_left": "unicode/2196.png?v8", + "arrow_upper_right": "unicode/2197.png?v8", + "arrows_clockwise": "unicode/1f503.png?v8", + "arrows_counterclockwise": "unicode/1f504.png?v8", + "art": "unicode/1f3a8.png?v8", + "articulated_lorry": "unicode/1f69b.png?v8", + "artificial_satellite": "unicode/1f6f0.png?v8", + "artist": "unicode/1f9d1-1f3a8.png?v8", + "aruba": "unicode/1f1e6-1f1fc.png?v8", + "ascension_island": "unicode/1f1e6-1f1e8.png?v8", + "asterisk": "unicode/002a-20e3.png?v8", + "astonished": "unicode/1f632.png?v8", + "astronaut": "unicode/1f9d1-1f680.png?v8", + "athletic_shoe": "unicode/1f45f.png?v8", + "atm": "unicode/1f3e7.png?v8", + "atom": "atom.png?v8", + "atom_symbol": "unicode/269b.png?v8", + "australia": "unicode/1f1e6-1f1fa.png?v8", + "austria": "unicode/1f1e6-1f1f9.png?v8", + "auto_rickshaw": "unicode/1f6fa.png?v8", + "avocado": "unicode/1f951.png?v8", + "axe": "unicode/1fa93.png?v8", + "azerbaijan": "unicode/1f1e6-1f1ff.png?v8", + "b": "unicode/1f171.png?v8", + "baby": "unicode/1f476.png?v8", + "baby_bottle": "unicode/1f37c.png?v8", + "baby_chick": "unicode/1f424.png?v8", + "baby_symbol": "unicode/1f6bc.png?v8", + "back": "unicode/1f519.png?v8", + "bacon": "unicode/1f953.png?v8", + "badger": "unicode/1f9a1.png?v8", + "badminton": "unicode/1f3f8.png?v8", + "bagel": "unicode/1f96f.png?v8", + "baggage_claim": "unicode/1f6c4.png?v8", + "baguette_bread": "unicode/1f956.png?v8", + "bahamas": "unicode/1f1e7-1f1f8.png?v8", + "bahrain": "unicode/1f1e7-1f1ed.png?v8", + "balance_scale": "unicode/2696.png?v8", + "bald_man": "unicode/1f468-1f9b2.png?v8", + "bald_woman": "unicode/1f469-1f9b2.png?v8", + "ballet_shoes": "unicode/1fa70.png?v8", + "balloon": "unicode/1f388.png?v8", + "ballot_box": "unicode/1f5f3.png?v8", + "ballot_box_with_check": "unicode/2611.png?v8", + "bamboo": "unicode/1f38d.png?v8", + "banana": "unicode/1f34c.png?v8", + "bangbang": "unicode/203c.png?v8", + "bangladesh": "unicode/1f1e7-1f1e9.png?v8", + "banjo": "unicode/1fa95.png?v8", + "bank": "unicode/1f3e6.png?v8", + "bar_chart": "unicode/1f4ca.png?v8", + "barbados": "unicode/1f1e7-1f1e7.png?v8", + "barber": "unicode/1f488.png?v8", + "baseball": "unicode/26be.png?v8", + "basecamp": "basecamp.png?v8", + "basecampy": "basecampy.png?v8", + "basket": "unicode/1f9fa.png?v8", + "basketball": "unicode/1f3c0.png?v8", + "basketball_man": "unicode/26f9-2642.png?v8", + "basketball_woman": "unicode/26f9-2640.png?v8", + "bat": "unicode/1f987.png?v8", + "bath": "unicode/1f6c0.png?v8", + "bathtub": "unicode/1f6c1.png?v8", + "battery": "unicode/1f50b.png?v8", + "beach_umbrella": "unicode/1f3d6.png?v8", + "bear": "unicode/1f43b.png?v8", + "bearded_person": "unicode/1f9d4.png?v8", + "beaver": "unicode/1f9ab.png?v8", + "bed": "unicode/1f6cf.png?v8", + "bee": "unicode/1f41d.png?v8", + "beer": "unicode/1f37a.png?v8", + "beers": "unicode/1f37b.png?v8", + "beetle": "unicode/1fab2.png?v8", + "beginner": "unicode/1f530.png?v8", + "belarus": "unicode/1f1e7-1f1fe.png?v8", + "belgium": "unicode/1f1e7-1f1ea.png?v8", + "belize": "unicode/1f1e7-1f1ff.png?v8", + "bell": "unicode/1f514.png?v8", + "bell_pepper": "unicode/1fad1.png?v8", + "bellhop_bell": "unicode/1f6ce.png?v8", + "benin": "unicode/1f1e7-1f1ef.png?v8", + "bento": "unicode/1f371.png?v8", + "bermuda": "unicode/1f1e7-1f1f2.png?v8", + "beverage_box": "unicode/1f9c3.png?v8", + "bhutan": "unicode/1f1e7-1f1f9.png?v8", + "bicyclist": "unicode/1f6b4.png?v8", + "bike": "unicode/1f6b2.png?v8", + "biking_man": "unicode/1f6b4-2642.png?v8", + "biking_woman": "unicode/1f6b4-2640.png?v8", + "bikini": "unicode/1f459.png?v8", + "billed_cap": "unicode/1f9e2.png?v8", + "biohazard": "unicode/2623.png?v8", + "bird": "unicode/1f426.png?v8", + "birthday": "unicode/1f382.png?v8", + "bison": "unicode/1f9ac.png?v8", + "black_cat": "unicode/1f408-2b1b.png?v8", + "black_circle": "unicode/26ab.png?v8", + "black_flag": "unicode/1f3f4.png?v8", + "black_heart": "unicode/1f5a4.png?v8", + "black_joker": "unicode/1f0cf.png?v8", + "black_large_square": "unicode/2b1b.png?v8", + "black_medium_small_square": "unicode/25fe.png?v8", + "black_medium_square": "unicode/25fc.png?v8", + "black_nib": "unicode/2712.png?v8", + "black_small_square": "unicode/25aa.png?v8", + "black_square_button": "unicode/1f532.png?v8", + "blond_haired_man": "unicode/1f471-2642.png?v8", + "blond_haired_person": "unicode/1f471.png?v8", + "blond_haired_woman": "unicode/1f471-2640.png?v8", + "blonde_woman": "unicode/1f471-2640.png?v8", + "blossom": "unicode/1f33c.png?v8", + "blowfish": "unicode/1f421.png?v8", + "blue_book": "unicode/1f4d8.png?v8", + "blue_car": "unicode/1f699.png?v8", + "blue_heart": "unicode/1f499.png?v8", + "blue_square": "unicode/1f7e6.png?v8", + "blueberries": "unicode/1fad0.png?v8", + "blush": "unicode/1f60a.png?v8", + "boar": "unicode/1f417.png?v8", + "boat": "unicode/26f5.png?v8", + "bolivia": "unicode/1f1e7-1f1f4.png?v8", + "bomb": "unicode/1f4a3.png?v8", + "bone": "unicode/1f9b4.png?v8", + "book": "unicode/1f4d6.png?v8", + "bookmark": "unicode/1f516.png?v8", + "bookmark_tabs": "unicode/1f4d1.png?v8", + "books": "unicode/1f4da.png?v8", + "boom": "unicode/1f4a5.png?v8", + "boomerang": "unicode/1fa83.png?v8", + "boot": "unicode/1f462.png?v8", + "bosnia_herzegovina": "unicode/1f1e7-1f1e6.png?v8", + "botswana": "unicode/1f1e7-1f1fc.png?v8", + "bouncing_ball_man": "unicode/26f9-2642.png?v8", + "bouncing_ball_person": "unicode/26f9.png?v8", + "bouncing_ball_woman": "unicode/26f9-2640.png?v8", + "bouquet": "unicode/1f490.png?v8", + "bouvet_island": "unicode/1f1e7-1f1fb.png?v8", + "bow": "unicode/1f647.png?v8", + "bow_and_arrow": "unicode/1f3f9.png?v8", + "bowing_man": "unicode/1f647-2642.png?v8", + "bowing_woman": "unicode/1f647-2640.png?v8", + "bowl_with_spoon": "unicode/1f963.png?v8", + "bowling": "unicode/1f3b3.png?v8", + "bowtie": "bowtie.png?v8", + "boxing_glove": "unicode/1f94a.png?v8", + "boy": "unicode/1f466.png?v8", + "brain": "unicode/1f9e0.png?v8", + "brazil": "unicode/1f1e7-1f1f7.png?v8", + "bread": "unicode/1f35e.png?v8", + "breast_feeding": "unicode/1f931.png?v8", + "bricks": "unicode/1f9f1.png?v8", + "bride_with_veil": "unicode/1f470-2640.png?v8", + "bridge_at_night": "unicode/1f309.png?v8", + "briefcase": "unicode/1f4bc.png?v8", + "british_indian_ocean_territory": "unicode/1f1ee-1f1f4.png?v8", + "british_virgin_islands": "unicode/1f1fb-1f1ec.png?v8", + "broccoli": "unicode/1f966.png?v8", + "broken_heart": "unicode/1f494.png?v8", + "broom": "unicode/1f9f9.png?v8", + "brown_circle": "unicode/1f7e4.png?v8", + "brown_heart": "unicode/1f90e.png?v8", + "brown_square": "unicode/1f7eb.png?v8", + "brunei": "unicode/1f1e7-1f1f3.png?v8", + "bubble_tea": "unicode/1f9cb.png?v8", + "bucket": "unicode/1faa3.png?v8", + "bug": "unicode/1f41b.png?v8", + "building_construction": "unicode/1f3d7.png?v8", + "bulb": "unicode/1f4a1.png?v8", + "bulgaria": "unicode/1f1e7-1f1ec.png?v8", + "bullettrain_front": "unicode/1f685.png?v8", + "bullettrain_side": "unicode/1f684.png?v8", + "burkina_faso": "unicode/1f1e7-1f1eb.png?v8", + "burrito": "unicode/1f32f.png?v8", + "burundi": "unicode/1f1e7-1f1ee.png?v8", + "bus": "unicode/1f68c.png?v8", + "business_suit_levitating": "unicode/1f574.png?v8", + "busstop": "unicode/1f68f.png?v8", + "bust_in_silhouette": "unicode/1f464.png?v8", + "busts_in_silhouette": "unicode/1f465.png?v8", + "butter": "unicode/1f9c8.png?v8", + "butterfly": "unicode/1f98b.png?v8", + "cactus": "unicode/1f335.png?v8", + "cake": "unicode/1f370.png?v8", + "calendar": "unicode/1f4c6.png?v8", + "call_me_hand": "unicode/1f919.png?v8", + "calling": "unicode/1f4f2.png?v8", + "cambodia": "unicode/1f1f0-1f1ed.png?v8", + "camel": "unicode/1f42b.png?v8", + "camera": "unicode/1f4f7.png?v8", + "camera_flash": "unicode/1f4f8.png?v8", + "cameroon": "unicode/1f1e8-1f1f2.png?v8", + "camping": "unicode/1f3d5.png?v8", + "canada": "unicode/1f1e8-1f1e6.png?v8", + "canary_islands": "unicode/1f1ee-1f1e8.png?v8", + "cancer": "unicode/264b.png?v8", + "candle": "unicode/1f56f.png?v8", + "candy": "unicode/1f36c.png?v8", + "canned_food": "unicode/1f96b.png?v8", + "canoe": "unicode/1f6f6.png?v8", + "cape_verde": "unicode/1f1e8-1f1fb.png?v8", + "capital_abcd": "unicode/1f520.png?v8", + "capricorn": "unicode/2651.png?v8", + "car": "unicode/1f697.png?v8", + "card_file_box": "unicode/1f5c3.png?v8", + "card_index": "unicode/1f4c7.png?v8", + "card_index_dividers": "unicode/1f5c2.png?v8", + "caribbean_netherlands": "unicode/1f1e7-1f1f6.png?v8", + "carousel_horse": "unicode/1f3a0.png?v8", + "carpentry_saw": "unicode/1fa9a.png?v8", + "carrot": "unicode/1f955.png?v8", + "cartwheeling": "unicode/1f938.png?v8", + "cat": "unicode/1f431.png?v8", + "cat2": "unicode/1f408.png?v8", + "cayman_islands": "unicode/1f1f0-1f1fe.png?v8", + "cd": "unicode/1f4bf.png?v8", + "central_african_republic": "unicode/1f1e8-1f1eb.png?v8", + "ceuta_melilla": "unicode/1f1ea-1f1e6.png?v8", + "chad": "unicode/1f1f9-1f1e9.png?v8", + "chains": "unicode/26d3.png?v8", + "chair": "unicode/1fa91.png?v8", + "champagne": "unicode/1f37e.png?v8", + "chart": "unicode/1f4b9.png?v8", + "chart_with_downwards_trend": "unicode/1f4c9.png?v8", + "chart_with_upwards_trend": "unicode/1f4c8.png?v8", + "checkered_flag": "unicode/1f3c1.png?v8", + "cheese": "unicode/1f9c0.png?v8", + "cherries": "unicode/1f352.png?v8", + "cherry_blossom": "unicode/1f338.png?v8", + "chess_pawn": "unicode/265f.png?v8", + "chestnut": "unicode/1f330.png?v8", + "chicken": "unicode/1f414.png?v8", + "child": "unicode/1f9d2.png?v8", + "children_crossing": "unicode/1f6b8.png?v8", + "chile": "unicode/1f1e8-1f1f1.png?v8", + "chipmunk": "unicode/1f43f.png?v8", + "chocolate_bar": "unicode/1f36b.png?v8", + "chopsticks": "unicode/1f962.png?v8", + "christmas_island": "unicode/1f1e8-1f1fd.png?v8", + "christmas_tree": "unicode/1f384.png?v8", + "church": "unicode/26ea.png?v8", + "cinema": "unicode/1f3a6.png?v8", + "circus_tent": "unicode/1f3aa.png?v8", + "city_sunrise": "unicode/1f307.png?v8", + "city_sunset": "unicode/1f306.png?v8", + "cityscape": "unicode/1f3d9.png?v8", + "cl": "unicode/1f191.png?v8", + "clamp": "unicode/1f5dc.png?v8", + "clap": "unicode/1f44f.png?v8", + "clapper": "unicode/1f3ac.png?v8", + "classical_building": "unicode/1f3db.png?v8", + "climbing": "unicode/1f9d7.png?v8", + "climbing_man": "unicode/1f9d7-2642.png?v8", + "climbing_woman": "unicode/1f9d7-2640.png?v8", + "clinking_glasses": "unicode/1f942.png?v8", + "clipboard": "unicode/1f4cb.png?v8", + "clipperton_island": "unicode/1f1e8-1f1f5.png?v8", + "clock1": "unicode/1f550.png?v8", + "clock10": "unicode/1f559.png?v8", + "clock1030": "unicode/1f565.png?v8", + "clock11": "unicode/1f55a.png?v8", + "clock1130": "unicode/1f566.png?v8", + "clock12": "unicode/1f55b.png?v8", + "clock1230": "unicode/1f567.png?v8", + "clock130": "unicode/1f55c.png?v8", + "clock2": "unicode/1f551.png?v8", + "clock230": "unicode/1f55d.png?v8", + "clock3": "unicode/1f552.png?v8", + "clock330": "unicode/1f55e.png?v8", + "clock4": "unicode/1f553.png?v8", + "clock430": "unicode/1f55f.png?v8", + "clock5": "unicode/1f554.png?v8", + "clock530": "unicode/1f560.png?v8", + "clock6": "unicode/1f555.png?v8", + "clock630": "unicode/1f561.png?v8", + "clock7": "unicode/1f556.png?v8", + "clock730": "unicode/1f562.png?v8", + "clock8": "unicode/1f557.png?v8", + "clock830": "unicode/1f563.png?v8", + "clock9": "unicode/1f558.png?v8", + "clock930": "unicode/1f564.png?v8", + "closed_book": "unicode/1f4d5.png?v8", + "closed_lock_with_key": "unicode/1f510.png?v8", + "closed_umbrella": "unicode/1f302.png?v8", + "cloud": "unicode/2601.png?v8", + "cloud_with_lightning": "unicode/1f329.png?v8", + "cloud_with_lightning_and_rain": "unicode/26c8.png?v8", + "cloud_with_rain": "unicode/1f327.png?v8", + "cloud_with_snow": "unicode/1f328.png?v8", + "clown_face": "unicode/1f921.png?v8", + "clubs": "unicode/2663.png?v8", + "cn": "unicode/1f1e8-1f1f3.png?v8", + "coat": "unicode/1f9e5.png?v8", + "cockroach": "unicode/1fab3.png?v8", + "cocktail": "unicode/1f378.png?v8", + "coconut": "unicode/1f965.png?v8", + "cocos_islands": "unicode/1f1e8-1f1e8.png?v8", + "coffee": "unicode/2615.png?v8", + "coffin": "unicode/26b0.png?v8", + "coin": "unicode/1fa99.png?v8", + "cold_face": "unicode/1f976.png?v8", + "cold_sweat": "unicode/1f630.png?v8", + "collision": "unicode/1f4a5.png?v8", + "colombia": "unicode/1f1e8-1f1f4.png?v8", + "comet": "unicode/2604.png?v8", + "comoros": "unicode/1f1f0-1f1f2.png?v8", + "compass": "unicode/1f9ed.png?v8", + "computer": "unicode/1f4bb.png?v8", + "computer_mouse": "unicode/1f5b1.png?v8", + "confetti_ball": "unicode/1f38a.png?v8", + "confounded": "unicode/1f616.png?v8", + "confused": "unicode/1f615.png?v8", + "congo_brazzaville": "unicode/1f1e8-1f1ec.png?v8", + "congo_kinshasa": "unicode/1f1e8-1f1e9.png?v8", + "congratulations": "unicode/3297.png?v8", + "construction": "unicode/1f6a7.png?v8", + "construction_worker": "unicode/1f477.png?v8", + "construction_worker_man": "unicode/1f477-2642.png?v8", + "construction_worker_woman": "unicode/1f477-2640.png?v8", + "control_knobs": "unicode/1f39b.png?v8", + "convenience_store": "unicode/1f3ea.png?v8", + "cook": "unicode/1f9d1-1f373.png?v8", + "cook_islands": "unicode/1f1e8-1f1f0.png?v8", + "cookie": "unicode/1f36a.png?v8", + "cool": "unicode/1f192.png?v8", + "cop": "unicode/1f46e.png?v8", + "copyright": "unicode/00a9.png?v8", + "corn": "unicode/1f33d.png?v8", + "costa_rica": "unicode/1f1e8-1f1f7.png?v8", + "cote_divoire": "unicode/1f1e8-1f1ee.png?v8", + "couch_and_lamp": "unicode/1f6cb.png?v8", + "couple": "unicode/1f46b.png?v8", + "couple_with_heart": "unicode/1f491.png?v8", + "couple_with_heart_man_man": "unicode/1f468-2764-1f468.png?v8", + "couple_with_heart_woman_man": "unicode/1f469-2764-1f468.png?v8", + "couple_with_heart_woman_woman": "unicode/1f469-2764-1f469.png?v8", + "couplekiss": "unicode/1f48f.png?v8", + "couplekiss_man_man": "unicode/1f468-2764-1f48b-1f468.png?v8", + "couplekiss_man_woman": "unicode/1f469-2764-1f48b-1f468.png?v8", + "couplekiss_woman_woman": "unicode/1f469-2764-1f48b-1f469.png?v8", + "cow": "unicode/1f42e.png?v8", + "cow2": "unicode/1f404.png?v8", + "cowboy_hat_face": "unicode/1f920.png?v8", + "crab": "unicode/1f980.png?v8", + "crayon": "unicode/1f58d.png?v8", + "credit_card": "unicode/1f4b3.png?v8", + "crescent_moon": "unicode/1f319.png?v8", + "cricket": "unicode/1f997.png?v8", + "cricket_game": "unicode/1f3cf.png?v8", + "croatia": "unicode/1f1ed-1f1f7.png?v8", + "crocodile": "unicode/1f40a.png?v8", + "croissant": "unicode/1f950.png?v8", + "crossed_fingers": "unicode/1f91e.png?v8", + "crossed_flags": "unicode/1f38c.png?v8", + "crossed_swords": "unicode/2694.png?v8", + "crown": "unicode/1f451.png?v8", + "cry": "unicode/1f622.png?v8", + "crying_cat_face": "unicode/1f63f.png?v8", + "crystal_ball": "unicode/1f52e.png?v8", + "cuba": "unicode/1f1e8-1f1fa.png?v8", + "cucumber": "unicode/1f952.png?v8", + "cup_with_straw": "unicode/1f964.png?v8", + "cupcake": "unicode/1f9c1.png?v8", + "cupid": "unicode/1f498.png?v8", + "curacao": "unicode/1f1e8-1f1fc.png?v8", + "curling_stone": "unicode/1f94c.png?v8", + "curly_haired_man": "unicode/1f468-1f9b1.png?v8", + "curly_haired_woman": "unicode/1f469-1f9b1.png?v8", + "curly_loop": "unicode/27b0.png?v8", + "currency_exchange": "unicode/1f4b1.png?v8", + "curry": "unicode/1f35b.png?v8", + "cursing_face": "unicode/1f92c.png?v8", + "custard": "unicode/1f36e.png?v8", + "customs": "unicode/1f6c3.png?v8", + "cut_of_meat": "unicode/1f969.png?v8", + "cyclone": "unicode/1f300.png?v8", + "cyprus": "unicode/1f1e8-1f1fe.png?v8", + "czech_republic": "unicode/1f1e8-1f1ff.png?v8", + "dagger": "unicode/1f5e1.png?v8", + "dancer": "unicode/1f483.png?v8", + "dancers": "unicode/1f46f.png?v8", + "dancing_men": "unicode/1f46f-2642.png?v8", + "dancing_women": "unicode/1f46f-2640.png?v8", + "dango": "unicode/1f361.png?v8", + "dark_sunglasses": "unicode/1f576.png?v8", + "dart": "unicode/1f3af.png?v8", + "dash": "unicode/1f4a8.png?v8", + "date": "unicode/1f4c5.png?v8", + "de": "unicode/1f1e9-1f1ea.png?v8", + "deaf_man": "unicode/1f9cf-2642.png?v8", + "deaf_person": "unicode/1f9cf.png?v8", + "deaf_woman": "unicode/1f9cf-2640.png?v8", + "deciduous_tree": "unicode/1f333.png?v8", + "deer": "unicode/1f98c.png?v8", + "denmark": "unicode/1f1e9-1f1f0.png?v8", + "department_store": "unicode/1f3ec.png?v8", + "derelict_house": "unicode/1f3da.png?v8", + "desert": "unicode/1f3dc.png?v8", + "desert_island": "unicode/1f3dd.png?v8", + "desktop_computer": "unicode/1f5a5.png?v8", + "detective": "unicode/1f575.png?v8", + "diamond_shape_with_a_dot_inside": "unicode/1f4a0.png?v8", + "diamonds": "unicode/2666.png?v8", + "diego_garcia": "unicode/1f1e9-1f1ec.png?v8", + "disappointed": "unicode/1f61e.png?v8", + "disappointed_relieved": "unicode/1f625.png?v8", + "disguised_face": "unicode/1f978.png?v8", + "diving_mask": "unicode/1f93f.png?v8", + "diya_lamp": "unicode/1fa94.png?v8", + "dizzy": "unicode/1f4ab.png?v8", + "dizzy_face": "unicode/1f635.png?v8", + "djibouti": "unicode/1f1e9-1f1ef.png?v8", + "dna": "unicode/1f9ec.png?v8", + "do_not_litter": "unicode/1f6af.png?v8", + "dodo": "unicode/1f9a4.png?v8", + "dog": "unicode/1f436.png?v8", + "dog2": "unicode/1f415.png?v8", + "dollar": "unicode/1f4b5.png?v8", + "dolls": "unicode/1f38e.png?v8", + "dolphin": "unicode/1f42c.png?v8", + "dominica": "unicode/1f1e9-1f1f2.png?v8", + "dominican_republic": "unicode/1f1e9-1f1f4.png?v8", + "door": "unicode/1f6aa.png?v8", + "doughnut": "unicode/1f369.png?v8", + "dove": "unicode/1f54a.png?v8", + "dragon": "unicode/1f409.png?v8", + "dragon_face": "unicode/1f432.png?v8", + "dress": "unicode/1f457.png?v8", + "dromedary_camel": "unicode/1f42a.png?v8", + "drooling_face": "unicode/1f924.png?v8", + "drop_of_blood": "unicode/1fa78.png?v8", + "droplet": "unicode/1f4a7.png?v8", + "drum": "unicode/1f941.png?v8", + "duck": "unicode/1f986.png?v8", + "dumpling": "unicode/1f95f.png?v8", + "dvd": "unicode/1f4c0.png?v8", + "e-mail": "unicode/1f4e7.png?v8", + "eagle": "unicode/1f985.png?v8", + "ear": "unicode/1f442.png?v8", + "ear_of_rice": "unicode/1f33e.png?v8", + "ear_with_hearing_aid": "unicode/1f9bb.png?v8", + "earth_africa": "unicode/1f30d.png?v8", + "earth_americas": "unicode/1f30e.png?v8", + "earth_asia": "unicode/1f30f.png?v8", + "ecuador": "unicode/1f1ea-1f1e8.png?v8", + "egg": "unicode/1f95a.png?v8", + "eggplant": "unicode/1f346.png?v8", + "egypt": "unicode/1f1ea-1f1ec.png?v8", + "eight": "unicode/0038-20e3.png?v8", + "eight_pointed_black_star": "unicode/2734.png?v8", + "eight_spoked_asterisk": "unicode/2733.png?v8", + "eject_button": "unicode/23cf.png?v8", + "el_salvador": "unicode/1f1f8-1f1fb.png?v8", + "electric_plug": "unicode/1f50c.png?v8", + "electron": "electron.png?v8", + "elephant": "unicode/1f418.png?v8", + "elevator": "unicode/1f6d7.png?v8", + "elf": "unicode/1f9dd.png?v8", + "elf_man": "unicode/1f9dd-2642.png?v8", + "elf_woman": "unicode/1f9dd-2640.png?v8", + "email": "unicode/1f4e7.png?v8", + "end": "unicode/1f51a.png?v8", + "england": "unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8", + "envelope": "unicode/2709.png?v8", + "envelope_with_arrow": "unicode/1f4e9.png?v8", + "equatorial_guinea": "unicode/1f1ec-1f1f6.png?v8", + "eritrea": "unicode/1f1ea-1f1f7.png?v8", + "es": "unicode/1f1ea-1f1f8.png?v8", + "estonia": "unicode/1f1ea-1f1ea.png?v8", + "ethiopia": "unicode/1f1ea-1f1f9.png?v8", + "eu": "unicode/1f1ea-1f1fa.png?v8", + "euro": "unicode/1f4b6.png?v8", + "european_castle": "unicode/1f3f0.png?v8", + "european_post_office": "unicode/1f3e4.png?v8", + "european_union": "unicode/1f1ea-1f1fa.png?v8", + "evergreen_tree": "unicode/1f332.png?v8", + "exclamation": "unicode/2757.png?v8", + "exploding_head": "unicode/1f92f.png?v8", + "expressionless": "unicode/1f611.png?v8", + "eye": "unicode/1f441.png?v8", + "eye_speech_bubble": "unicode/1f441-1f5e8.png?v8", + "eyeglasses": "unicode/1f453.png?v8", + "eyes": "unicode/1f440.png?v8", + "face_exhaling": "unicode/1f62e-1f4a8.png?v8", + "face_in_clouds": "unicode/1f636-1f32b.png?v8", + "face_with_head_bandage": "unicode/1f915.png?v8", + "face_with_spiral_eyes": "unicode/1f635-1f4ab.png?v8", + "face_with_thermometer": "unicode/1f912.png?v8", + "facepalm": "unicode/1f926.png?v8", + "facepunch": "unicode/1f44a.png?v8", + "factory": "unicode/1f3ed.png?v8", + "factory_worker": "unicode/1f9d1-1f3ed.png?v8", + "fairy": "unicode/1f9da.png?v8", + "fairy_man": "unicode/1f9da-2642.png?v8", + "fairy_woman": "unicode/1f9da-2640.png?v8", + "falafel": "unicode/1f9c6.png?v8", + "falkland_islands": "unicode/1f1eb-1f1f0.png?v8", + "fallen_leaf": "unicode/1f342.png?v8", + "family": "unicode/1f46a.png?v8", + "family_man_boy": "unicode/1f468-1f466.png?v8", + "family_man_boy_boy": "unicode/1f468-1f466-1f466.png?v8", + "family_man_girl": "unicode/1f468-1f467.png?v8", + "family_man_girl_boy": "unicode/1f468-1f467-1f466.png?v8", + "family_man_girl_girl": "unicode/1f468-1f467-1f467.png?v8", + "family_man_man_boy": "unicode/1f468-1f468-1f466.png?v8", + "family_man_man_boy_boy": "unicode/1f468-1f468-1f466-1f466.png?v8", + "family_man_man_girl": "unicode/1f468-1f468-1f467.png?v8", + "family_man_man_girl_boy": "unicode/1f468-1f468-1f467-1f466.png?v8", + "family_man_man_girl_girl": "unicode/1f468-1f468-1f467-1f467.png?v8", + "family_man_woman_boy": "unicode/1f468-1f469-1f466.png?v8", + "family_man_woman_boy_boy": "unicode/1f468-1f469-1f466-1f466.png?v8", + "family_man_woman_girl": "unicode/1f468-1f469-1f467.png?v8", + "family_man_woman_girl_boy": "unicode/1f468-1f469-1f467-1f466.png?v8", + "family_man_woman_girl_girl": "unicode/1f468-1f469-1f467-1f467.png?v8", + "family_woman_boy": "unicode/1f469-1f466.png?v8", + "family_woman_boy_boy": "unicode/1f469-1f466-1f466.png?v8", + "family_woman_girl": "unicode/1f469-1f467.png?v8", + "family_woman_girl_boy": "unicode/1f469-1f467-1f466.png?v8", + "family_woman_girl_girl": "unicode/1f469-1f467-1f467.png?v8", + "family_woman_woman_boy": "unicode/1f469-1f469-1f466.png?v8", + "family_woman_woman_boy_boy": "unicode/1f469-1f469-1f466-1f466.png?v8", + "family_woman_woman_girl": "unicode/1f469-1f469-1f467.png?v8", + "family_woman_woman_girl_boy": "unicode/1f469-1f469-1f467-1f466.png?v8", + "family_woman_woman_girl_girl": "unicode/1f469-1f469-1f467-1f467.png?v8", + "farmer": "unicode/1f9d1-1f33e.png?v8", + "faroe_islands": "unicode/1f1eb-1f1f4.png?v8", + "fast_forward": "unicode/23e9.png?v8", + "fax": "unicode/1f4e0.png?v8", + "fearful": "unicode/1f628.png?v8", + "feather": "unicode/1fab6.png?v8", + "feelsgood": "feelsgood.png?v8", + "feet": "unicode/1f43e.png?v8", + "female_detective": "unicode/1f575-2640.png?v8", + "female_sign": "unicode/2640.png?v8", + "ferris_wheel": "unicode/1f3a1.png?v8", + "ferry": "unicode/26f4.png?v8", + "field_hockey": "unicode/1f3d1.png?v8", + "fiji": "unicode/1f1eb-1f1ef.png?v8", + "file_cabinet": "unicode/1f5c4.png?v8", + "file_folder": "unicode/1f4c1.png?v8", + "film_projector": "unicode/1f4fd.png?v8", + "film_strip": "unicode/1f39e.png?v8", + "finland": "unicode/1f1eb-1f1ee.png?v8", + "finnadie": "finnadie.png?v8", + "fire": "unicode/1f525.png?v8", + "fire_engine": "unicode/1f692.png?v8", + "fire_extinguisher": "unicode/1f9ef.png?v8", + "firecracker": "unicode/1f9e8.png?v8", + "firefighter": "unicode/1f9d1-1f692.png?v8", + "fireworks": "unicode/1f386.png?v8", + "first_quarter_moon": "unicode/1f313.png?v8", + "first_quarter_moon_with_face": "unicode/1f31b.png?v8", + "fish": "unicode/1f41f.png?v8", + "fish_cake": "unicode/1f365.png?v8", + "fishing_pole_and_fish": "unicode/1f3a3.png?v8", + "fist": "unicode/270a.png?v8", + "fist_left": "unicode/1f91b.png?v8", + "fist_oncoming": "unicode/1f44a.png?v8", + "fist_raised": "unicode/270a.png?v8", + "fist_right": "unicode/1f91c.png?v8", + "five": "unicode/0035-20e3.png?v8", + "flags": "unicode/1f38f.png?v8", + "flamingo": "unicode/1f9a9.png?v8", + "flashlight": "unicode/1f526.png?v8", + "flat_shoe": "unicode/1f97f.png?v8", + "flatbread": "unicode/1fad3.png?v8", + "fleur_de_lis": "unicode/269c.png?v8", + "flight_arrival": "unicode/1f6ec.png?v8", + "flight_departure": "unicode/1f6eb.png?v8", + "flipper": "unicode/1f42c.png?v8", + "floppy_disk": "unicode/1f4be.png?v8", + "flower_playing_cards": "unicode/1f3b4.png?v8", + "flushed": "unicode/1f633.png?v8", + "fly": "unicode/1fab0.png?v8", + "flying_disc": "unicode/1f94f.png?v8", + "flying_saucer": "unicode/1f6f8.png?v8", + "fog": "unicode/1f32b.png?v8", + "foggy": "unicode/1f301.png?v8", + "fondue": "unicode/1fad5.png?v8", + "foot": "unicode/1f9b6.png?v8", + "football": "unicode/1f3c8.png?v8", + "footprints": "unicode/1f463.png?v8", + "fork_and_knife": "unicode/1f374.png?v8", + "fortune_cookie": "unicode/1f960.png?v8", + "fountain": "unicode/26f2.png?v8", + "fountain_pen": "unicode/1f58b.png?v8", + "four": "unicode/0034-20e3.png?v8", + "four_leaf_clover": "unicode/1f340.png?v8", + "fox_face": "unicode/1f98a.png?v8", + "fr": "unicode/1f1eb-1f1f7.png?v8", + "framed_picture": "unicode/1f5bc.png?v8", + "free": "unicode/1f193.png?v8", + "french_guiana": "unicode/1f1ec-1f1eb.png?v8", + "french_polynesia": "unicode/1f1f5-1f1eb.png?v8", + "french_southern_territories": "unicode/1f1f9-1f1eb.png?v8", + "fried_egg": "unicode/1f373.png?v8", + "fried_shrimp": "unicode/1f364.png?v8", + "fries": "unicode/1f35f.png?v8", + "frog": "unicode/1f438.png?v8", + "frowning": "unicode/1f626.png?v8", + "frowning_face": "unicode/2639.png?v8", + "frowning_man": "unicode/1f64d-2642.png?v8", + "frowning_person": "unicode/1f64d.png?v8", + "frowning_woman": "unicode/1f64d-2640.png?v8", + "fu": "unicode/1f595.png?v8", + "fuelpump": "unicode/26fd.png?v8", + "full_moon": "unicode/1f315.png?v8", + "full_moon_with_face": "unicode/1f31d.png?v8", + "funeral_urn": "unicode/26b1.png?v8", + "gabon": "unicode/1f1ec-1f1e6.png?v8", + "gambia": "unicode/1f1ec-1f1f2.png?v8", + "game_die": "unicode/1f3b2.png?v8", + "garlic": "unicode/1f9c4.png?v8", + "gb": "unicode/1f1ec-1f1e7.png?v8", + "gear": "unicode/2699.png?v8", + "gem": "unicode/1f48e.png?v8", + "gemini": "unicode/264a.png?v8", + "genie": "unicode/1f9de.png?v8", + "genie_man": "unicode/1f9de-2642.png?v8", + "genie_woman": "unicode/1f9de-2640.png?v8", + "georgia": "unicode/1f1ec-1f1ea.png?v8", + "ghana": "unicode/1f1ec-1f1ed.png?v8", + "ghost": "unicode/1f47b.png?v8", + "gibraltar": "unicode/1f1ec-1f1ee.png?v8", + "gift": "unicode/1f381.png?v8", + "gift_heart": "unicode/1f49d.png?v8", + "giraffe": "unicode/1f992.png?v8", + "girl": "unicode/1f467.png?v8", + "globe_with_meridians": "unicode/1f310.png?v8", + "gloves": "unicode/1f9e4.png?v8", + "goal_net": "unicode/1f945.png?v8", + "goat": "unicode/1f410.png?v8", + "goberserk": "goberserk.png?v8", + "godmode": "godmode.png?v8", + "goggles": "unicode/1f97d.png?v8", + "golf": "unicode/26f3.png?v8", + "golfing": "unicode/1f3cc.png?v8", + "golfing_man": "unicode/1f3cc-2642.png?v8", + "golfing_woman": "unicode/1f3cc-2640.png?v8", + "gorilla": "unicode/1f98d.png?v8", + "grapes": "unicode/1f347.png?v8", + "greece": "unicode/1f1ec-1f1f7.png?v8", + "green_apple": "unicode/1f34f.png?v8", + "green_book": "unicode/1f4d7.png?v8", + "green_circle": "unicode/1f7e2.png?v8", + "green_heart": "unicode/1f49a.png?v8", + "green_salad": "unicode/1f957.png?v8", + "green_square": "unicode/1f7e9.png?v8", + "greenland": "unicode/1f1ec-1f1f1.png?v8", + "grenada": "unicode/1f1ec-1f1e9.png?v8", + "grey_exclamation": "unicode/2755.png?v8", + "grey_question": "unicode/2754.png?v8", + "grimacing": "unicode/1f62c.png?v8", + "grin": "unicode/1f601.png?v8", + "grinning": "unicode/1f600.png?v8", + "guadeloupe": "unicode/1f1ec-1f1f5.png?v8", + "guam": "unicode/1f1ec-1f1fa.png?v8", + "guard": "unicode/1f482.png?v8", + "guardsman": "unicode/1f482-2642.png?v8", + "guardswoman": "unicode/1f482-2640.png?v8", + "guatemala": "unicode/1f1ec-1f1f9.png?v8", + "guernsey": "unicode/1f1ec-1f1ec.png?v8", + "guide_dog": "unicode/1f9ae.png?v8", + "guinea": "unicode/1f1ec-1f1f3.png?v8", + "guinea_bissau": "unicode/1f1ec-1f1fc.png?v8", + "guitar": "unicode/1f3b8.png?v8", + "gun": "unicode/1f52b.png?v8", + "guyana": "unicode/1f1ec-1f1fe.png?v8", + "haircut": "unicode/1f487.png?v8", + "haircut_man": "unicode/1f487-2642.png?v8", + "haircut_woman": "unicode/1f487-2640.png?v8", + "haiti": "unicode/1f1ed-1f1f9.png?v8", + "hamburger": "unicode/1f354.png?v8", + "hammer": "unicode/1f528.png?v8", + "hammer_and_pick": "unicode/2692.png?v8", + "hammer_and_wrench": "unicode/1f6e0.png?v8", + "hamster": "unicode/1f439.png?v8", + "hand": "unicode/270b.png?v8", + "hand_over_mouth": "unicode/1f92d.png?v8", + "handbag": "unicode/1f45c.png?v8", + "handball_person": "unicode/1f93e.png?v8", + "handshake": "unicode/1f91d.png?v8", + "hankey": "unicode/1f4a9.png?v8", + "hash": "unicode/0023-20e3.png?v8", + "hatched_chick": "unicode/1f425.png?v8", + "hatching_chick": "unicode/1f423.png?v8", + "headphones": "unicode/1f3a7.png?v8", + "headstone": "unicode/1faa6.png?v8", + "health_worker": "unicode/1f9d1-2695.png?v8", + "hear_no_evil": "unicode/1f649.png?v8", + "heard_mcdonald_islands": "unicode/1f1ed-1f1f2.png?v8", + "heart": "unicode/2764.png?v8", + "heart_decoration": "unicode/1f49f.png?v8", + "heart_eyes": "unicode/1f60d.png?v8", + "heart_eyes_cat": "unicode/1f63b.png?v8", + "heart_on_fire": "unicode/2764-1f525.png?v8", + "heartbeat": "unicode/1f493.png?v8", + "heartpulse": "unicode/1f497.png?v8", + "hearts": "unicode/2665.png?v8", + "heavy_check_mark": "unicode/2714.png?v8", + "heavy_division_sign": "unicode/2797.png?v8", + "heavy_dollar_sign": "unicode/1f4b2.png?v8", + "heavy_exclamation_mark": "unicode/2757.png?v8", + "heavy_heart_exclamation": "unicode/2763.png?v8", + "heavy_minus_sign": "unicode/2796.png?v8", + "heavy_multiplication_x": "unicode/2716.png?v8", + "heavy_plus_sign": "unicode/2795.png?v8", + "hedgehog": "unicode/1f994.png?v8", + "helicopter": "unicode/1f681.png?v8", + "herb": "unicode/1f33f.png?v8", + "hibiscus": "unicode/1f33a.png?v8", + "high_brightness": "unicode/1f506.png?v8", + "high_heel": "unicode/1f460.png?v8", + "hiking_boot": "unicode/1f97e.png?v8", + "hindu_temple": "unicode/1f6d5.png?v8", + "hippopotamus": "unicode/1f99b.png?v8", + "hocho": "unicode/1f52a.png?v8", + "hole": "unicode/1f573.png?v8", + "honduras": "unicode/1f1ed-1f1f3.png?v8", + "honey_pot": "unicode/1f36f.png?v8", + "honeybee": "unicode/1f41d.png?v8", + "hong_kong": "unicode/1f1ed-1f1f0.png?v8", + "hook": "unicode/1fa9d.png?v8", + "horse": "unicode/1f434.png?v8", + "horse_racing": "unicode/1f3c7.png?v8", + "hospital": "unicode/1f3e5.png?v8", + "hot_face": "unicode/1f975.png?v8", + "hot_pepper": "unicode/1f336.png?v8", + "hotdog": "unicode/1f32d.png?v8", + "hotel": "unicode/1f3e8.png?v8", + "hotsprings": "unicode/2668.png?v8", + "hourglass": "unicode/231b.png?v8", + "hourglass_flowing_sand": "unicode/23f3.png?v8", + "house": "unicode/1f3e0.png?v8", + "house_with_garden": "unicode/1f3e1.png?v8", + "houses": "unicode/1f3d8.png?v8", + "hugs": "unicode/1f917.png?v8", + "hungary": "unicode/1f1ed-1f1fa.png?v8", + "hurtrealbad": "hurtrealbad.png?v8", + "hushed": "unicode/1f62f.png?v8", + "hut": "unicode/1f6d6.png?v8", + "ice_cream": "unicode/1f368.png?v8", + "ice_cube": "unicode/1f9ca.png?v8", + "ice_hockey": "unicode/1f3d2.png?v8", + "ice_skate": "unicode/26f8.png?v8", + "icecream": "unicode/1f366.png?v8", + "iceland": "unicode/1f1ee-1f1f8.png?v8", + "id": "unicode/1f194.png?v8", + "ideograph_advantage": "unicode/1f250.png?v8", + "imp": "unicode/1f47f.png?v8", + "inbox_tray": "unicode/1f4e5.png?v8", + "incoming_envelope": "unicode/1f4e8.png?v8", + "india": "unicode/1f1ee-1f1f3.png?v8", + "indonesia": "unicode/1f1ee-1f1e9.png?v8", + "infinity": "unicode/267e.png?v8", + "information_desk_person": "unicode/1f481.png?v8", + "information_source": "unicode/2139.png?v8", + "innocent": "unicode/1f607.png?v8", + "interrobang": "unicode/2049.png?v8", + "iphone": "unicode/1f4f1.png?v8", + "iran": "unicode/1f1ee-1f1f7.png?v8", + "iraq": "unicode/1f1ee-1f1f6.png?v8", + "ireland": "unicode/1f1ee-1f1ea.png?v8", + "isle_of_man": "unicode/1f1ee-1f1f2.png?v8", + "israel": "unicode/1f1ee-1f1f1.png?v8", + "it": "unicode/1f1ee-1f1f9.png?v8", + "izakaya_lantern": "unicode/1f3ee.png?v8", + "jack_o_lantern": "unicode/1f383.png?v8", + "jamaica": "unicode/1f1ef-1f1f2.png?v8", + "japan": "unicode/1f5fe.png?v8", + "japanese_castle": "unicode/1f3ef.png?v8", + "japanese_goblin": "unicode/1f47a.png?v8", + "japanese_ogre": "unicode/1f479.png?v8", + "jeans": "unicode/1f456.png?v8", + "jersey": "unicode/1f1ef-1f1ea.png?v8", + "jigsaw": "unicode/1f9e9.png?v8", + "jordan": "unicode/1f1ef-1f1f4.png?v8", + "joy": "unicode/1f602.png?v8", + "joy_cat": "unicode/1f639.png?v8", + "joystick": "unicode/1f579.png?v8", + "jp": "unicode/1f1ef-1f1f5.png?v8", + "judge": "unicode/1f9d1-2696.png?v8", + "juggling_person": "unicode/1f939.png?v8", + "kaaba": "unicode/1f54b.png?v8", + "kangaroo": "unicode/1f998.png?v8", + "kazakhstan": "unicode/1f1f0-1f1ff.png?v8", + "kenya": "unicode/1f1f0-1f1ea.png?v8", + "key": "unicode/1f511.png?v8", + "keyboard": "unicode/2328.png?v8", + "keycap_ten": "unicode/1f51f.png?v8", + "kick_scooter": "unicode/1f6f4.png?v8", + "kimono": "unicode/1f458.png?v8", + "kiribati": "unicode/1f1f0-1f1ee.png?v8", + "kiss": "unicode/1f48b.png?v8", + "kissing": "unicode/1f617.png?v8", + "kissing_cat": "unicode/1f63d.png?v8", + "kissing_closed_eyes": "unicode/1f61a.png?v8", + "kissing_heart": "unicode/1f618.png?v8", + "kissing_smiling_eyes": "unicode/1f619.png?v8", + "kite": "unicode/1fa81.png?v8", + "kiwi_fruit": "unicode/1f95d.png?v8", + "kneeling_man": "unicode/1f9ce-2642.png?v8", + "kneeling_person": "unicode/1f9ce.png?v8", + "kneeling_woman": "unicode/1f9ce-2640.png?v8", + "knife": "unicode/1f52a.png?v8", + "knot": "unicode/1faa2.png?v8", + "koala": "unicode/1f428.png?v8", + "koko": "unicode/1f201.png?v8", + "kosovo": "unicode/1f1fd-1f1f0.png?v8", + "kr": "unicode/1f1f0-1f1f7.png?v8", + "kuwait": "unicode/1f1f0-1f1fc.png?v8", + "kyrgyzstan": "unicode/1f1f0-1f1ec.png?v8", + "lab_coat": "unicode/1f97c.png?v8", + "label": "unicode/1f3f7.png?v8", + "lacrosse": "unicode/1f94d.png?v8", + "ladder": "unicode/1fa9c.png?v8", + "lady_beetle": "unicode/1f41e.png?v8", + "lantern": "unicode/1f3ee.png?v8", + "laos": "unicode/1f1f1-1f1e6.png?v8", + "large_blue_circle": "unicode/1f535.png?v8", + "large_blue_diamond": "unicode/1f537.png?v8", + "large_orange_diamond": "unicode/1f536.png?v8", + "last_quarter_moon": "unicode/1f317.png?v8", + "last_quarter_moon_with_face": "unicode/1f31c.png?v8", + "latin_cross": "unicode/271d.png?v8", + "latvia": "unicode/1f1f1-1f1fb.png?v8", + "laughing": "unicode/1f606.png?v8", + "leafy_green": "unicode/1f96c.png?v8", + "leaves": "unicode/1f343.png?v8", + "lebanon": "unicode/1f1f1-1f1e7.png?v8", + "ledger": "unicode/1f4d2.png?v8", + "left_luggage": "unicode/1f6c5.png?v8", + "left_right_arrow": "unicode/2194.png?v8", + "left_speech_bubble": "unicode/1f5e8.png?v8", + "leftwards_arrow_with_hook": "unicode/21a9.png?v8", + "leg": "unicode/1f9b5.png?v8", + "lemon": "unicode/1f34b.png?v8", + "leo": "unicode/264c.png?v8", + "leopard": "unicode/1f406.png?v8", + "lesotho": "unicode/1f1f1-1f1f8.png?v8", + "level_slider": "unicode/1f39a.png?v8", + "liberia": "unicode/1f1f1-1f1f7.png?v8", + "libra": "unicode/264e.png?v8", + "libya": "unicode/1f1f1-1f1fe.png?v8", + "liechtenstein": "unicode/1f1f1-1f1ee.png?v8", + "light_rail": "unicode/1f688.png?v8", + "link": "unicode/1f517.png?v8", + "lion": "unicode/1f981.png?v8", + "lips": "unicode/1f444.png?v8", + "lipstick": "unicode/1f484.png?v8", + "lithuania": "unicode/1f1f1-1f1f9.png?v8", + "lizard": "unicode/1f98e.png?v8", + "llama": "unicode/1f999.png?v8", + "lobster": "unicode/1f99e.png?v8", + "lock": "unicode/1f512.png?v8", + "lock_with_ink_pen": "unicode/1f50f.png?v8", + "lollipop": "unicode/1f36d.png?v8", + "long_drum": "unicode/1fa98.png?v8", + "loop": "unicode/27bf.png?v8", + "lotion_bottle": "unicode/1f9f4.png?v8", + "lotus_position": "unicode/1f9d8.png?v8", + "lotus_position_man": "unicode/1f9d8-2642.png?v8", + "lotus_position_woman": "unicode/1f9d8-2640.png?v8", + "loud_sound": "unicode/1f50a.png?v8", + "loudspeaker": "unicode/1f4e2.png?v8", + "love_hotel": "unicode/1f3e9.png?v8", + "love_letter": "unicode/1f48c.png?v8", + "love_you_gesture": "unicode/1f91f.png?v8", + "low_brightness": "unicode/1f505.png?v8", + "luggage": "unicode/1f9f3.png?v8", + "lungs": "unicode/1fac1.png?v8", + "luxembourg": "unicode/1f1f1-1f1fa.png?v8", + "lying_face": "unicode/1f925.png?v8", + "m": "unicode/24c2.png?v8", + "macau": "unicode/1f1f2-1f1f4.png?v8", + "macedonia": "unicode/1f1f2-1f1f0.png?v8", + "madagascar": "unicode/1f1f2-1f1ec.png?v8", + "mag": "unicode/1f50d.png?v8", + "mag_right": "unicode/1f50e.png?v8", + "mage": "unicode/1f9d9.png?v8", + "mage_man": "unicode/1f9d9-2642.png?v8", + "mage_woman": "unicode/1f9d9-2640.png?v8", + "magic_wand": "unicode/1fa84.png?v8", + "magnet": "unicode/1f9f2.png?v8", + "mahjong": "unicode/1f004.png?v8", + "mailbox": "unicode/1f4eb.png?v8", + "mailbox_closed": "unicode/1f4ea.png?v8", + "mailbox_with_mail": "unicode/1f4ec.png?v8", + "mailbox_with_no_mail": "unicode/1f4ed.png?v8", + "malawi": "unicode/1f1f2-1f1fc.png?v8", + "malaysia": "unicode/1f1f2-1f1fe.png?v8", + "maldives": "unicode/1f1f2-1f1fb.png?v8", + "male_detective": "unicode/1f575-2642.png?v8", + "male_sign": "unicode/2642.png?v8", + "mali": "unicode/1f1f2-1f1f1.png?v8", + "malta": "unicode/1f1f2-1f1f9.png?v8", + "mammoth": "unicode/1f9a3.png?v8", + "man": "unicode/1f468.png?v8", + "man_artist": "unicode/1f468-1f3a8.png?v8", + "man_astronaut": "unicode/1f468-1f680.png?v8", + "man_beard": "unicode/1f9d4-2642.png?v8", + "man_cartwheeling": "unicode/1f938-2642.png?v8", + "man_cook": "unicode/1f468-1f373.png?v8", + "man_dancing": "unicode/1f57a.png?v8", + "man_facepalming": "unicode/1f926-2642.png?v8", + "man_factory_worker": "unicode/1f468-1f3ed.png?v8", + "man_farmer": "unicode/1f468-1f33e.png?v8", + "man_feeding_baby": "unicode/1f468-1f37c.png?v8", + "man_firefighter": "unicode/1f468-1f692.png?v8", + "man_health_worker": "unicode/1f468-2695.png?v8", + "man_in_manual_wheelchair": "unicode/1f468-1f9bd.png?v8", + "man_in_motorized_wheelchair": "unicode/1f468-1f9bc.png?v8", + "man_in_tuxedo": "unicode/1f935-2642.png?v8", + "man_judge": "unicode/1f468-2696.png?v8", + "man_juggling": "unicode/1f939-2642.png?v8", + "man_mechanic": "unicode/1f468-1f527.png?v8", + "man_office_worker": "unicode/1f468-1f4bc.png?v8", + "man_pilot": "unicode/1f468-2708.png?v8", + "man_playing_handball": "unicode/1f93e-2642.png?v8", + "man_playing_water_polo": "unicode/1f93d-2642.png?v8", + "man_scientist": "unicode/1f468-1f52c.png?v8", + "man_shrugging": "unicode/1f937-2642.png?v8", + "man_singer": "unicode/1f468-1f3a4.png?v8", + "man_student": "unicode/1f468-1f393.png?v8", + "man_teacher": "unicode/1f468-1f3eb.png?v8", + "man_technologist": "unicode/1f468-1f4bb.png?v8", + "man_with_gua_pi_mao": "unicode/1f472.png?v8", + "man_with_probing_cane": "unicode/1f468-1f9af.png?v8", + "man_with_turban": "unicode/1f473-2642.png?v8", + "man_with_veil": "unicode/1f470-2642.png?v8", + "mandarin": "unicode/1f34a.png?v8", + "mango": "unicode/1f96d.png?v8", + "mans_shoe": "unicode/1f45e.png?v8", + "mantelpiece_clock": "unicode/1f570.png?v8", + "manual_wheelchair": "unicode/1f9bd.png?v8", + "maple_leaf": "unicode/1f341.png?v8", + "marshall_islands": "unicode/1f1f2-1f1ed.png?v8", + "martial_arts_uniform": "unicode/1f94b.png?v8", + "martinique": "unicode/1f1f2-1f1f6.png?v8", + "mask": "unicode/1f637.png?v8", + "massage": "unicode/1f486.png?v8", + "massage_man": "unicode/1f486-2642.png?v8", + "massage_woman": "unicode/1f486-2640.png?v8", + "mate": "unicode/1f9c9.png?v8", + "mauritania": "unicode/1f1f2-1f1f7.png?v8", + "mauritius": "unicode/1f1f2-1f1fa.png?v8", + "mayotte": "unicode/1f1fe-1f1f9.png?v8", + "meat_on_bone": "unicode/1f356.png?v8", + "mechanic": "unicode/1f9d1-1f527.png?v8", + "mechanical_arm": "unicode/1f9be.png?v8", + "mechanical_leg": "unicode/1f9bf.png?v8", + "medal_military": "unicode/1f396.png?v8", + "medal_sports": "unicode/1f3c5.png?v8", + "medical_symbol": "unicode/2695.png?v8", + "mega": "unicode/1f4e3.png?v8", + "melon": "unicode/1f348.png?v8", + "memo": "unicode/1f4dd.png?v8", + "men_wrestling": "unicode/1f93c-2642.png?v8", + "mending_heart": "unicode/2764-1fa79.png?v8", + "menorah": "unicode/1f54e.png?v8", + "mens": "unicode/1f6b9.png?v8", + "mermaid": "unicode/1f9dc-2640.png?v8", + "merman": "unicode/1f9dc-2642.png?v8", + "merperson": "unicode/1f9dc.png?v8", + "metal": "unicode/1f918.png?v8", + "metro": "unicode/1f687.png?v8", + "mexico": "unicode/1f1f2-1f1fd.png?v8", + "microbe": "unicode/1f9a0.png?v8", + "micronesia": "unicode/1f1eb-1f1f2.png?v8", + "microphone": "unicode/1f3a4.png?v8", + "microscope": "unicode/1f52c.png?v8", + "middle_finger": "unicode/1f595.png?v8", + "military_helmet": "unicode/1fa96.png?v8", + "milk_glass": "unicode/1f95b.png?v8", + "milky_way": "unicode/1f30c.png?v8", + "minibus": "unicode/1f690.png?v8", + "minidisc": "unicode/1f4bd.png?v8", + "mirror": "unicode/1fa9e.png?v8", + "mobile_phone_off": "unicode/1f4f4.png?v8", + "moldova": "unicode/1f1f2-1f1e9.png?v8", + "monaco": "unicode/1f1f2-1f1e8.png?v8", + "money_mouth_face": "unicode/1f911.png?v8", + "money_with_wings": "unicode/1f4b8.png?v8", + "moneybag": "unicode/1f4b0.png?v8", + "mongolia": "unicode/1f1f2-1f1f3.png?v8", + "monkey": "unicode/1f412.png?v8", + "monkey_face": "unicode/1f435.png?v8", + "monocle_face": "unicode/1f9d0.png?v8", + "monorail": "unicode/1f69d.png?v8", + "montenegro": "unicode/1f1f2-1f1ea.png?v8", + "montserrat": "unicode/1f1f2-1f1f8.png?v8", + "moon": "unicode/1f314.png?v8", + "moon_cake": "unicode/1f96e.png?v8", + "morocco": "unicode/1f1f2-1f1e6.png?v8", + "mortar_board": "unicode/1f393.png?v8", + "mosque": "unicode/1f54c.png?v8", + "mosquito": "unicode/1f99f.png?v8", + "motor_boat": "unicode/1f6e5.png?v8", + "motor_scooter": "unicode/1f6f5.png?v8", + "motorcycle": "unicode/1f3cd.png?v8", + "motorized_wheelchair": "unicode/1f9bc.png?v8", + "motorway": "unicode/1f6e3.png?v8", + "mount_fuji": "unicode/1f5fb.png?v8", + "mountain": "unicode/26f0.png?v8", + "mountain_bicyclist": "unicode/1f6b5.png?v8", + "mountain_biking_man": "unicode/1f6b5-2642.png?v8", + "mountain_biking_woman": "unicode/1f6b5-2640.png?v8", + "mountain_cableway": "unicode/1f6a0.png?v8", + "mountain_railway": "unicode/1f69e.png?v8", + "mountain_snow": "unicode/1f3d4.png?v8", + "mouse": "unicode/1f42d.png?v8", + "mouse2": "unicode/1f401.png?v8", + "mouse_trap": "unicode/1faa4.png?v8", + "movie_camera": "unicode/1f3a5.png?v8", + "moyai": "unicode/1f5ff.png?v8", + "mozambique": "unicode/1f1f2-1f1ff.png?v8", + "mrs_claus": "unicode/1f936.png?v8", + "muscle": "unicode/1f4aa.png?v8", + "mushroom": "unicode/1f344.png?v8", + "musical_keyboard": "unicode/1f3b9.png?v8", + "musical_note": "unicode/1f3b5.png?v8", + "musical_score": "unicode/1f3bc.png?v8", + "mute": "unicode/1f507.png?v8", + "mx_claus": "unicode/1f9d1-1f384.png?v8", + "myanmar": "unicode/1f1f2-1f1f2.png?v8", + "nail_care": "unicode/1f485.png?v8", + "name_badge": "unicode/1f4db.png?v8", + "namibia": "unicode/1f1f3-1f1e6.png?v8", + "national_park": "unicode/1f3de.png?v8", + "nauru": "unicode/1f1f3-1f1f7.png?v8", + "nauseated_face": "unicode/1f922.png?v8", + "nazar_amulet": "unicode/1f9ff.png?v8", + "neckbeard": "neckbeard.png?v8", + "necktie": "unicode/1f454.png?v8", + "negative_squared_cross_mark": "unicode/274e.png?v8", + "nepal": "unicode/1f1f3-1f1f5.png?v8", + "nerd_face": "unicode/1f913.png?v8", + "nesting_dolls": "unicode/1fa86.png?v8", + "netherlands": "unicode/1f1f3-1f1f1.png?v8", + "neutral_face": "unicode/1f610.png?v8", + "new": "unicode/1f195.png?v8", + "new_caledonia": "unicode/1f1f3-1f1e8.png?v8", + "new_moon": "unicode/1f311.png?v8", + "new_moon_with_face": "unicode/1f31a.png?v8", + "new_zealand": "unicode/1f1f3-1f1ff.png?v8", + "newspaper": "unicode/1f4f0.png?v8", + "newspaper_roll": "unicode/1f5de.png?v8", + "next_track_button": "unicode/23ed.png?v8", + "ng": "unicode/1f196.png?v8", + "ng_man": "unicode/1f645-2642.png?v8", + "ng_woman": "unicode/1f645-2640.png?v8", + "nicaragua": "unicode/1f1f3-1f1ee.png?v8", + "niger": "unicode/1f1f3-1f1ea.png?v8", + "nigeria": "unicode/1f1f3-1f1ec.png?v8", + "night_with_stars": "unicode/1f303.png?v8", + "nine": "unicode/0039-20e3.png?v8", + "ninja": "unicode/1f977.png?v8", + "niue": "unicode/1f1f3-1f1fa.png?v8", + "no_bell": "unicode/1f515.png?v8", + "no_bicycles": "unicode/1f6b3.png?v8", + "no_entry": "unicode/26d4.png?v8", + "no_entry_sign": "unicode/1f6ab.png?v8", + "no_good": "unicode/1f645.png?v8", + "no_good_man": "unicode/1f645-2642.png?v8", + "no_good_woman": "unicode/1f645-2640.png?v8", + "no_mobile_phones": "unicode/1f4f5.png?v8", + "no_mouth": "unicode/1f636.png?v8", + "no_pedestrians": "unicode/1f6b7.png?v8", + "no_smoking": "unicode/1f6ad.png?v8", + "non-potable_water": "unicode/1f6b1.png?v8", + "norfolk_island": "unicode/1f1f3-1f1eb.png?v8", + "north_korea": "unicode/1f1f0-1f1f5.png?v8", + "northern_mariana_islands": "unicode/1f1f2-1f1f5.png?v8", + "norway": "unicode/1f1f3-1f1f4.png?v8", + "nose": "unicode/1f443.png?v8", + "notebook": "unicode/1f4d3.png?v8", + "notebook_with_decorative_cover": "unicode/1f4d4.png?v8", + "notes": "unicode/1f3b6.png?v8", + "nut_and_bolt": "unicode/1f529.png?v8", + "o": "unicode/2b55.png?v8", + "o2": "unicode/1f17e.png?v8", + "ocean": "unicode/1f30a.png?v8", + "octocat": "octocat.png?v8", + "octopus": "unicode/1f419.png?v8", + "oden": "unicode/1f362.png?v8", + "office": "unicode/1f3e2.png?v8", + "office_worker": "unicode/1f9d1-1f4bc.png?v8", + "oil_drum": "unicode/1f6e2.png?v8", + "ok": "unicode/1f197.png?v8", + "ok_hand": "unicode/1f44c.png?v8", + "ok_man": "unicode/1f646-2642.png?v8", + "ok_person": "unicode/1f646.png?v8", + "ok_woman": "unicode/1f646-2640.png?v8", + "old_key": "unicode/1f5dd.png?v8", + "older_adult": "unicode/1f9d3.png?v8", + "older_man": "unicode/1f474.png?v8", + "older_woman": "unicode/1f475.png?v8", + "olive": "unicode/1fad2.png?v8", + "om": "unicode/1f549.png?v8", + "oman": "unicode/1f1f4-1f1f2.png?v8", + "on": "unicode/1f51b.png?v8", + "oncoming_automobile": "unicode/1f698.png?v8", + "oncoming_bus": "unicode/1f68d.png?v8", + "oncoming_police_car": "unicode/1f694.png?v8", + "oncoming_taxi": "unicode/1f696.png?v8", + "one": "unicode/0031-20e3.png?v8", + "one_piece_swimsuit": "unicode/1fa71.png?v8", + "onion": "unicode/1f9c5.png?v8", + "open_book": "unicode/1f4d6.png?v8", + "open_file_folder": "unicode/1f4c2.png?v8", + "open_hands": "unicode/1f450.png?v8", + "open_mouth": "unicode/1f62e.png?v8", + "open_umbrella": "unicode/2602.png?v8", + "ophiuchus": "unicode/26ce.png?v8", + "orange": "unicode/1f34a.png?v8", + "orange_book": "unicode/1f4d9.png?v8", + "orange_circle": "unicode/1f7e0.png?v8", + "orange_heart": "unicode/1f9e1.png?v8", + "orange_square": "unicode/1f7e7.png?v8", + "orangutan": "unicode/1f9a7.png?v8", + "orthodox_cross": "unicode/2626.png?v8", + "otter": "unicode/1f9a6.png?v8", + "outbox_tray": "unicode/1f4e4.png?v8", + "owl": "unicode/1f989.png?v8", + "ox": "unicode/1f402.png?v8", + "oyster": "unicode/1f9aa.png?v8", + "package": "unicode/1f4e6.png?v8", + "page_facing_up": "unicode/1f4c4.png?v8", + "page_with_curl": "unicode/1f4c3.png?v8", + "pager": "unicode/1f4df.png?v8", + "paintbrush": "unicode/1f58c.png?v8", + "pakistan": "unicode/1f1f5-1f1f0.png?v8", + "palau": "unicode/1f1f5-1f1fc.png?v8", + "palestinian_territories": "unicode/1f1f5-1f1f8.png?v8", + "palm_tree": "unicode/1f334.png?v8", + "palms_up_together": "unicode/1f932.png?v8", + "panama": "unicode/1f1f5-1f1e6.png?v8", + "pancakes": "unicode/1f95e.png?v8", + "panda_face": "unicode/1f43c.png?v8", + "paperclip": "unicode/1f4ce.png?v8", + "paperclips": "unicode/1f587.png?v8", + "papua_new_guinea": "unicode/1f1f5-1f1ec.png?v8", + "parachute": "unicode/1fa82.png?v8", + "paraguay": "unicode/1f1f5-1f1fe.png?v8", + "parasol_on_ground": "unicode/26f1.png?v8", + "parking": "unicode/1f17f.png?v8", + "parrot": "unicode/1f99c.png?v8", + "part_alternation_mark": "unicode/303d.png?v8", + "partly_sunny": "unicode/26c5.png?v8", + "partying_face": "unicode/1f973.png?v8", + "passenger_ship": "unicode/1f6f3.png?v8", + "passport_control": "unicode/1f6c2.png?v8", + "pause_button": "unicode/23f8.png?v8", + "paw_prints": "unicode/1f43e.png?v8", + "peace_symbol": "unicode/262e.png?v8", + "peach": "unicode/1f351.png?v8", + "peacock": "unicode/1f99a.png?v8", + "peanuts": "unicode/1f95c.png?v8", + "pear": "unicode/1f350.png?v8", + "pen": "unicode/1f58a.png?v8", + "pencil": "unicode/1f4dd.png?v8", + "pencil2": "unicode/270f.png?v8", + "penguin": "unicode/1f427.png?v8", + "pensive": "unicode/1f614.png?v8", + "people_holding_hands": "unicode/1f9d1-1f91d-1f9d1.png?v8", + "people_hugging": "unicode/1fac2.png?v8", + "performing_arts": "unicode/1f3ad.png?v8", + "persevere": "unicode/1f623.png?v8", + "person_bald": "unicode/1f9d1-1f9b2.png?v8", + "person_curly_hair": "unicode/1f9d1-1f9b1.png?v8", + "person_feeding_baby": "unicode/1f9d1-1f37c.png?v8", + "person_fencing": "unicode/1f93a.png?v8", + "person_in_manual_wheelchair": "unicode/1f9d1-1f9bd.png?v8", + "person_in_motorized_wheelchair": "unicode/1f9d1-1f9bc.png?v8", + "person_in_tuxedo": "unicode/1f935.png?v8", + "person_red_hair": "unicode/1f9d1-1f9b0.png?v8", + "person_white_hair": "unicode/1f9d1-1f9b3.png?v8", + "person_with_probing_cane": "unicode/1f9d1-1f9af.png?v8", + "person_with_turban": "unicode/1f473.png?v8", + "person_with_veil": "unicode/1f470.png?v8", + "peru": "unicode/1f1f5-1f1ea.png?v8", + "petri_dish": "unicode/1f9eb.png?v8", + "philippines": "unicode/1f1f5-1f1ed.png?v8", + "phone": "unicode/260e.png?v8", + "pick": "unicode/26cf.png?v8", + "pickup_truck": "unicode/1f6fb.png?v8", + "pie": "unicode/1f967.png?v8", + "pig": "unicode/1f437.png?v8", + "pig2": "unicode/1f416.png?v8", + "pig_nose": "unicode/1f43d.png?v8", + "pill": "unicode/1f48a.png?v8", + "pilot": "unicode/1f9d1-2708.png?v8", + "pinata": "unicode/1fa85.png?v8", + "pinched_fingers": "unicode/1f90c.png?v8", + "pinching_hand": "unicode/1f90f.png?v8", + "pineapple": "unicode/1f34d.png?v8", + "ping_pong": "unicode/1f3d3.png?v8", + "pirate_flag": "unicode/1f3f4-2620.png?v8", + "pisces": "unicode/2653.png?v8", + "pitcairn_islands": "unicode/1f1f5-1f1f3.png?v8", + "pizza": "unicode/1f355.png?v8", + "placard": "unicode/1faa7.png?v8", + "place_of_worship": "unicode/1f6d0.png?v8", + "plate_with_cutlery": "unicode/1f37d.png?v8", + "play_or_pause_button": "unicode/23ef.png?v8", + "pleading_face": "unicode/1f97a.png?v8", + "plunger": "unicode/1faa0.png?v8", + "point_down": "unicode/1f447.png?v8", + "point_left": "unicode/1f448.png?v8", + "point_right": "unicode/1f449.png?v8", + "point_up": "unicode/261d.png?v8", + "point_up_2": "unicode/1f446.png?v8", + "poland": "unicode/1f1f5-1f1f1.png?v8", + "polar_bear": "unicode/1f43b-2744.png?v8", + "police_car": "unicode/1f693.png?v8", + "police_officer": "unicode/1f46e.png?v8", + "policeman": "unicode/1f46e-2642.png?v8", + "policewoman": "unicode/1f46e-2640.png?v8", + "poodle": "unicode/1f429.png?v8", + "poop": "unicode/1f4a9.png?v8", + "popcorn": "unicode/1f37f.png?v8", + "portugal": "unicode/1f1f5-1f1f9.png?v8", + "post_office": "unicode/1f3e3.png?v8", + "postal_horn": "unicode/1f4ef.png?v8", + "postbox": "unicode/1f4ee.png?v8", + "potable_water": "unicode/1f6b0.png?v8", + "potato": "unicode/1f954.png?v8", + "potted_plant": "unicode/1fab4.png?v8", + "pouch": "unicode/1f45d.png?v8", + "poultry_leg": "unicode/1f357.png?v8", + "pound": "unicode/1f4b7.png?v8", + "pout": "unicode/1f621.png?v8", + "pouting_cat": "unicode/1f63e.png?v8", + "pouting_face": "unicode/1f64e.png?v8", + "pouting_man": "unicode/1f64e-2642.png?v8", + "pouting_woman": "unicode/1f64e-2640.png?v8", + "pray": "unicode/1f64f.png?v8", + "prayer_beads": "unicode/1f4ff.png?v8", + "pregnant_woman": "unicode/1f930.png?v8", + "pretzel": "unicode/1f968.png?v8", + "previous_track_button": "unicode/23ee.png?v8", + "prince": "unicode/1f934.png?v8", + "princess": "unicode/1f478.png?v8", + "printer": "unicode/1f5a8.png?v8", + "probing_cane": "unicode/1f9af.png?v8", + "puerto_rico": "unicode/1f1f5-1f1f7.png?v8", + "punch": "unicode/1f44a.png?v8", + "purple_circle": "unicode/1f7e3.png?v8", + "purple_heart": "unicode/1f49c.png?v8", + "purple_square": "unicode/1f7ea.png?v8", + "purse": "unicode/1f45b.png?v8", + "pushpin": "unicode/1f4cc.png?v8", + "put_litter_in_its_place": "unicode/1f6ae.png?v8", + "qatar": "unicode/1f1f6-1f1e6.png?v8", + "question": "unicode/2753.png?v8", + "rabbit": "unicode/1f430.png?v8", + "rabbit2": "unicode/1f407.png?v8", + "raccoon": "unicode/1f99d.png?v8", + "racehorse": "unicode/1f40e.png?v8", + "racing_car": "unicode/1f3ce.png?v8", + "radio": "unicode/1f4fb.png?v8", + "radio_button": "unicode/1f518.png?v8", + "radioactive": "unicode/2622.png?v8", + "rage": "unicode/1f621.png?v8", + "rage1": "rage1.png?v8", + "rage2": "rage2.png?v8", + "rage3": "rage3.png?v8", + "rage4": "rage4.png?v8", + "railway_car": "unicode/1f683.png?v8", + "railway_track": "unicode/1f6e4.png?v8", + "rainbow": "unicode/1f308.png?v8", + "rainbow_flag": "unicode/1f3f3-1f308.png?v8", + "raised_back_of_hand": "unicode/1f91a.png?v8", + "raised_eyebrow": "unicode/1f928.png?v8", + "raised_hand": "unicode/270b.png?v8", + "raised_hand_with_fingers_splayed": "unicode/1f590.png?v8", + "raised_hands": "unicode/1f64c.png?v8", + "raising_hand": "unicode/1f64b.png?v8", + "raising_hand_man": "unicode/1f64b-2642.png?v8", + "raising_hand_woman": "unicode/1f64b-2640.png?v8", + "ram": "unicode/1f40f.png?v8", + "ramen": "unicode/1f35c.png?v8", + "rat": "unicode/1f400.png?v8", + "razor": "unicode/1fa92.png?v8", + "receipt": "unicode/1f9fe.png?v8", + "record_button": "unicode/23fa.png?v8", + "recycle": "unicode/267b.png?v8", + "red_car": "unicode/1f697.png?v8", + "red_circle": "unicode/1f534.png?v8", + "red_envelope": "unicode/1f9e7.png?v8", + "red_haired_man": "unicode/1f468-1f9b0.png?v8", + "red_haired_woman": "unicode/1f469-1f9b0.png?v8", + "red_square": "unicode/1f7e5.png?v8", + "registered": "unicode/00ae.png?v8", + "relaxed": "unicode/263a.png?v8", + "relieved": "unicode/1f60c.png?v8", + "reminder_ribbon": "unicode/1f397.png?v8", + "repeat": "unicode/1f501.png?v8", + "repeat_one": "unicode/1f502.png?v8", + "rescue_worker_helmet": "unicode/26d1.png?v8", + "restroom": "unicode/1f6bb.png?v8", + "reunion": "unicode/1f1f7-1f1ea.png?v8", + "revolving_hearts": "unicode/1f49e.png?v8", + "rewind": "unicode/23ea.png?v8", + "rhinoceros": "unicode/1f98f.png?v8", + "ribbon": "unicode/1f380.png?v8", + "rice": "unicode/1f35a.png?v8", + "rice_ball": "unicode/1f359.png?v8", + "rice_cracker": "unicode/1f358.png?v8", + "rice_scene": "unicode/1f391.png?v8", + "right_anger_bubble": "unicode/1f5ef.png?v8", + "ring": "unicode/1f48d.png?v8", + "ringed_planet": "unicode/1fa90.png?v8", + "robot": "unicode/1f916.png?v8", + "rock": "unicode/1faa8.png?v8", + "rocket": "unicode/1f680.png?v8", + "rofl": "unicode/1f923.png?v8", + "roll_eyes": "unicode/1f644.png?v8", + "roll_of_paper": "unicode/1f9fb.png?v8", + "roller_coaster": "unicode/1f3a2.png?v8", + "roller_skate": "unicode/1f6fc.png?v8", + "romania": "unicode/1f1f7-1f1f4.png?v8", + "rooster": "unicode/1f413.png?v8", + "rose": "unicode/1f339.png?v8", + "rosette": "unicode/1f3f5.png?v8", + "rotating_light": "unicode/1f6a8.png?v8", + "round_pushpin": "unicode/1f4cd.png?v8", + "rowboat": "unicode/1f6a3.png?v8", + "rowing_man": "unicode/1f6a3-2642.png?v8", + "rowing_woman": "unicode/1f6a3-2640.png?v8", + "ru": "unicode/1f1f7-1f1fa.png?v8", + "rugby_football": "unicode/1f3c9.png?v8", + "runner": "unicode/1f3c3.png?v8", + "running": "unicode/1f3c3.png?v8", + "running_man": "unicode/1f3c3-2642.png?v8", + "running_shirt_with_sash": "unicode/1f3bd.png?v8", + "running_woman": "unicode/1f3c3-2640.png?v8", + "rwanda": "unicode/1f1f7-1f1fc.png?v8", + "sa": "unicode/1f202.png?v8", + "safety_pin": "unicode/1f9f7.png?v8", + "safety_vest": "unicode/1f9ba.png?v8", + "sagittarius": "unicode/2650.png?v8", + "sailboat": "unicode/26f5.png?v8", + "sake": "unicode/1f376.png?v8", + "salt": "unicode/1f9c2.png?v8", + "samoa": "unicode/1f1fc-1f1f8.png?v8", + "san_marino": "unicode/1f1f8-1f1f2.png?v8", + "sandal": "unicode/1f461.png?v8", + "sandwich": "unicode/1f96a.png?v8", + "santa": "unicode/1f385.png?v8", + "sao_tome_principe": "unicode/1f1f8-1f1f9.png?v8", + "sari": "unicode/1f97b.png?v8", + "sassy_man": "unicode/1f481-2642.png?v8", + "sassy_woman": "unicode/1f481-2640.png?v8", + "satellite": "unicode/1f4e1.png?v8", + "satisfied": "unicode/1f606.png?v8", + "saudi_arabia": "unicode/1f1f8-1f1e6.png?v8", + "sauna_man": "unicode/1f9d6-2642.png?v8", + "sauna_person": "unicode/1f9d6.png?v8", + "sauna_woman": "unicode/1f9d6-2640.png?v8", + "sauropod": "unicode/1f995.png?v8", + "saxophone": "unicode/1f3b7.png?v8", + "scarf": "unicode/1f9e3.png?v8", + "school": "unicode/1f3eb.png?v8", + "school_satchel": "unicode/1f392.png?v8", + "scientist": "unicode/1f9d1-1f52c.png?v8", + "scissors": "unicode/2702.png?v8", + "scorpion": "unicode/1f982.png?v8", + "scorpius": "unicode/264f.png?v8", + "scotland": "unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8", + "scream": "unicode/1f631.png?v8", + "scream_cat": "unicode/1f640.png?v8", + "screwdriver": "unicode/1fa9b.png?v8", + "scroll": "unicode/1f4dc.png?v8", + "seal": "unicode/1f9ad.png?v8", + "seat": "unicode/1f4ba.png?v8", + "secret": "unicode/3299.png?v8", + "see_no_evil": "unicode/1f648.png?v8", + "seedling": "unicode/1f331.png?v8", + "selfie": "unicode/1f933.png?v8", + "senegal": "unicode/1f1f8-1f1f3.png?v8", + "serbia": "unicode/1f1f7-1f1f8.png?v8", + "service_dog": "unicode/1f415-1f9ba.png?v8", + "seven": "unicode/0037-20e3.png?v8", + "sewing_needle": "unicode/1faa1.png?v8", + "seychelles": "unicode/1f1f8-1f1e8.png?v8", + "shallow_pan_of_food": "unicode/1f958.png?v8", + "shamrock": "unicode/2618.png?v8", + "shark": "unicode/1f988.png?v8", + "shaved_ice": "unicode/1f367.png?v8", + "sheep": "unicode/1f411.png?v8", + "shell": "unicode/1f41a.png?v8", + "shield": "unicode/1f6e1.png?v8", + "shinto_shrine": "unicode/26e9.png?v8", + "ship": "unicode/1f6a2.png?v8", + "shipit": "shipit.png?v8", + "shirt": "unicode/1f455.png?v8", + "shit": "unicode/1f4a9.png?v8", + "shoe": "unicode/1f45e.png?v8", + "shopping": "unicode/1f6cd.png?v8", + "shopping_cart": "unicode/1f6d2.png?v8", + "shorts": "unicode/1fa73.png?v8", + "shower": "unicode/1f6bf.png?v8", + "shrimp": "unicode/1f990.png?v8", + "shrug": "unicode/1f937.png?v8", + "shushing_face": "unicode/1f92b.png?v8", + "sierra_leone": "unicode/1f1f8-1f1f1.png?v8", + "signal_strength": "unicode/1f4f6.png?v8", + "singapore": "unicode/1f1f8-1f1ec.png?v8", + "singer": "unicode/1f9d1-1f3a4.png?v8", + "sint_maarten": "unicode/1f1f8-1f1fd.png?v8", + "six": "unicode/0036-20e3.png?v8", + "six_pointed_star": "unicode/1f52f.png?v8", + "skateboard": "unicode/1f6f9.png?v8", + "ski": "unicode/1f3bf.png?v8", + "skier": "unicode/26f7.png?v8", + "skull": "unicode/1f480.png?v8", + "skull_and_crossbones": "unicode/2620.png?v8", + "skunk": "unicode/1f9a8.png?v8", + "sled": "unicode/1f6f7.png?v8", + "sleeping": "unicode/1f634.png?v8", + "sleeping_bed": "unicode/1f6cc.png?v8", + "sleepy": "unicode/1f62a.png?v8", + "slightly_frowning_face": "unicode/1f641.png?v8", + "slightly_smiling_face": "unicode/1f642.png?v8", + "slot_machine": "unicode/1f3b0.png?v8", + "sloth": "unicode/1f9a5.png?v8", + "slovakia": "unicode/1f1f8-1f1f0.png?v8", + "slovenia": "unicode/1f1f8-1f1ee.png?v8", + "small_airplane": "unicode/1f6e9.png?v8", + "small_blue_diamond": "unicode/1f539.png?v8", + "small_orange_diamond": "unicode/1f538.png?v8", + "small_red_triangle": "unicode/1f53a.png?v8", + "small_red_triangle_down": "unicode/1f53b.png?v8", + "smile": "unicode/1f604.png?v8", + "smile_cat": "unicode/1f638.png?v8", + "smiley": "unicode/1f603.png?v8", + "smiley_cat": "unicode/1f63a.png?v8", + "smiling_face_with_tear": "unicode/1f972.png?v8", + "smiling_face_with_three_hearts": "unicode/1f970.png?v8", + "smiling_imp": "unicode/1f608.png?v8", + "smirk": "unicode/1f60f.png?v8", + "smirk_cat": "unicode/1f63c.png?v8", + "smoking": "unicode/1f6ac.png?v8", + "snail": "unicode/1f40c.png?v8", + "snake": "unicode/1f40d.png?v8", + "sneezing_face": "unicode/1f927.png?v8", + "snowboarder": "unicode/1f3c2.png?v8", + "snowflake": "unicode/2744.png?v8", + "snowman": "unicode/26c4.png?v8", + "snowman_with_snow": "unicode/2603.png?v8", + "soap": "unicode/1f9fc.png?v8", + "sob": "unicode/1f62d.png?v8", + "soccer": "unicode/26bd.png?v8", + "socks": "unicode/1f9e6.png?v8", + "softball": "unicode/1f94e.png?v8", + "solomon_islands": "unicode/1f1f8-1f1e7.png?v8", + "somalia": "unicode/1f1f8-1f1f4.png?v8", + "soon": "unicode/1f51c.png?v8", + "sos": "unicode/1f198.png?v8", + "sound": "unicode/1f509.png?v8", + "south_africa": "unicode/1f1ff-1f1e6.png?v8", + "south_georgia_south_sandwich_islands": "unicode/1f1ec-1f1f8.png?v8", + "south_sudan": "unicode/1f1f8-1f1f8.png?v8", + "space_invader": "unicode/1f47e.png?v8", + "spades": "unicode/2660.png?v8", + "spaghetti": "unicode/1f35d.png?v8", + "sparkle": "unicode/2747.png?v8", + "sparkler": "unicode/1f387.png?v8", + "sparkles": "unicode/2728.png?v8", + "sparkling_heart": "unicode/1f496.png?v8", + "speak_no_evil": "unicode/1f64a.png?v8", + "speaker": "unicode/1f508.png?v8", + "speaking_head": "unicode/1f5e3.png?v8", + "speech_balloon": "unicode/1f4ac.png?v8", + "speedboat": "unicode/1f6a4.png?v8", + "spider": "unicode/1f577.png?v8", + "spider_web": "unicode/1f578.png?v8", + "spiral_calendar": "unicode/1f5d3.png?v8", + "spiral_notepad": "unicode/1f5d2.png?v8", + "sponge": "unicode/1f9fd.png?v8", + "spoon": "unicode/1f944.png?v8", + "squid": "unicode/1f991.png?v8", + "sri_lanka": "unicode/1f1f1-1f1f0.png?v8", + "st_barthelemy": "unicode/1f1e7-1f1f1.png?v8", + "st_helena": "unicode/1f1f8-1f1ed.png?v8", + "st_kitts_nevis": "unicode/1f1f0-1f1f3.png?v8", + "st_lucia": "unicode/1f1f1-1f1e8.png?v8", + "st_martin": "unicode/1f1f2-1f1eb.png?v8", + "st_pierre_miquelon": "unicode/1f1f5-1f1f2.png?v8", + "st_vincent_grenadines": "unicode/1f1fb-1f1e8.png?v8", + "stadium": "unicode/1f3df.png?v8", + "standing_man": "unicode/1f9cd-2642.png?v8", + "standing_person": "unicode/1f9cd.png?v8", + "standing_woman": "unicode/1f9cd-2640.png?v8", + "star": "unicode/2b50.png?v8", + "star2": "unicode/1f31f.png?v8", + "star_and_crescent": "unicode/262a.png?v8", + "star_of_david": "unicode/2721.png?v8", + "star_struck": "unicode/1f929.png?v8", + "stars": "unicode/1f320.png?v8", + "station": "unicode/1f689.png?v8", + "statue_of_liberty": "unicode/1f5fd.png?v8", + "steam_locomotive": "unicode/1f682.png?v8", + "stethoscope": "unicode/1fa7a.png?v8", + "stew": "unicode/1f372.png?v8", + "stop_button": "unicode/23f9.png?v8", + "stop_sign": "unicode/1f6d1.png?v8", + "stopwatch": "unicode/23f1.png?v8", + "straight_ruler": "unicode/1f4cf.png?v8", + "strawberry": "unicode/1f353.png?v8", + "stuck_out_tongue": "unicode/1f61b.png?v8", + "stuck_out_tongue_closed_eyes": "unicode/1f61d.png?v8", + "stuck_out_tongue_winking_eye": "unicode/1f61c.png?v8", + "student": "unicode/1f9d1-1f393.png?v8", + "studio_microphone": "unicode/1f399.png?v8", + "stuffed_flatbread": "unicode/1f959.png?v8", + "sudan": "unicode/1f1f8-1f1e9.png?v8", + "sun_behind_large_cloud": "unicode/1f325.png?v8", + "sun_behind_rain_cloud": "unicode/1f326.png?v8", + "sun_behind_small_cloud": "unicode/1f324.png?v8", + "sun_with_face": "unicode/1f31e.png?v8", + "sunflower": "unicode/1f33b.png?v8", + "sunglasses": "unicode/1f60e.png?v8", + "sunny": "unicode/2600.png?v8", + "sunrise": "unicode/1f305.png?v8", + "sunrise_over_mountains": "unicode/1f304.png?v8", + "superhero": "unicode/1f9b8.png?v8", + "superhero_man": "unicode/1f9b8-2642.png?v8", + "superhero_woman": "unicode/1f9b8-2640.png?v8", + "supervillain": "unicode/1f9b9.png?v8", + "supervillain_man": "unicode/1f9b9-2642.png?v8", + "supervillain_woman": "unicode/1f9b9-2640.png?v8", + "surfer": "unicode/1f3c4.png?v8", + "surfing_man": "unicode/1f3c4-2642.png?v8", + "surfing_woman": "unicode/1f3c4-2640.png?v8", + "suriname": "unicode/1f1f8-1f1f7.png?v8", + "sushi": "unicode/1f363.png?v8", + "suspect": "suspect.png?v8", + "suspension_railway": "unicode/1f69f.png?v8", + "svalbard_jan_mayen": "unicode/1f1f8-1f1ef.png?v8", + "swan": "unicode/1f9a2.png?v8", + "swaziland": "unicode/1f1f8-1f1ff.png?v8", + "sweat": "unicode/1f613.png?v8", + "sweat_drops": "unicode/1f4a6.png?v8", + "sweat_smile": "unicode/1f605.png?v8", + "sweden": "unicode/1f1f8-1f1ea.png?v8", + "sweet_potato": "unicode/1f360.png?v8", + "swim_brief": "unicode/1fa72.png?v8", + "swimmer": "unicode/1f3ca.png?v8", + "swimming_man": "unicode/1f3ca-2642.png?v8", + "swimming_woman": "unicode/1f3ca-2640.png?v8", + "switzerland": "unicode/1f1e8-1f1ed.png?v8", + "symbols": "unicode/1f523.png?v8", + "synagogue": "unicode/1f54d.png?v8", + "syria": "unicode/1f1f8-1f1fe.png?v8", + "syringe": "unicode/1f489.png?v8", + "t-rex": "unicode/1f996.png?v8", + "taco": "unicode/1f32e.png?v8", + "tada": "unicode/1f389.png?v8", + "taiwan": "unicode/1f1f9-1f1fc.png?v8", + "tajikistan": "unicode/1f1f9-1f1ef.png?v8", + "takeout_box": "unicode/1f961.png?v8", + "tamale": "unicode/1fad4.png?v8", + "tanabata_tree": "unicode/1f38b.png?v8", + "tangerine": "unicode/1f34a.png?v8", + "tanzania": "unicode/1f1f9-1f1ff.png?v8", + "taurus": "unicode/2649.png?v8", + "taxi": "unicode/1f695.png?v8", + "tea": "unicode/1f375.png?v8", + "teacher": "unicode/1f9d1-1f3eb.png?v8", + "teapot": "unicode/1fad6.png?v8", + "technologist": "unicode/1f9d1-1f4bb.png?v8", + "teddy_bear": "unicode/1f9f8.png?v8", + "telephone": "unicode/260e.png?v8", + "telephone_receiver": "unicode/1f4de.png?v8", + "telescope": "unicode/1f52d.png?v8", + "tennis": "unicode/1f3be.png?v8", + "tent": "unicode/26fa.png?v8", + "test_tube": "unicode/1f9ea.png?v8", + "thailand": "unicode/1f1f9-1f1ed.png?v8", + "thermometer": "unicode/1f321.png?v8", + "thinking": "unicode/1f914.png?v8", + "thong_sandal": "unicode/1fa74.png?v8", + "thought_balloon": "unicode/1f4ad.png?v8", + "thread": "unicode/1f9f5.png?v8", + "three": "unicode/0033-20e3.png?v8", + "thumbsdown": "unicode/1f44e.png?v8", + "thumbsup": "unicode/1f44d.png?v8", + "ticket": "unicode/1f3ab.png?v8", + "tickets": "unicode/1f39f.png?v8", + "tiger": "unicode/1f42f.png?v8", + "tiger2": "unicode/1f405.png?v8", + "timer_clock": "unicode/23f2.png?v8", + "timor_leste": "unicode/1f1f9-1f1f1.png?v8", + "tipping_hand_man": "unicode/1f481-2642.png?v8", + "tipping_hand_person": "unicode/1f481.png?v8", + "tipping_hand_woman": "unicode/1f481-2640.png?v8", + "tired_face": "unicode/1f62b.png?v8", + "tm": "unicode/2122.png?v8", + "togo": "unicode/1f1f9-1f1ec.png?v8", + "toilet": "unicode/1f6bd.png?v8", + "tokelau": "unicode/1f1f9-1f1f0.png?v8", + "tokyo_tower": "unicode/1f5fc.png?v8", + "tomato": "unicode/1f345.png?v8", + "tonga": "unicode/1f1f9-1f1f4.png?v8", + "tongue": "unicode/1f445.png?v8", + "toolbox": "unicode/1f9f0.png?v8", + "tooth": "unicode/1f9b7.png?v8", + "toothbrush": "unicode/1faa5.png?v8", + "top": "unicode/1f51d.png?v8", + "tophat": "unicode/1f3a9.png?v8", + "tornado": "unicode/1f32a.png?v8", + "tr": "unicode/1f1f9-1f1f7.png?v8", + "trackball": "unicode/1f5b2.png?v8", + "tractor": "unicode/1f69c.png?v8", + "traffic_light": "unicode/1f6a5.png?v8", + "train": "unicode/1f68b.png?v8", + "train2": "unicode/1f686.png?v8", + "tram": "unicode/1f68a.png?v8", + "transgender_flag": "unicode/1f3f3-26a7.png?v8", + "transgender_symbol": "unicode/26a7.png?v8", + "triangular_flag_on_post": "unicode/1f6a9.png?v8", + "triangular_ruler": "unicode/1f4d0.png?v8", + "trident": "unicode/1f531.png?v8", + "trinidad_tobago": "unicode/1f1f9-1f1f9.png?v8", + "tristan_da_cunha": "unicode/1f1f9-1f1e6.png?v8", + "triumph": "unicode/1f624.png?v8", + "trolleybus": "unicode/1f68e.png?v8", + "trollface": "trollface.png?v8", + "trophy": "unicode/1f3c6.png?v8", + "tropical_drink": "unicode/1f379.png?v8", + "tropical_fish": "unicode/1f420.png?v8", + "truck": "unicode/1f69a.png?v8", + "trumpet": "unicode/1f3ba.png?v8", + "tshirt": "unicode/1f455.png?v8", + "tulip": "unicode/1f337.png?v8", + "tumbler_glass": "unicode/1f943.png?v8", + "tunisia": "unicode/1f1f9-1f1f3.png?v8", + "turkey": "unicode/1f983.png?v8", + "turkmenistan": "unicode/1f1f9-1f1f2.png?v8", + "turks_caicos_islands": "unicode/1f1f9-1f1e8.png?v8", + "turtle": "unicode/1f422.png?v8", + "tuvalu": "unicode/1f1f9-1f1fb.png?v8", + "tv": "unicode/1f4fa.png?v8", + "twisted_rightwards_arrows": "unicode/1f500.png?v8", + "two": "unicode/0032-20e3.png?v8", + "two_hearts": "unicode/1f495.png?v8", + "two_men_holding_hands": "unicode/1f46c.png?v8", + "two_women_holding_hands": "unicode/1f46d.png?v8", + "u5272": "unicode/1f239.png?v8", + "u5408": "unicode/1f234.png?v8", + "u55b6": "unicode/1f23a.png?v8", + "u6307": "unicode/1f22f.png?v8", + "u6708": "unicode/1f237.png?v8", + "u6709": "unicode/1f236.png?v8", + "u6e80": "unicode/1f235.png?v8", + "u7121": "unicode/1f21a.png?v8", + "u7533": "unicode/1f238.png?v8", + "u7981": "unicode/1f232.png?v8", + "u7a7a": "unicode/1f233.png?v8", + "uganda": "unicode/1f1fa-1f1ec.png?v8", + "uk": "unicode/1f1ec-1f1e7.png?v8", + "ukraine": "unicode/1f1fa-1f1e6.png?v8", + "umbrella": "unicode/2614.png?v8", + "unamused": "unicode/1f612.png?v8", + "underage": "unicode/1f51e.png?v8", + "unicorn": "unicode/1f984.png?v8", + "united_arab_emirates": "unicode/1f1e6-1f1ea.png?v8", + "united_nations": "unicode/1f1fa-1f1f3.png?v8", + "unlock": "unicode/1f513.png?v8", + "up": "unicode/1f199.png?v8", + "upside_down_face": "unicode/1f643.png?v8", + "uruguay": "unicode/1f1fa-1f1fe.png?v8", + "us": "unicode/1f1fa-1f1f8.png?v8", + "us_outlying_islands": "unicode/1f1fa-1f1f2.png?v8", + "us_virgin_islands": "unicode/1f1fb-1f1ee.png?v8", + "uzbekistan": "unicode/1f1fa-1f1ff.png?v8", + "v": "unicode/270c.png?v8", + "vampire": "unicode/1f9db.png?v8", + "vampire_man": "unicode/1f9db-2642.png?v8", + "vampire_woman": "unicode/1f9db-2640.png?v8", + "vanuatu": "unicode/1f1fb-1f1fa.png?v8", + "vatican_city": "unicode/1f1fb-1f1e6.png?v8", + "venezuela": "unicode/1f1fb-1f1ea.png?v8", + "vertical_traffic_light": "unicode/1f6a6.png?v8", + "vhs": "unicode/1f4fc.png?v8", + "vibration_mode": "unicode/1f4f3.png?v8", + "video_camera": "unicode/1f4f9.png?v8", + "video_game": "unicode/1f3ae.png?v8", + "vietnam": "unicode/1f1fb-1f1f3.png?v8", + "violin": "unicode/1f3bb.png?v8", + "virgo": "unicode/264d.png?v8", + "volcano": "unicode/1f30b.png?v8", + "volleyball": "unicode/1f3d0.png?v8", + "vomiting_face": "unicode/1f92e.png?v8", + "vs": "unicode/1f19a.png?v8", + "vulcan_salute": "unicode/1f596.png?v8", + "waffle": "unicode/1f9c7.png?v8", + "wales": "unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8", + "walking": "unicode/1f6b6.png?v8", + "walking_man": "unicode/1f6b6-2642.png?v8", + "walking_woman": "unicode/1f6b6-2640.png?v8", + "wallis_futuna": "unicode/1f1fc-1f1eb.png?v8", + "waning_crescent_moon": "unicode/1f318.png?v8", + "waning_gibbous_moon": "unicode/1f316.png?v8", + "warning": "unicode/26a0.png?v8", + "wastebasket": "unicode/1f5d1.png?v8", + "watch": "unicode/231a.png?v8", + "water_buffalo": "unicode/1f403.png?v8", + "water_polo": "unicode/1f93d.png?v8", + "watermelon": "unicode/1f349.png?v8", + "wave": "unicode/1f44b.png?v8", + "wavy_dash": "unicode/3030.png?v8", + "waxing_crescent_moon": "unicode/1f312.png?v8", + "waxing_gibbous_moon": "unicode/1f314.png?v8", + "wc": "unicode/1f6be.png?v8", + "weary": "unicode/1f629.png?v8", + "wedding": "unicode/1f492.png?v8", + "weight_lifting": "unicode/1f3cb.png?v8", + "weight_lifting_man": "unicode/1f3cb-2642.png?v8", + "weight_lifting_woman": "unicode/1f3cb-2640.png?v8", + "western_sahara": "unicode/1f1ea-1f1ed.png?v8", + "whale": "unicode/1f433.png?v8", + "whale2": "unicode/1f40b.png?v8", + "wheel_of_dharma": "unicode/2638.png?v8", + "wheelchair": "unicode/267f.png?v8", + "white_check_mark": "unicode/2705.png?v8", + "white_circle": "unicode/26aa.png?v8", + "white_flag": "unicode/1f3f3.png?v8", + "white_flower": "unicode/1f4ae.png?v8", + "white_haired_man": "unicode/1f468-1f9b3.png?v8", + "white_haired_woman": "unicode/1f469-1f9b3.png?v8", + "white_heart": "unicode/1f90d.png?v8", + "white_large_square": "unicode/2b1c.png?v8", + "white_medium_small_square": "unicode/25fd.png?v8", + "white_medium_square": "unicode/25fb.png?v8", + "white_small_square": "unicode/25ab.png?v8", + "white_square_button": "unicode/1f533.png?v8", + "wilted_flower": "unicode/1f940.png?v8", + "wind_chime": "unicode/1f390.png?v8", + "wind_face": "unicode/1f32c.png?v8", + "window": "unicode/1fa9f.png?v8", + "wine_glass": "unicode/1f377.png?v8", + "wink": "unicode/1f609.png?v8", + "wolf": "unicode/1f43a.png?v8", + "woman": "unicode/1f469.png?v8", + "woman_artist": "unicode/1f469-1f3a8.png?v8", + "woman_astronaut": "unicode/1f469-1f680.png?v8", + "woman_beard": "unicode/1f9d4-2640.png?v8", + "woman_cartwheeling": "unicode/1f938-2640.png?v8", + "woman_cook": "unicode/1f469-1f373.png?v8", + "woman_dancing": "unicode/1f483.png?v8", + "woman_facepalming": "unicode/1f926-2640.png?v8", + "woman_factory_worker": "unicode/1f469-1f3ed.png?v8", + "woman_farmer": "unicode/1f469-1f33e.png?v8", + "woman_feeding_baby": "unicode/1f469-1f37c.png?v8", + "woman_firefighter": "unicode/1f469-1f692.png?v8", + "woman_health_worker": "unicode/1f469-2695.png?v8", + "woman_in_manual_wheelchair": "unicode/1f469-1f9bd.png?v8", + "woman_in_motorized_wheelchair": "unicode/1f469-1f9bc.png?v8", + "woman_in_tuxedo": "unicode/1f935-2640.png?v8", + "woman_judge": "unicode/1f469-2696.png?v8", + "woman_juggling": "unicode/1f939-2640.png?v8", + "woman_mechanic": "unicode/1f469-1f527.png?v8", + "woman_office_worker": "unicode/1f469-1f4bc.png?v8", + "woman_pilot": "unicode/1f469-2708.png?v8", + "woman_playing_handball": "unicode/1f93e-2640.png?v8", + "woman_playing_water_polo": "unicode/1f93d-2640.png?v8", + "woman_scientist": "unicode/1f469-1f52c.png?v8", + "woman_shrugging": "unicode/1f937-2640.png?v8", + "woman_singer": "unicode/1f469-1f3a4.png?v8", + "woman_student": "unicode/1f469-1f393.png?v8", + "woman_teacher": "unicode/1f469-1f3eb.png?v8", + "woman_technologist": "unicode/1f469-1f4bb.png?v8", + "woman_with_headscarf": "unicode/1f9d5.png?v8", + "woman_with_probing_cane": "unicode/1f469-1f9af.png?v8", + "woman_with_turban": "unicode/1f473-2640.png?v8", + "woman_with_veil": "unicode/1f470-2640.png?v8", + "womans_clothes": "unicode/1f45a.png?v8", + "womans_hat": "unicode/1f452.png?v8", + "women_wrestling": "unicode/1f93c-2640.png?v8", + "womens": "unicode/1f6ba.png?v8", + "wood": "unicode/1fab5.png?v8", + "woozy_face": "unicode/1f974.png?v8", + "world_map": "unicode/1f5fa.png?v8", + "worm": "unicode/1fab1.png?v8", + "worried": "unicode/1f61f.png?v8", + "wrench": "unicode/1f527.png?v8", + "wrestling": "unicode/1f93c.png?v8", + "writing_hand": "unicode/270d.png?v8", + "x": "unicode/274c.png?v8", + "yarn": "unicode/1f9f6.png?v8", + "yawning_face": "unicode/1f971.png?v8", + "yellow_circle": "unicode/1f7e1.png?v8", + "yellow_heart": "unicode/1f49b.png?v8", + "yellow_square": "unicode/1f7e8.png?v8", + "yemen": "unicode/1f1fe-1f1ea.png?v8", + "yen": "unicode/1f4b4.png?v8", + "yin_yang": "unicode/262f.png?v8", + "yo_yo": "unicode/1fa80.png?v8", + "yum": "unicode/1f60b.png?v8", + "zambia": "unicode/1f1ff-1f1f2.png?v8", + "zany_face": "unicode/1f92a.png?v8", + "zap": "unicode/26a1.png?v8", + "zebra": "unicode/1f993.png?v8", + "zero": "unicode/0030-20e3.png?v8", + "zimbabwe": "unicode/1f1ff-1f1fc.png?v8", + "zipper_mouth_face": "unicode/1f910.png?v8", + "zombie": "unicode/1f9df.png?v8", + "zombie_man": "unicode/1f9df-2642.png?v8", + "zombie_woman": "unicode/1f9df-2640.png?v8", + "zzz": "unicode/1f4a4.png?v8" + } + }; + + function replaceEmojiShorthand(m, $1, useNativeEmoji) { + var emojiMatch = emojiData.data[$1]; + + var result = m; + + if (emojiMatch) { + if (useNativeEmoji && /unicode/.test(emojiMatch)) { + var emojiUnicode = emojiMatch + .replace('unicode/', '') + .replace(/\.png.*/, '') + .split('-') + .map(function (u) { return ("&#x" + u + ";"); }) + // Separate multi-character emoji with zero width joiner sequence (ZWJ) + // Hat tip: https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/#emoji-made-up-of-multiple-characters + .join('‍') + .concat('︎'); + result = "" + emojiUnicode + ""; + } else { + result = "\"""; + } + } + + return result; + } + + function emojify(text, useNativeEmoji) { + return ( + text + // Mark colons in tags + .replace( + /<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g, + function (m) { return m.replace(/:/g, '__colon__'); } + ) + // Mark colons in comments + .replace(//g, function (m) { return m.replace(/:/g, '__colon__'); }) + // Mark colons in URIs + .replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi, function (m) { return m.replace(/:/g, '__colon__'); } + ) + // Replace emoji shorthand codes + .replace(/:([a-z0-9_\-+]+?):/g, function (m, $1) { return replaceEmojiShorthand(m, $1, useNativeEmoji); } + ) + // Restore colons in tags and comments + .replace(/__colon__/g, ':') + ); + } + + /** + * Converts a colon formatted string to a object with properties. + * + * This is process a provided string and look for any tokens in the format + * of `:name[=value]` and then convert it to a object and return. + * An example of this is ':include :type=code :fragment=demo' is taken and + * then converted to: + * + * ``` + * { + * include: '', + * type: 'code', + * fragment: 'demo' + * } + * ``` + * + * @param {string} str The string to parse. + * + * @return {object} The original string and parsed object, { str, config }. + */ + function getAndRemoveConfig(str) { + if ( str === void 0 ) str = ''; + + var config = {}; + + if (str) { + str = str + .replace(/^('|")/, '') + .replace(/('|")$/, '') + .replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, function (m, key, value) { + if (key.indexOf(':') === -1) { + config[key] = (value && value.replace(/"/g, '')) || true; + return ''; + } + + return m; + }) + .trim(); + } + + return { str: str, config: config }; + } + + /** + * Remove the tag from sidebar when the header with link, details see issue 1069 + * @param {string} str The string to deal with. + * + * @return {string} str The string after delete the element. + */ + function removeAtag(str) { + if ( str === void 0 ) str = ''; + + return str.replace(/(<\/?a.*?>)/gi, ''); + } + + var imageCompiler = function (ref) { + var renderer = ref.renderer; + var contentBase = ref.contentBase; + var router = ref.router; + + return (renderer.image = function (href, title, text) { + var url = href; + var attrs = []; + + var ref = getAndRemoveConfig(title); + var str = ref.str; + var config = ref.config; + title = str; + + if (config['no-zoom']) { + attrs.push('data-no-zoom'); + } + + if (title) { + attrs.push(("title=\"" + title + "\"")); + } + + if (config.size) { + var ref$1 = config.size.split('x'); + var width = ref$1[0]; + var height = ref$1[1]; + if (height) { + attrs.push(("width=\"" + width + "\" height=\"" + height + "\"")); + } else { + attrs.push(("width=\"" + width + "\"")); + } + } + + if (config.class) { + attrs.push(("class=\"" + (config.class) + "\"")); + } + + if (config.id) { + attrs.push(("id=\"" + (config.id) + "\"")); + } + + if (!isAbsolutePath(href)) { + url = getPath(contentBase, getParentPath(router.getCurrentPath()), href); + } + + if (attrs.length > 0) { + return ("\"""); + } + + return ("\"""); + }); + }; + + var prism = createCommonjsModule(function (module) { + /* ********************************************** + Begin prism-core.js + ********************************************** */ + + /// + + var _self = (typeof window !== 'undefined') + ? window // if in browser + : ( + (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) + ? self // if in worker + : {} // if in node js + ); + + /** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */ + var Prism = (function (_self) { + + // Private helper vars + var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; + var uniqueId = 0; + + // The grammar object for plaintext + var plainTextGrammar = {}; + + + var _ = { + /** + * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the + * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load + * additional languages or plugins yourself. + * + * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. + * + * You obviously have to change this value before the automatic highlighting started. To do this, you can add an + * empty Prism object into the global scope before loading the Prism script like this: + * + * ```js + * window.Prism = window.Prism || {}; + * Prism.manual = true; + * // add a new + + + + +
    +
    + + + ndrew + + + @2023 +
    + + + + + + + + diff --git a/attachments/russia/js/GlslCanvas.min.js b/attachments/russia/js/GlslCanvas.min.js new file mode 100644 index 0000000..9f41ad4 --- /dev/null +++ b/attachments/russia/js/GlslCanvas.min.js @@ -0,0 +1,3085 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GlslCanvas = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1 ? arguments[1] : undefined, 3) + , entry; + while(entry = entry ? entry.n : this._f){ + f(entry.v, entry.k, this); + // revert to the last existing entry + while(entry && entry.r)entry = entry.p; + } + }, + // 23.1.3.7 Map.prototype.has(key) + // 23.2.3.7 Set.prototype.has(value) + has: function has(key){ + return !!getEntry(this, key); + } + }); + if(DESCRIPTORS)$.setDesc(C.prototype, 'size', { + get: function(){ + return defined(this[SIZE]); + } + }); + return C; + }, + def: function(that, key, value){ + var entry = getEntry(that, key) + , prev, index; + // change existing entry + if(entry){ + entry.v = value; + // create new entry + } else { + that._l = entry = { + i: index = fastKey(key, true), // <- index + k: key, // <- key + v: value, // <- value + p: prev = that._l, // <- previous entry + n: undefined, // <- next entry + r: false // <- removed + }; + if(!that._f)that._f = entry; + if(prev)prev.n = entry; + that[SIZE]++; + // add to index + if(index !== 'F')that._i[index] = entry; + } return that; + }, + getEntry: getEntry, + setStrong: function(C, NAME, IS_MAP){ + // add .keys, .values, .entries, [@@iterator] + // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 + $iterDefine(C, NAME, function(iterated, kind){ + this._t = iterated; // target + this._k = kind; // kind + this._l = undefined; // previous + }, function(){ + var that = this + , kind = that._k + , entry = that._l; + // revert to the last existing entry + while(entry && entry.r)entry = entry.p; + // get next entry + if(!that._t || !(that._l = entry = entry ? entry.n : that._t._f)){ + // or finish the iteration + that._t = undefined; + return step(1); + } + // return step by kind + if(kind == 'keys' )return step(0, entry.k); + if(kind == 'values')return step(0, entry.v); + return step(0, [entry.k, entry.v]); + }, IS_MAP ? 'entries' : 'values' , !IS_MAP, true); + + // add [@@species], 23.1.2.2, 23.2.2.2 + setSpecies(NAME); + } +}; +},{"./$":49,"./$.ctx":28,"./$.defined":29,"./$.descriptors":30,"./$.for-of":34,"./$.has":36,"./$.hide":37,"./$.is-object":42,"./$.iter-define":45,"./$.iter-step":47,"./$.redefine-all":55,"./$.set-species":59,"./$.strict-new":63,"./$.uid":70}],25:[function(_dereq_,module,exports){ +// https://github.com/DavidBruant/Map-Set.prototype.toJSON +var forOf = _dereq_('./$.for-of') + , classof = _dereq_('./$.classof'); +module.exports = function(NAME){ + return function toJSON(){ + if(classof(this) != NAME)throw TypeError(NAME + "#toJSON isn't generic"); + var arr = []; + forOf(this, false, arr.push, arr); + return arr; + }; +}; +},{"./$.classof":22,"./$.for-of":34}],26:[function(_dereq_,module,exports){ +'use strict'; +var $ = _dereq_('./$') + , global = _dereq_('./$.global') + , $export = _dereq_('./$.export') + , fails = _dereq_('./$.fails') + , hide = _dereq_('./$.hide') + , redefineAll = _dereq_('./$.redefine-all') + , forOf = _dereq_('./$.for-of') + , strictNew = _dereq_('./$.strict-new') + , isObject = _dereq_('./$.is-object') + , setToStringTag = _dereq_('./$.set-to-string-tag') + , DESCRIPTORS = _dereq_('./$.descriptors'); + +module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){ + var Base = global[NAME] + , C = Base + , ADDER = IS_MAP ? 'set' : 'add' + , proto = C && C.prototype + , O = {}; + if(!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function(){ + new C().entries().next(); + }))){ + // create collection constructor + C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); + redefineAll(C.prototype, methods); + } else { + C = wrapper(function(target, iterable){ + strictNew(target, C, NAME); + target._c = new Base; + if(iterable != undefined)forOf(iterable, IS_MAP, target[ADDER], target); + }); + $.each.call('add,clear,delete,forEach,get,has,set,keys,values,entries'.split(','),function(KEY){ + var IS_ADDER = KEY == 'add' || KEY == 'set'; + if(KEY in proto && !(IS_WEAK && KEY == 'clear'))hide(C.prototype, KEY, function(a, b){ + if(!IS_ADDER && IS_WEAK && !isObject(a))return KEY == 'get' ? undefined : false; + var result = this._c[KEY](a === 0 ? 0 : a, b); + return IS_ADDER ? this : result; + }); + }); + if('size' in proto)$.setDesc(C.prototype, 'size', { + get: function(){ + return this._c.size; + } + }); + } + + setToStringTag(C, NAME); + + O[NAME] = C; + $export($export.G + $export.W + $export.F, O); + + if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP); + + return C; +}; +},{"./$":49,"./$.descriptors":30,"./$.export":32,"./$.fails":33,"./$.for-of":34,"./$.global":35,"./$.hide":37,"./$.is-object":42,"./$.redefine-all":55,"./$.set-to-string-tag":60,"./$.strict-new":63}],27:[function(_dereq_,module,exports){ +var core = module.exports = {version: '1.2.6'}; +if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef +},{}],28:[function(_dereq_,module,exports){ +// optional / simple context binding +var aFunction = _dereq_('./$.a-function'); +module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; + } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; +}; +},{"./$.a-function":19}],29:[function(_dereq_,module,exports){ +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; +}; +},{}],30:[function(_dereq_,module,exports){ +// Thank's IE8 for his funny defineProperty +module.exports = !_dereq_('./$.fails')(function(){ + return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./$.fails":33}],31:[function(_dereq_,module,exports){ +var isObject = _dereq_('./$.is-object') + , document = _dereq_('./$.global').document + // in old IE typeof document.createElement is 'object' + , is = isObject(document) && isObject(document.createElement); +module.exports = function(it){ + return is ? document.createElement(it) : {}; +}; +},{"./$.global":35,"./$.is-object":42}],32:[function(_dereq_,module,exports){ +var global = _dereq_('./$.global') + , core = _dereq_('./$.core') + , ctx = _dereq_('./$.ctx') + , PROTOTYPE = 'prototype'; + +var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , IS_WRAP = type & $export.W + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] + , key, own, out; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && key in target; + if(own && key in exports)continue; + // export native or passed + out = own ? target[key] : source[key]; + // prevent global pollution for namespaces + exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] + // bind timers to global for call from export context + : IS_BIND && own ? ctx(out, global) + // wrap global constructors for prevent change them in library + : IS_WRAP && target[key] == out ? (function(C){ + var F = function(param){ + return this instanceof C ? new C(param) : C(param); + }; + F[PROTOTYPE] = C[PROTOTYPE]; + return F; + // make static versions for prototype methods + })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + if(IS_PROTO)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out; + } +}; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +module.exports = $export; +},{"./$.core":27,"./$.ctx":28,"./$.global":35}],33:[function(_dereq_,module,exports){ +module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; + } +}; +},{}],34:[function(_dereq_,module,exports){ +var ctx = _dereq_('./$.ctx') + , call = _dereq_('./$.iter-call') + , isArrayIter = _dereq_('./$.is-array-iter') + , anObject = _dereq_('./$.an-object') + , toLength = _dereq_('./$.to-length') + , getIterFn = _dereq_('./core.get-iterator-method'); +module.exports = function(iterable, entries, fn, that){ + var iterFn = getIterFn(iterable) + , f = ctx(fn, that, entries ? 2 : 1) + , index = 0 + , length, step, iterator; + if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ + entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ + call(iterator, f, step.value, entries); + } +}; +},{"./$.an-object":21,"./$.ctx":28,"./$.is-array-iter":41,"./$.iter-call":43,"./$.to-length":68,"./core.get-iterator-method":72}],35:[function(_dereq_,module,exports){ +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); +if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef +},{}],36:[function(_dereq_,module,exports){ +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function(it, key){ + return hasOwnProperty.call(it, key); +}; +},{}],37:[function(_dereq_,module,exports){ +var $ = _dereq_('./$') + , createDesc = _dereq_('./$.property-desc'); +module.exports = _dereq_('./$.descriptors') ? function(object, key, value){ + return $.setDesc(object, key, createDesc(1, value)); +} : function(object, key, value){ + object[key] = value; + return object; +}; +},{"./$":49,"./$.descriptors":30,"./$.property-desc":54}],38:[function(_dereq_,module,exports){ +module.exports = _dereq_('./$.global').document && document.documentElement; +},{"./$.global":35}],39:[function(_dereq_,module,exports){ +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function(fn, args, that){ + var un = that === undefined; + switch(args.length){ + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; +},{}],40:[function(_dereq_,module,exports){ +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = _dereq_('./$.cof'); +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ + return cof(it) == 'String' ? it.split('') : Object(it); +}; +},{"./$.cof":23}],41:[function(_dereq_,module,exports){ +// check on default Array iterator +var Iterators = _dereq_('./$.iterators') + , ITERATOR = _dereq_('./$.wks')('iterator') + , ArrayProto = Array.prototype; + +module.exports = function(it){ + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; +},{"./$.iterators":48,"./$.wks":71}],42:[function(_dereq_,module,exports){ +module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; +},{}],43:[function(_dereq_,module,exports){ +// call something on iterator step with safe closing on error +var anObject = _dereq_('./$.an-object'); +module.exports = function(iterator, fn, value, entries){ + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch(e){ + var ret = iterator['return']; + if(ret !== undefined)anObject(ret.call(iterator)); + throw e; + } +}; +},{"./$.an-object":21}],44:[function(_dereq_,module,exports){ +'use strict'; +var $ = _dereq_('./$') + , descriptor = _dereq_('./$.property-desc') + , setToStringTag = _dereq_('./$.set-to-string-tag') + , IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +_dereq_('./$.hide')(IteratorPrototype, _dereq_('./$.wks')('iterator'), function(){ return this; }); + +module.exports = function(Constructor, NAME, next){ + Constructor.prototype = $.create(IteratorPrototype, {next: descriptor(1, next)}); + setToStringTag(Constructor, NAME + ' Iterator'); +}; +},{"./$":49,"./$.hide":37,"./$.property-desc":54,"./$.set-to-string-tag":60,"./$.wks":71}],45:[function(_dereq_,module,exports){ +'use strict'; +var LIBRARY = _dereq_('./$.library') + , $export = _dereq_('./$.export') + , redefine = _dereq_('./$.redefine') + , hide = _dereq_('./$.hide') + , has = _dereq_('./$.has') + , Iterators = _dereq_('./$.iterators') + , $iterCreate = _dereq_('./$.iter-create') + , setToStringTag = _dereq_('./$.set-to-string-tag') + , getProto = _dereq_('./$').getProto + , ITERATOR = _dereq_('./$.wks')('iterator') + , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` + , FF_ITERATOR = '@@iterator' + , KEYS = 'keys' + , VALUES = 'values'; + +var returnThis = function(){ return this; }; + +module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind){ + if(!BUGGY && kind in proto)return proto[kind]; + switch(kind){ + case KEYS: return function keys(){ return new Constructor(this, kind); }; + case VALUES: return function values(){ return new Constructor(this, kind); }; + } return function entries(){ return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator' + , DEF_VALUES = DEFAULT == VALUES + , VALUES_BUG = false + , proto = Base.prototype + , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] + , $default = $native || getMethod(DEFAULT) + , methods, key; + // Fix native + if($native){ + var IteratorPrototype = getProto($default.call(new Base)); + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // FF fix + if(!LIBRARY && has(proto, FF_ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + // fix Array#{values, @@iterator}.name in V8 / FF + if(DEF_VALUES && $native.name !== VALUES){ + VALUES_BUG = true; + $default = function values(){ return $native.call(this); }; + } + } + // Define iterator + if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if(DEFAULT){ + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: !DEF_VALUES ? $default : getMethod('entries') + }; + if(FORCED)for(key in methods){ + if(!(key in proto))redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; +},{"./$":49,"./$.export":32,"./$.has":36,"./$.hide":37,"./$.iter-create":44,"./$.iterators":48,"./$.library":50,"./$.redefine":56,"./$.set-to-string-tag":60,"./$.wks":71}],46:[function(_dereq_,module,exports){ +var ITERATOR = _dereq_('./$.wks')('iterator') + , SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function(){ SAFE_CLOSING = true; }; + Array.from(riter, function(){ throw 2; }); +} catch(e){ /* empty */ } + +module.exports = function(exec, skipClosing){ + if(!skipClosing && !SAFE_CLOSING)return false; + var safe = false; + try { + var arr = [7] + , iter = arr[ITERATOR](); + iter.next = function(){ safe = true; }; + arr[ITERATOR] = function(){ return iter; }; + exec(arr); + } catch(e){ /* empty */ } + return safe; +}; +},{"./$.wks":71}],47:[function(_dereq_,module,exports){ +module.exports = function(done, value){ + return {value: value, done: !!done}; +}; +},{}],48:[function(_dereq_,module,exports){ +module.exports = {}; +},{}],49:[function(_dereq_,module,exports){ +var $Object = Object; +module.exports = { + create: $Object.create, + getProto: $Object.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: $Object.getOwnPropertyDescriptor, + setDesc: $Object.defineProperty, + setDescs: $Object.defineProperties, + getKeys: $Object.keys, + getNames: $Object.getOwnPropertyNames, + getSymbols: $Object.getOwnPropertySymbols, + each: [].forEach +}; +},{}],50:[function(_dereq_,module,exports){ +module.exports = true; +},{}],51:[function(_dereq_,module,exports){ +var global = _dereq_('./$.global') + , macrotask = _dereq_('./$.task').set + , Observer = global.MutationObserver || global.WebKitMutationObserver + , process = global.process + , Promise = global.Promise + , isNode = _dereq_('./$.cof')(process) == 'process' + , head, last, notify; + +var flush = function(){ + var parent, domain, fn; + if(isNode && (parent = process.domain)){ + process.domain = null; + parent.exit(); + } + while(head){ + domain = head.domain; + fn = head.fn; + if(domain)domain.enter(); + fn(); // <- currently we use it only for Promise - try / catch not required + if(domain)domain.exit(); + head = head.next; + } last = undefined; + if(parent)parent.enter(); +}; + +// Node.js +if(isNode){ + notify = function(){ + process.nextTick(flush); + }; +// browsers with MutationObserver +} else if(Observer){ + var toggle = 1 + , node = document.createTextNode(''); + new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new + notify = function(){ + node.data = toggle = -toggle; + }; +// environments with maybe non-completely correct, but existent Promise +} else if(Promise && Promise.resolve){ + notify = function(){ + Promise.resolve().then(flush); + }; +// for other environments - macrotask based on: +// - setImmediate +// - MessageChannel +// - window.postMessag +// - onreadystatechange +// - setTimeout +} else { + notify = function(){ + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; +} + +module.exports = function asap(fn){ + var task = {fn: fn, next: undefined, domain: isNode && process.domain}; + if(last)last.next = task; + if(!head){ + head = task; + notify(); + } last = task; +}; +},{"./$.cof":23,"./$.global":35,"./$.task":65}],52:[function(_dereq_,module,exports){ +// 19.1.2.1 Object.assign(target, source, ...) +var $ = _dereq_('./$') + , toObject = _dereq_('./$.to-object') + , IObject = _dereq_('./$.iobject'); + +// should work with symbols and should have deterministic property order (V8 bug) +module.exports = _dereq_('./$.fails')(function(){ + var a = Object.assign + , A = {} + , B = {} + , S = Symbol() + , K = 'abcdefghijklmnopqrst'; + A[S] = 7; + K.split('').forEach(function(k){ B[k] = k; }); + return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K; +}) ? function assign(target, source){ // eslint-disable-line no-unused-vars + var T = toObject(target) + , $$ = arguments + , $$len = $$.length + , index = 1 + , getKeys = $.getKeys + , getSymbols = $.getSymbols + , isEnum = $.isEnum; + while($$len > index){ + var S = IObject($$[index++]) + , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) + , length = keys.length + , j = 0 + , key; + while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; + } + return T; +} : Object.assign; +},{"./$":49,"./$.fails":33,"./$.iobject":40,"./$.to-object":69}],53:[function(_dereq_,module,exports){ +// most Object methods by ES6 should accept primitives +var $export = _dereq_('./$.export') + , core = _dereq_('./$.core') + , fails = _dereq_('./$.fails'); +module.exports = function(KEY, exec){ + var fn = (core.Object || {})[KEY] || Object[KEY] + , exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); +}; +},{"./$.core":27,"./$.export":32,"./$.fails":33}],54:[function(_dereq_,module,exports){ +module.exports = function(bitmap, value){ + return { + enumerable : !(bitmap & 1), + configurable: !(bitmap & 2), + writable : !(bitmap & 4), + value : value + }; +}; +},{}],55:[function(_dereq_,module,exports){ +var redefine = _dereq_('./$.redefine'); +module.exports = function(target, src){ + for(var key in src)redefine(target, key, src[key]); + return target; +}; +},{"./$.redefine":56}],56:[function(_dereq_,module,exports){ +module.exports = _dereq_('./$.hide'); +},{"./$.hide":37}],57:[function(_dereq_,module,exports){ +// 7.2.9 SameValue(x, y) +module.exports = Object.is || function is(x, y){ + return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y; +}; +},{}],58:[function(_dereq_,module,exports){ +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var getDesc = _dereq_('./$').getDesc + , isObject = _dereq_('./$.is-object') + , anObject = _dereq_('./$.an-object'); +var check = function(O, proto){ + anObject(O); + if(!isObject(proto) && proto !== null)throw TypeError(proto + ": can't set as prototype!"); +}; +module.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function(test, buggy, set){ + try { + set = _dereq_('./$.ctx')(Function.call, getDesc(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch(e){ buggy = true; } + return function setPrototypeOf(O, proto){ + check(O, proto); + if(buggy)O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; +},{"./$":49,"./$.an-object":21,"./$.ctx":28,"./$.is-object":42}],59:[function(_dereq_,module,exports){ +'use strict'; +var core = _dereq_('./$.core') + , $ = _dereq_('./$') + , DESCRIPTORS = _dereq_('./$.descriptors') + , SPECIES = _dereq_('./$.wks')('species'); + +module.exports = function(KEY){ + var C = core[KEY]; + if(DESCRIPTORS && C && !C[SPECIES])$.setDesc(C, SPECIES, { + configurable: true, + get: function(){ return this; } + }); +}; +},{"./$":49,"./$.core":27,"./$.descriptors":30,"./$.wks":71}],60:[function(_dereq_,module,exports){ +var def = _dereq_('./$').setDesc + , has = _dereq_('./$.has') + , TAG = _dereq_('./$.wks')('toStringTag'); + +module.exports = function(it, tag, stat){ + if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); +}; +},{"./$":49,"./$.has":36,"./$.wks":71}],61:[function(_dereq_,module,exports){ +var global = _dereq_('./$.global') + , SHARED = '__core-js_shared__' + , store = global[SHARED] || (global[SHARED] = {}); +module.exports = function(key){ + return store[key] || (store[key] = {}); +}; +},{"./$.global":35}],62:[function(_dereq_,module,exports){ +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = _dereq_('./$.an-object') + , aFunction = _dereq_('./$.a-function') + , SPECIES = _dereq_('./$.wks')('species'); +module.exports = function(O, D){ + var C = anObject(O).constructor, S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; +},{"./$.a-function":19,"./$.an-object":21,"./$.wks":71}],63:[function(_dereq_,module,exports){ +module.exports = function(it, Constructor, name){ + if(!(it instanceof Constructor))throw TypeError(name + ": use the 'new' operator!"); + return it; +}; +},{}],64:[function(_dereq_,module,exports){ +var toInteger = _dereq_('./$.to-integer') + , defined = _dereq_('./$.defined'); +// true -> String#at +// false -> String#codePointAt +module.exports = function(TO_STRING){ + return function(that, pos){ + var s = String(defined(that)) + , i = toInteger(pos) + , l = s.length + , a, b; + if(i < 0 || i >= l)return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; +},{"./$.defined":29,"./$.to-integer":66}],65:[function(_dereq_,module,exports){ +var ctx = _dereq_('./$.ctx') + , invoke = _dereq_('./$.invoke') + , html = _dereq_('./$.html') + , cel = _dereq_('./$.dom-create') + , global = _dereq_('./$.global') + , process = global.process + , setTask = global.setImmediate + , clearTask = global.clearImmediate + , MessageChannel = global.MessageChannel + , counter = 0 + , queue = {} + , ONREADYSTATECHANGE = 'onreadystatechange' + , defer, channel, port; +var run = function(){ + var id = +this; + if(queue.hasOwnProperty(id)){ + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; +var listner = function(event){ + run.call(event.data); +}; +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if(!setTask || !clearTask){ + setTask = function setImmediate(fn){ + var args = [], i = 1; + while(arguments.length > i)args.push(arguments[i++]); + queue[++counter] = function(){ + invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id){ + delete queue[id]; + }; + // Node.js 0.8- + if(_dereq_('./$.cof')(process) == 'process'){ + defer = function(id){ + process.nextTick(ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if(MessageChannel){ + channel = new MessageChannel; + port = channel.port2; + channel.port1.onmessage = listner; + defer = ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ + defer = function(id){ + global.postMessage(id + '', '*'); + }; + global.addEventListener('message', listner, false); + // IE8- + } else if(ONREADYSTATECHANGE in cel('script')){ + defer = function(id){ + html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ + html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function(id){ + setTimeout(ctx(run, id, 1), 0); + }; + } +} +module.exports = { + set: setTask, + clear: clearTask +}; +},{"./$.cof":23,"./$.ctx":28,"./$.dom-create":31,"./$.global":35,"./$.html":38,"./$.invoke":39}],66:[function(_dereq_,module,exports){ +// 7.1.4 ToInteger +var ceil = Math.ceil + , floor = Math.floor; +module.exports = function(it){ + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; +},{}],67:[function(_dereq_,module,exports){ +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = _dereq_('./$.iobject') + , defined = _dereq_('./$.defined'); +module.exports = function(it){ + return IObject(defined(it)); +}; +},{"./$.defined":29,"./$.iobject":40}],68:[function(_dereq_,module,exports){ +// 7.1.15 ToLength +var toInteger = _dereq_('./$.to-integer') + , min = Math.min; +module.exports = function(it){ + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; +},{"./$.to-integer":66}],69:[function(_dereq_,module,exports){ +// 7.1.13 ToObject(argument) +var defined = _dereq_('./$.defined'); +module.exports = function(it){ + return Object(defined(it)); +}; +},{"./$.defined":29}],70:[function(_dereq_,module,exports){ +var id = 0 + , px = Math.random(); +module.exports = function(key){ + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; +},{}],71:[function(_dereq_,module,exports){ +var store = _dereq_('./$.shared')('wks') + , uid = _dereq_('./$.uid') + , Symbol = _dereq_('./$.global').Symbol; +module.exports = function(name){ + return store[name] || (store[name] = + Symbol && Symbol[name] || (Symbol || uid)('Symbol.' + name)); +}; +},{"./$.global":35,"./$.shared":61,"./$.uid":70}],72:[function(_dereq_,module,exports){ +var classof = _dereq_('./$.classof') + , ITERATOR = _dereq_('./$.wks')('iterator') + , Iterators = _dereq_('./$.iterators'); +module.exports = _dereq_('./$.core').getIteratorMethod = function(it){ + if(it != undefined)return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; +},{"./$.classof":22,"./$.core":27,"./$.iterators":48,"./$.wks":71}],73:[function(_dereq_,module,exports){ +var anObject = _dereq_('./$.an-object') + , get = _dereq_('./core.get-iterator-method'); +module.exports = _dereq_('./$.core').getIterator = function(it){ + var iterFn = get(it); + if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!'); + return anObject(iterFn.call(it)); +}; +},{"./$.an-object":21,"./$.core":27,"./core.get-iterator-method":72}],74:[function(_dereq_,module,exports){ +'use strict'; +var ctx = _dereq_('./$.ctx') + , $export = _dereq_('./$.export') + , toObject = _dereq_('./$.to-object') + , call = _dereq_('./$.iter-call') + , isArrayIter = _dereq_('./$.is-array-iter') + , toLength = _dereq_('./$.to-length') + , getIterFn = _dereq_('./core.get-iterator-method'); +$export($export.S + $export.F * !_dereq_('./$.iter-detect')(function(iter){ Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){ + var O = toObject(arrayLike) + , C = typeof this == 'function' ? this : Array + , $$ = arguments + , $$len = $$.length + , mapfn = $$len > 1 ? $$[1] : undefined + , mapping = mapfn !== undefined + , index = 0 + , iterFn = getIterFn(O) + , length, result, step, iterator; + if(mapping)mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){ + for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){ + result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value; + } + } else { + length = toLength(O.length); + for(result = new C(length); length > index; index++){ + result[index] = mapping ? mapfn(O[index], index) : O[index]; + } + } + result.length = index; + return result; + } +}); + +},{"./$.ctx":28,"./$.export":32,"./$.is-array-iter":41,"./$.iter-call":43,"./$.iter-detect":46,"./$.to-length":68,"./$.to-object":69,"./core.get-iterator-method":72}],75:[function(_dereq_,module,exports){ +'use strict'; +var addToUnscopables = _dereq_('./$.add-to-unscopables') + , step = _dereq_('./$.iter-step') + , Iterators = _dereq_('./$.iterators') + , toIObject = _dereq_('./$.to-iobject'); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = _dereq_('./$.iter-define')(Array, 'Array', function(iterated, kind){ + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function(){ + var O = this._t + , kind = this._k + , index = this._i++; + if(!O || index >= O.length){ + this._t = undefined; + return step(1); + } + if(kind == 'keys' )return step(0, index); + if(kind == 'values')return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); +},{"./$.add-to-unscopables":20,"./$.iter-define":45,"./$.iter-step":47,"./$.iterators":48,"./$.to-iobject":67}],76:[function(_dereq_,module,exports){ +// 19.1.3.1 Object.assign(target, source) +var $export = _dereq_('./$.export'); + +$export($export.S + $export.F, 'Object', {assign: _dereq_('./$.object-assign')}); +},{"./$.export":32,"./$.object-assign":52}],77:[function(_dereq_,module,exports){ +// 19.1.2.14 Object.keys(O) +var toObject = _dereq_('./$.to-object'); + +_dereq_('./$.object-sap')('keys', function($keys){ + return function keys(it){ + return $keys(toObject(it)); + }; +}); +},{"./$.object-sap":53,"./$.to-object":69}],78:[function(_dereq_,module,exports){ + +},{}],79:[function(_dereq_,module,exports){ +'use strict'; +var $ = _dereq_('./$') + , LIBRARY = _dereq_('./$.library') + , global = _dereq_('./$.global') + , ctx = _dereq_('./$.ctx') + , classof = _dereq_('./$.classof') + , $export = _dereq_('./$.export') + , isObject = _dereq_('./$.is-object') + , anObject = _dereq_('./$.an-object') + , aFunction = _dereq_('./$.a-function') + , strictNew = _dereq_('./$.strict-new') + , forOf = _dereq_('./$.for-of') + , setProto = _dereq_('./$.set-proto').set + , same = _dereq_('./$.same-value') + , SPECIES = _dereq_('./$.wks')('species') + , speciesConstructor = _dereq_('./$.species-constructor') + , asap = _dereq_('./$.microtask') + , PROMISE = 'Promise' + , process = global.process + , isNode = classof(process) == 'process' + , P = global[PROMISE] + , Wrapper; + +var testResolve = function(sub){ + var test = new P(function(){}); + if(sub)test.constructor = Object; + return P.resolve(test) === test; +}; + +var USE_NATIVE = function(){ + var works = false; + function P2(x){ + var self = new P(x); + setProto(self, P2.prototype); + return self; + } + try { + works = P && P.resolve && testResolve(); + setProto(P2, P); + P2.prototype = $.create(P.prototype, {constructor: {value: P2}}); + // actual Firefox has broken subclass support, test that + if(!(P2.resolve(5).then(function(){}) instanceof P2)){ + works = false; + } + // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162 + if(works && _dereq_('./$.descriptors')){ + var thenableThenGotten = false; + P.resolve($.setDesc({}, 'then', { + get: function(){ thenableThenGotten = true; } + })); + works = thenableThenGotten; + } + } catch(e){ works = false; } + return works; +}(); + +// helpers +var sameConstructor = function(a, b){ + // library wrapper special case + if(LIBRARY && a === P && b === Wrapper)return true; + return same(a, b); +}; +var getConstructor = function(C){ + var S = anObject(C)[SPECIES]; + return S != undefined ? S : C; +}; +var isThenable = function(it){ + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; +var PromiseCapability = function(C){ + var resolve, reject; + this.promise = new C(function($$resolve, $$reject){ + if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve), + this.reject = aFunction(reject) +}; +var perform = function(exec){ + try { + exec(); + } catch(e){ + return {error: e}; + } +}; +var notify = function(record, isReject){ + if(record.n)return; + record.n = true; + var chain = record.c; + asap(function(){ + var value = record.v + , ok = record.s == 1 + , i = 0; + var run = function(reaction){ + var handler = ok ? reaction.ok : reaction.fail + , resolve = reaction.resolve + , reject = reaction.reject + , result, then; + try { + if(handler){ + if(!ok)record.h = true; + result = handler === true ? value : handler(value); + if(result === reaction.promise){ + reject(TypeError('Promise-chain cycle')); + } else if(then = isThenable(result)){ + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch(e){ + reject(e); + } + }; + while(chain.length > i)run(chain[i++]); // variable length - can't use forEach + chain.length = 0; + record.n = false; + if(isReject)setTimeout(function(){ + var promise = record.p + , handler, console; + if(isUnhandled(promise)){ + if(isNode){ + process.emit('unhandledRejection', value, promise); + } else if(handler = global.onunhandledrejection){ + handler({promise: promise, reason: value}); + } else if((console = global.console) && console.error){ + console.error('Unhandled promise rejection', value); + } + } record.a = undefined; + }, 1); + }); +}; +var isUnhandled = function(promise){ + var record = promise._d + , chain = record.a || record.c + , i = 0 + , reaction; + if(record.h)return false; + while(chain.length > i){ + reaction = chain[i++]; + if(reaction.fail || !isUnhandled(reaction.promise))return false; + } return true; +}; +var $reject = function(value){ + var record = this; + if(record.d)return; + record.d = true; + record = record.r || record; // unwrap + record.v = value; + record.s = 2; + record.a = record.c.slice(); + notify(record, true); +}; +var $resolve = function(value){ + var record = this + , then; + if(record.d)return; + record.d = true; + record = record.r || record; // unwrap + try { + if(record.p === value)throw TypeError("Promise can't be resolved itself"); + if(then = isThenable(value)){ + asap(function(){ + var wrapper = {r: record, d: false}; // wrap + try { + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); + } catch(e){ + $reject.call(wrapper, e); + } + }); + } else { + record.v = value; + record.s = 1; + notify(record, false); + } + } catch(e){ + $reject.call({r: record, d: false}, e); // wrap + } +}; + +// constructor polyfill +if(!USE_NATIVE){ + // 25.4.3.1 Promise(executor) + P = function Promise(executor){ + aFunction(executor); + var record = this._d = { + p: strictNew(this, P, PROMISE), // <- promise + c: [], // <- awaiting reactions + a: undefined, // <- checked in isUnhandled reactions + s: 0, // <- state + d: false, // <- done + v: undefined, // <- value + h: false, // <- handled rejection + n: false // <- notify + }; + try { + executor(ctx($resolve, record, 1), ctx($reject, record, 1)); + } catch(err){ + $reject.call(record, err); + } + }; + _dereq_('./$.redefine-all')(P.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected){ + var reaction = new PromiseCapability(speciesConstructor(this, P)) + , promise = reaction.promise + , record = this._d; + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + record.c.push(reaction); + if(record.a)record.a.push(reaction); + if(record.s)notify(record, false); + return promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function(onRejected){ + return this.then(undefined, onRejected); + } + }); +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: P}); +_dereq_('./$.set-to-string-tag')(P, PROMISE); +_dereq_('./$.set-species')(PROMISE); +Wrapper = _dereq_('./$.core')[PROMISE]; + +// statics +$export($export.S + $export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r){ + var capability = new PromiseCapability(this) + , $$reject = capability.reject; + $$reject(r); + return capability.promise; + } +}); +$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x){ + // instanceof instead of internal slot check because we should fix it without replacement native Promise core + if(x instanceof P && sameConstructor(x.constructor, this))return x; + var capability = new PromiseCapability(this) + , $$resolve = capability.resolve; + $$resolve(x); + return capability.promise; + } +}); +$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./$.iter-detect')(function(iter){ + P.all(iter)['catch'](function(){}); +})), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable){ + var C = getConstructor(this) + , capability = new PromiseCapability(C) + , resolve = capability.resolve + , reject = capability.reject + , values = []; + var abrupt = perform(function(){ + forOf(iterable, false, values.push, values); + var remaining = values.length + , results = Array(remaining); + if(remaining)$.each.call(values, function(promise, index){ + var alreadyCalled = false; + C.resolve(promise).then(function(value){ + if(alreadyCalled)return; + alreadyCalled = true; + results[index] = value; + --remaining || resolve(results); + }, reject); + }); + else resolve(results); + }); + if(abrupt)reject(abrupt.error); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable){ + var C = getConstructor(this) + , capability = new PromiseCapability(C) + , reject = capability.reject; + var abrupt = perform(function(){ + forOf(iterable, false, function(promise){ + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if(abrupt)reject(abrupt.error); + return capability.promise; + } +}); +},{"./$":49,"./$.a-function":19,"./$.an-object":21,"./$.classof":22,"./$.core":27,"./$.ctx":28,"./$.descriptors":30,"./$.export":32,"./$.for-of":34,"./$.global":35,"./$.is-object":42,"./$.iter-detect":46,"./$.library":50,"./$.microtask":51,"./$.redefine-all":55,"./$.same-value":57,"./$.set-proto":58,"./$.set-species":59,"./$.set-to-string-tag":60,"./$.species-constructor":62,"./$.strict-new":63,"./$.wks":71}],80:[function(_dereq_,module,exports){ +'use strict'; +var strong = _dereq_('./$.collection-strong'); + +// 23.2 Set Objects +_dereq_('./$.collection')('Set', function(get){ + return function Set(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); }; +}, { + // 23.2.3.1 Set.prototype.add(value) + add: function add(value){ + return strong.def(this, value = value === 0 ? 0 : value, value); + } +}, strong); +},{"./$.collection":26,"./$.collection-strong":24}],81:[function(_dereq_,module,exports){ +'use strict'; +var $at = _dereq_('./$.string-at')(true); + +// 21.1.3.27 String.prototype[@@iterator]() +_dereq_('./$.iter-define')(String, 'String', function(iterated){ + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function(){ + var O = this._t + , index = this._i + , point; + if(index >= O.length)return {value: undefined, done: true}; + point = $at(O, index); + this._i += point.length; + return {value: point, done: false}; +}); +},{"./$.iter-define":45,"./$.string-at":64}],82:[function(_dereq_,module,exports){ +// https://github.com/DavidBruant/Map-Set.prototype.toJSON +var $export = _dereq_('./$.export'); + +$export($export.P, 'Set', {toJSON: _dereq_('./$.collection-to-json')('Set')}); +},{"./$.collection-to-json":25,"./$.export":32}],83:[function(_dereq_,module,exports){ +_dereq_('./es6.array.iterator'); +var Iterators = _dereq_('./$.iterators'); +Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array; +},{"./$.iterators":48,"./es6.array.iterator":75}],84:[function(_dereq_,module,exports){ +var isFunction = _dereq_('is-function') + +module.exports = forEach + +var toString = Object.prototype.toString +var hasOwnProperty = Object.prototype.hasOwnProperty + +function forEach(list, iterator, context) { + if (!isFunction(iterator)) { + throw new TypeError('iterator must be a function') + } + + if (arguments.length < 3) { + context = this + } + + if (toString.call(list) === '[object Array]') + forEachArray(list, iterator, context) + else if (typeof list === 'string') + forEachString(list, iterator, context) + else + forEachObject(list, iterator, context) +} + +function forEachArray(array, iterator, context) { + for (var i = 0, len = array.length; i < len; i++) { + if (hasOwnProperty.call(array, i)) { + iterator.call(context, array[i], i, array) + } + } +} + +function forEachString(string, iterator, context) { + for (var i = 0, len = string.length; i < len; i++) { + // no such thing as a sparse string. + iterator.call(context, string.charAt(i), i, string) + } +} + +function forEachObject(object, iterator, context) { + for (var k in object) { + if (hasOwnProperty.call(object, k)) { + iterator.call(context, object[k], k, object) + } + } +} + +},{"is-function":86}],85:[function(_dereq_,module,exports){ +(function (global){ +if (typeof window !== "undefined") { + module.exports = window; +} else if (typeof global !== "undefined") { + module.exports = global; +} else if (typeof self !== "undefined"){ + module.exports = self; +} else { + module.exports = {}; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],86:[function(_dereq_,module,exports){ +module.exports = isFunction + +var toString = Object.prototype.toString + +function isFunction (fn) { + var string = toString.call(fn) + return string === '[object Function]' || + (typeof fn === 'function' && string !== '[object RegExp]') || + (typeof window !== 'undefined' && + // IE8 and below + (fn === window.setTimeout || + fn === window.alert || + fn === window.confirm || + fn === window.prompt)) +}; + +},{}],87:[function(_dereq_,module,exports){ +var trim = _dereq_('trim') + , forEach = _dereq_('for-each') + , isArray = function(arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; + } + +module.exports = function (headers) { + if (!headers) + return {} + + var result = {} + + forEach( + trim(headers).split('\n') + , function (row) { + var index = row.indexOf(':') + , key = trim(row.slice(0, index)).toLowerCase() + , value = trim(row.slice(index + 1)) + + if (typeof(result[key]) === 'undefined') { + result[key] = value + } else if (isArray(result[key])) { + result[key].push(value) + } else { + result[key] = [ result[key], value ] + } + } + ) + + return result +} +},{"for-each":84,"trim":88}],88:[function(_dereq_,module,exports){ + +exports = module.exports = trim; + +function trim(str){ + return str.replace(/^\s*|\s*$/g, ''); +} + +exports.left = function(str){ + return str.replace(/^\s*/, ''); +}; + +exports.right = function(str){ + return str.replace(/\s*$/, ''); +}; + +},{}],89:[function(_dereq_,module,exports){ +"use strict"; +var window = _dereq_("global/window") +var once = _dereq_("once") +var isFunction = _dereq_("is-function") +var parseHeaders = _dereq_("parse-headers") +var xtend = _dereq_("xtend") + +module.exports = createXHR +createXHR.XMLHttpRequest = window.XMLHttpRequest || noop +createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest + +forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) { + createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) { + options = initParams(uri, options, callback) + options.method = method.toUpperCase() + return _createXHR(options) + } +}) + +function forEachArray(array, iterator) { + for (var i = 0; i < array.length; i++) { + iterator(array[i]) + } +} + +function isEmpty(obj){ + for(var i in obj){ + if(obj.hasOwnProperty(i)) return false + } + return true +} + +function initParams(uri, options, callback) { + var params = uri + + if (isFunction(options)) { + callback = options + if (typeof uri === "string") { + params = {uri:uri} + } + } else { + params = xtend(options, {uri: uri}) + } + + params.callback = callback + return params +} + +function createXHR(uri, options, callback) { + options = initParams(uri, options, callback) + return _createXHR(options) +} + +function _createXHR(options) { + var callback = options.callback + if(typeof callback === "undefined"){ + throw new Error("callback argument missing") + } + callback = once(callback) + + function readystatechange() { + if (xhr.readyState === 4) { + loadFunc() + } + } + + function getBody() { + // Chrome with requestType=blob throws errors arround when even testing access to responseText + var body = undefined + + if (xhr.response) { + body = xhr.response + } else if (xhr.responseType === "text" || !xhr.responseType) { + body = xhr.responseText || xhr.responseXML + } + + if (isJson) { + try { + body = JSON.parse(body) + } catch (e) {} + } + + return body + } + + var failureResponse = { + body: undefined, + headers: {}, + statusCode: 0, + method: method, + url: uri, + rawRequest: xhr + } + + function errorFunc(evt) { + clearTimeout(timeoutTimer) + if(!(evt instanceof Error)){ + evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") ) + } + evt.statusCode = 0 + callback(evt, failureResponse) + } + + // will load the data & process the response in a special response object + function loadFunc() { + if (aborted) return + var status + clearTimeout(timeoutTimer) + if(options.useXDR && xhr.status===undefined) { + //IE8 CORS GET successful response doesn't have a status field, but body is fine + status = 200 + } else { + status = (xhr.status === 1223 ? 204 : xhr.status) + } + var response = failureResponse + var err = null + + if (status !== 0){ + response = { + body: getBody(), + statusCode: status, + method: method, + headers: {}, + url: uri, + rawRequest: xhr + } + if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE + response.headers = parseHeaders(xhr.getAllResponseHeaders()) + } + } else { + err = new Error("Internal XMLHttpRequest Error") + } + callback(err, response, response.body) + + } + + var xhr = options.xhr || null + + if (!xhr) { + if (options.cors || options.useXDR) { + xhr = new createXHR.XDomainRequest() + }else{ + xhr = new createXHR.XMLHttpRequest() + } + } + + var key + var aborted + var uri = xhr.url = options.uri || options.url + var method = xhr.method = options.method || "GET" + var body = options.body || options.data || null + var headers = xhr.headers = options.headers || {} + var sync = !!options.sync + var isJson = false + var timeoutTimer + + if ("json" in options) { + isJson = true + headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user + if (method !== "GET" && method !== "HEAD") { + headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user + body = JSON.stringify(options.json) + } + } + + xhr.onreadystatechange = readystatechange + xhr.onload = loadFunc + xhr.onerror = errorFunc + // IE9 must have onprogress be set to a unique function. + xhr.onprogress = function () { + // IE must die + } + xhr.ontimeout = errorFunc + xhr.open(method, uri, !sync, options.username, options.password) + //has to be after open + if(!sync) { + xhr.withCredentials = !!options.withCredentials + } + // Cannot set timeout with sync request + // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly + // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent + if (!sync && options.timeout > 0 ) { + timeoutTimer = setTimeout(function(){ + aborted=true//IE9 may still call readystatechange + xhr.abort("timeout") + var e = new Error("XMLHttpRequest timeout") + e.code = "ETIMEDOUT" + errorFunc(e) + }, options.timeout ) + } + + if (xhr.setRequestHeader) { + for(key in headers){ + if(headers.hasOwnProperty(key)){ + xhr.setRequestHeader(key, headers[key]) + } + } + } else if (options.headers && !isEmpty(options.headers)) { + throw new Error("Headers cannot be set on an XDomainRequest object") + } + + if ("responseType" in options) { + xhr.responseType = options.responseType + } + + if ("beforeSend" in options && + typeof options.beforeSend === "function" + ) { + options.beforeSend(xhr) + } + + xhr.send(body) + + return xhr + + +} + +function noop() {} + +},{"global/window":85,"is-function":86,"once":90,"parse-headers":87,"xtend":91}],90:[function(_dereq_,module,exports){ +module.exports = once + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) +}) + +function once (fn) { + var called = false + return function () { + if (called) return + called = true + return fn.apply(this, arguments) + } +} + +},{}],91:[function(_dereq_,module,exports){ +module.exports = extend + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +function extend() { + var target = {} + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target +} + +},{}],92:[function(_dereq_,module,exports){ +/* +The MIT License (MIT) + +Copyright (c) 2015 Patricio Gonzalez Vivo ( http://www.patriciogonzalezvivo.com ) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +'use strict'; + +var _createClass = _dereq_('babel-runtime/helpers/create-class')['default']; + +var _classCallCheck = _dereq_('babel-runtime/helpers/class-call-check')['default']; + +var _interopRequireDefault = _dereq_('babel-runtime/helpers/interop-require-default')['default']; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _xhr = _dereq_('xhr'); + +var _xhr2 = _interopRequireDefault(_xhr); + +var _glGl = _dereq_('./gl/gl'); + +var _glTexture = _dereq_('./gl/Texture'); + +var _glTexture2 = _interopRequireDefault(_glTexture); + +var _toolsCommon = _dereq_('./tools/common'); + +var _toolsMixin = _dereq_('./tools/mixin'); + +var GlslCanvas = (function () { + function GlslCanvas(canvas, options) { + var _this = this; + + _classCallCheck(this, GlslCanvas); + + (0, _toolsMixin.subscribeMixin)(this); + + options = options || {}; + + this.width = canvas.clientWidth; + this.height = canvas.clientHeight; + + this.canvas = canvas; + this.gl = undefined; + this.program = undefined; + this.uniforms = {}; + this.vbo = {}; + this.isValid = false; + + this.vertexString = options.vertexString || '\n#ifdef GL_ES\nprecision mediump float;\n#endif\n\nattribute vec2 a_position;\nattribute vec2 a_texcoord;\n\nvarying vec2 v_texcoord;\n\nvoid main() {\n gl_Position = vec4(a_position, 0.0, 1.0);\n v_texcoord = a_texcoord;\n}\n'; + this.fragmentString = options.fragmentString || '\n#ifdef GL_ES\nprecision mediump float;\n#endif\n\nvarying vec2 v_texcoord;\n\nvoid main(){\n gl_FragColor = vec4(0.0);\n}\n'; + + // GL Context + var gl = (0, _glGl.setupWebGL)(canvas, options); + if (!gl) { + return; + } + this.gl = gl; + this.timeLoad = Date.now(); + this.forceRender = true; + + // Allow alpha + canvas.style.backgroundColor = options.backgroundColor || 'rgba(1,1,1,0)'; + + // Load shader + if (canvas.hasAttribute('data-fragment')) { + this.fragmentString = canvas.getAttribute('data-fragment'); + } else if (canvas.hasAttribute('data-fragment-url')) { + var source = canvas.getAttribute('data-fragment-url'); + _xhr2['default'].get(source, function (error, response, body) { + _this.load(body, _this.vertexString); + }); + } + + // Load shader + if (canvas.hasAttribute('data-vertex')) { + this.vertexString = canvas.getAttribute('data-vertex'); + } else if (canvas.hasAttribute('data-vertex-url')) { + var source = canvas.getAttribute('data-vertex-url'); + _xhr2['default'].get(source, function (error, response, body) { + _this.load(_this.fragmentString, body); + }); + } + + this.load(); + + if (!this.program) { + return; + } + + // Define Vertex buffer + var texCoordsLoc = gl.getAttribLocation(this.program, 'a_texcoord'); + this.vbo.texCoords = gl.createBuffer(); + this.gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo.texCoords); + this.gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW); + this.gl.enableVertexAttribArray(texCoordsLoc); + this.gl.vertexAttribPointer(texCoordsLoc, 2, gl.FLOAT, false, 0, 0); + + var verticesLoc = gl.getAttribLocation(this.program, 'a_position'); + this.vbo.vertices = gl.createBuffer(); + this.gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo.vertices); + this.gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0]), gl.STATIC_DRAW); + this.gl.enableVertexAttribArray(verticesLoc); + this.gl.vertexAttribPointer(verticesLoc, 2, gl.FLOAT, false, 0, 0); + + // load TEXTURES + this.textures = {}; + if (canvas.hasAttribute('data-textures')) { + var imgList = canvas.getAttribute('data-textures').split(','); + for (var nImg in imgList) { + this.setUniform('u_tex' + nImg, imgList[nImg]); + } + } + + // ========================== EVENTS + var mouse = { + x: 0, + y: 0 + }; + document.addEventListener('mousemove', function (e) { + mouse.x = e.clientX || e.pageX; + mouse.y = e.clientY || e.pageY; + }, false); + + var sandbox = this; + function RenderLoop() { + sandbox.setMouse(mouse); + sandbox.render(); + sandbox.forceRender = sandbox.resize(); + window.requestAnimationFrame(RenderLoop); + } + + // Start + this.setMouse({ x: 0, y: 0 }); + RenderLoop(); + return this; + } + + _createClass(GlslCanvas, [{ + key: 'destroy', + value: function destroy() { + this.animated = false; + this.isValid = false; + for (var tex in this.textures) { + this.gl.deleteTexture(tex); + } + this.textures = {}; + for (var att in this.attribs) { + this.gl.deleteBuffer(this.attribs[att]); + } + this.gl.useProgram(null); + this.gl.deleteProgram(this.program); + this.program = null; + this.gl = null; + } + }, { + key: 'load', + value: function load(fragString, vertString) { + // Load vertex shader if there is one + if (vertString) { + this.vertexString = vertString; + } + + // Load fragment shader if there is one + if (fragString) { + this.fragmentString = fragString; + } + + this.animated = false; + var nTimes = (this.fragmentString.match(/u_time/g) || []).length; + var nMouse = (this.fragmentString.match(/u_mouse/g) || []).length; + this.animated = nTimes > 1 || nMouse > 1; + + var vertexShader = (0, _glGl.createShader)(this, this.vertexString, this.gl.VERTEX_SHADER); + var fragmentShader = (0, _glGl.createShader)(this, this.fragmentString, this.gl.FRAGMENT_SHADER); + + // If Fragment shader fails load a empty one to sign the error + if (!fragmentShader) { + fragmentShader = (0, _glGl.createShader)(this, 'void main(){\n\tgl_FragColor = vec4(1.0);\n}', this.gl.FRAGMENT_SHADER); + this.isValid = false; + } else { + this.isValid = true; + } + + // Create and use program + var program = (0, _glGl.createProgram)(this, [vertexShader, fragmentShader]); //, [0,1],['a_texcoord','a_position']); + this.gl.useProgram(program); + + // Delete shaders + // this.gl.detachShader(program, vertexShader); + // this.gl.detachShader(program, fragmentShader); + this.gl.deleteShader(vertexShader); + this.gl.deleteShader(fragmentShader); + + this.program = program; + this.change = true; + + // Trigger event + this.trigger('load', {}); + + this.forceRender = true; + } + }, { + key: 'loadTexture', + value: function loadTexture(name, urlElementOrData, options) { + var _this2 = this; + + if (!options) { + options = {}; + } + + if (typeof urlElementOrData === 'string') { + options.url = urlElementOrData; + } else if (typeof urlElementOrData === 'object' && urlElementOrData.data && urlElementOrData.width && urlElementOrData.height) { + options.data = urlElementOrData.data; + options.width = urlElementOrData.width; + options.height = urlElementOrData.height; + } else if (typeof urlElementOrData === 'object') { + options.element = urlElementOrData; + } + this.textures[name] = new _glTexture2['default'](this.gl, name, options); + this.textures[name].on('loaded', function (args) { + _this2.forceRender = true; + }); + } + }, { + key: 'refreshUniforms', + value: function refreshUniforms() { + this.uniforms = {}; + } + }, { + key: 'setUniform', + value: function setUniform(name) { + var u = {}; + + for (var _len = arguments.length, value = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + value[_key - 1] = arguments[_key]; + } + + u[name] = value; + this.setUniforms(u); + } + }, { + key: 'setUniforms', + value: function setUniforms(uniforms) { + var parsed = (0, _glGl.parseUniforms)(uniforms); + // Set each uniform + for (var u in parsed) { + if (parsed[u].type === 'sampler2D') { + // For textures, we need to track texture units, so we have a special setter + this.uniformTexture(parsed[u].name, parsed[u].value[0]); + } else { + this.uniform(parsed[u].method, parsed[u].type, parsed[u].name, parsed[u].value); + this.forceRender = true; + } + } + } + }, { + key: 'setMouse', + value: function setMouse(mouse) { + // set the mouse uniform + var rect = this.canvas.getBoundingClientRect(); + if (mouse && mouse.x && mouse.x >= rect.left && mouse.x <= rect.right && mouse.y && mouse.y >= rect.top && mouse.y <= rect.bottom) { + this.uniform('2f', 'vec2', 'u_mouse', mouse.x - rect.left, this.canvas.height - (mouse.y - rect.top)); + } + } + + // ex: program.uniform('3f', 'position', x, y, z); + }, { + key: 'uniform', + value: function uniform(method, type, name) { + // 'value' is a method-appropriate arguments list + this.uniforms[name] = this.uniforms[name] || {}; + var uniform = this.uniforms[name]; + + for (var _len2 = arguments.length, value = Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { + value[_key2 - 3] = arguments[_key2]; + } + + var change = (0, _toolsCommon.isDiff)(uniform.value, value); + if (change || this.change || uniform.location === undefined || uniform.value === undefined) { + uniform.name = name; + uniform.value = value; + uniform.type = type; + uniform.method = 'uniform' + method; + uniform.location = this.gl.getUniformLocation(this.program, name); + + this.gl[uniform.method].apply(this.gl, [uniform.location].concat(uniform.value)); + } + } + }, { + key: 'uniformTexture', + value: function uniformTexture(name, texture, options) { + if (this.textures[name] === undefined) { + this.loadTexture(name, texture, options); + } else { + this.uniform('1i', 'sampler2D', name, this.texureIndex); + this.textures[name].bind(this.texureIndex); + this.uniform('2f', 'vec2', name + 'Resolution', this.textures[name].width, this.textures[name].height); + this.texureIndex++; + } + } + }, { + key: 'resize', + value: function resize() { + if (this.width !== this.canvas.clientWidth || this.height !== this.canvas.clientHeight) { + var realToCSSPixels = window.devicePixelRatio || 1; + + // Lookup the size the browser is displaying the canvas in CSS pixels + // and compute a size needed to make our drawingbuffer match it in + // device pixels. + var displayWidth = Math.floor(this.gl.canvas.clientWidth * realToCSSPixels); + var displayHeight = Math.floor(this.gl.canvas.clientHeight * realToCSSPixels); + + // Check if the canvas is not the same size. + if (this.gl.canvas.width !== displayWidth || this.gl.canvas.height !== displayHeight) { + // Make the canvas the same size + this.gl.canvas.width = displayWidth; + this.gl.canvas.height = displayHeight; + // Set the viewport to match + this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height); + // this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight); + } + this.width = this.canvas.clientWidth; + this.height = this.canvas.clientHeight; + return true; + } else { + return false; + } + } + }, { + key: 'render', + value: function render() { + this.visible = (0, _toolsCommon.isCanvasVisible)(this.canvas); + if (this.forceRender || this.animated && this.visible) { + // set the time uniform + var timeFrame = Date.now(); + var time = (timeFrame - this.timeLoad) / 1000.0; + this.uniform('1f', 'float', 'u_time', time); + + // set the resolution uniform + this.uniform('2f', 'vec2', 'u_resolution', this.canvas.width, this.canvas.height); + + this.texureIndex = 0; + for (var tex in this.textures) { + this.uniformTexture(tex); + } + + // Draw the rectangle. + this.gl.drawArrays(this.gl.TRIANGLES, 0, 6); + + // Trigger event + this.trigger('render', {}); + + this.change = false; + this.forceRender = false; + } + } + }, { + key: 'version', + value: function version() { + return '0.0.3'; + } + }]); + + return GlslCanvas; +})(); + +exports['default'] = GlslCanvas; + +window.GlslCanvas = GlslCanvas; + +function loadAllGlslCanvas() { + var list = document.getElementsByClassName('glslCanvas'); + if (list.length > 0) { + window.glslCanvases = []; + for (var i = 0; i < list.length; i++) { + var sandbox = new GlslCanvas(list[i]); + if (sandbox.isValid) { + window.glslCanvases.push(sandbox); + } + } + } +} + +window.onload = function () { + loadAllGlslCanvas(); +}; +module.exports = exports['default']; + +},{"./gl/Texture":93,"./gl/gl":94,"./tools/common":95,"./tools/mixin":96,"babel-runtime/helpers/class-call-check":8,"babel-runtime/helpers/create-class":9,"babel-runtime/helpers/interop-require-default":10,"xhr":89}],93:[function(_dereq_,module,exports){ +// Texture management +'use strict'; + +var _createClass = _dereq_('babel-runtime/helpers/create-class')['default']; + +var _classCallCheck = _dereq_('babel-runtime/helpers/class-call-check')['default']; + +var _Promise = _dereq_('babel-runtime/core-js/promise')['default']; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _toolsCommon = _dereq_('../tools/common'); + +var _toolsMixin = _dereq_('../tools/mixin'); + +// GL texture wrapper object for keeping track of a global set of textures, keyed by a unique user-defined name + +var Texture = (function () { + function Texture(gl, name) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + _classCallCheck(this, Texture); + + (0, _toolsMixin.subscribeMixin)(this); + + this.gl = gl; + this.texture = gl.createTexture(); + if (this.texture) { + this.valid = true; + } + this.bind(); + + this.name = name; + this.source = null; + this.sourceType = null; + this.loading = null; // a Promise object to track the loading state of this texture + + // Default to a 1-pixel black texture so we can safely render while we wait for an image to load + // See: http://stackoverflow.com/questions/19722247/webgl-wait-for-texture-to-load + this.setData(1, 1, new Uint8Array([0, 0, 0, 255]), { filtering: 'linear' }); + this.setFiltering(options.filtering); + + this.load(options); + } + + // Report max texture size for a GL context + + // Destroy a single texture instance + + _createClass(Texture, [{ + key: 'destroy', + value: function destroy() { + if (!this.valid) { + return; + } + this.gl.deleteTexture(this.texture); + this.texture = null; + delete this.data; + this.data = null; + this.valid = false; + } + }, { + key: 'bind', + value: function bind(unit) { + if (!this.valid) { + return; + } + if (typeof unit === 'number') { + if (Texture.activeUnit !== unit) { + this.gl.activeTexture(this.gl.TEXTURE0 + unit); + Texture.activeUnit = unit; + } + } + if (Texture.activeTexture !== this.texture) { + this.gl.bindTexture(this.gl.TEXTURE_2D, this.texture); + Texture.activeTexture = this.texture; + } + } + }, { + key: 'load', + value: function load() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + this.loading = null; + + if (typeof options.url === 'string') { + this.setUrl(options.url, options); + } else if (options.element) { + this.setElement(options.element, options); + } else if (options.data && options.width && options.height) { + this.setData(options.width, options.height, options.data, options); + } + } + + // Sets texture from an url + }, { + key: 'setUrl', + value: function setUrl(url) { + var _this = this; + + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + if (!this.valid) { + return; + } + + this.url = url; // save URL reference (will be overwritten when element is loaded below) + this.source = this.url; + this.sourceType = 'url'; + + this.loading = new _Promise(function (resolve, reject) { + var image = new Image(); + image.onload = function () { + try { + _this.setElement(image, options); + } catch (e) { + console.log('Texture \'' + _this.name + '\': failed to load url: \'' + _this.source + '\'', e, options); + } + + resolve(_this); + }; + image.onerror = function (e) { + // Warn and resolve on error + console.log('Texture \'' + _this.name + '\': failed to load url: \'' + _this.source + '\'', e, options); + resolve(_this); + }; + image.crossOrigin = 'anonymous'; + image.src = _this.source; + }); + return this.loading; + } + + // Sets texture to a raw image buffer + }, { + key: 'setData', + value: function setData(width, height, data) { + var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + this.width = width; + this.height = height; + + this.source = data; + this.sourceType = 'data'; + + this.update(options); + this.setFiltering(options); + + this.loading = _Promise.resolve(this); + return this.loading; + } + + // Sets the texture to track a element (canvas/image) + }, { + key: 'setElement', + value: function setElement(element, options) { + var el = element; + + // a string element is interpeted as a CSS selector + if (typeof element === 'string') { + element = document.querySelector(element); + } + + if (element instanceof HTMLCanvasElement || element instanceof HTMLImageElement || element instanceof HTMLVideoElement) { + this.source = element; + this.sourceType = 'element'; + + this.update(options); + this.setFiltering(options); + } else { + var msg = 'the \'element\' parameter (`element: ' + JSON.stringify(el) + '`) must be a CSS '; + msg += 'selector string, or a , or
    Click here to upgrade your browser.\n'; + +/** + * Mesasge for need better hardware + * @type {string} + */ +var OTHER_PROBLEM = '\n\tIt does not appear your computer can support WebGL.
    \n\tClick here for more information.\n'; + +/** + * Creates a webgl context. If creation fails it will + * change the contents of the container of the + * tag to an error message with the correct links for WebGL. + * @param {Element} canvas. The canvas element to create a + * context from. + * @param {WebGLContextCreationAttirbutes} optAttribs Any + * creation attributes you want to pass in. + * @return {WebGLRenderingContext} The created context. + */ + +function setupWebGL(canvas, optAttribs) { + function showLink(str) { + var container = canvas.parentNode; + if (container) { + container.innerHTML = makeFailHTML(str); + } + } + + if (!window.WebGLRenderingContext) { + showLink(GET_A_WEBGL_BROWSER); + return null; + } + + var context = create3DContext(canvas, optAttribs); + if (!context) { + showLink(OTHER_PROBLEM); + } + context.getExtension('OES_standard_derivatives'); + return context; +} + +/** + * Creates a webgl context. + * @param {!Canvas} canvas The canvas tag to get context + * from. If one is not passed in one will be created. + * @return {!WebGLContext} The created context. + */ + +function create3DContext(canvas, optAttribs) { + var names = ['webgl', 'experimental-webgl']; + var context = null; + for (var ii = 0; ii < names.length; ++ii) { + try { + context = canvas.getContext(names[ii], optAttribs); + } catch (e) { + if (context) { + break; + } + } + } + return context; +} + +/* + * Create a Vertex of a specific type (gl.VERTEX_SHADER/) + */ + +function createShader(main, source, type) { + var gl = main.gl; + + var shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + + var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + + if (!compiled) { + // Something went wrong during compilation; get the error + lastError = gl.getShaderInfoLog(shader); + console.error('*** Error compiling shader ' + shader + ':' + lastError); + main.trigger('error', { shader: shader, source: source, type: type, error: lastError }); + gl.deleteShader(shader); + return null; + } + + return shader; +} + +/** + * Loads a shader. + * @param {!WebGLContext} gl The WebGLContext to use. + * @param {string} shaderSource The shader source. + * @param {number} shaderType The type of shader. + * @param {function(string): void) opt_errorCallback callback for errors. + * @return {!WebGLShader} The created shader. + */ + +function createProgram(main, shaders, optAttribs, optLocations) { + var gl = main.gl; + + var program = gl.createProgram(); + for (var ii = 0; ii < shaders.length; ++ii) { + gl.attachShader(program, shaders[ii]); + } + if (optAttribs) { + for (var ii = 0; ii < optAttribs.length; ++ii) { + gl.bindAttribLocation(program, optLocations ? optLocations[ii] : ii, optAttribs[ii]); + } + } + gl.linkProgram(program); + + // Check the link status + var linked = gl.getProgramParameter(program, gl.LINK_STATUS); + if (!linked) { + // something went wrong with the link + lastError = gl.getProgramInfoLog(program); + console.log('Error in program linking:' + lastError); + gl.deleteProgram(program); + return null; + } + return program; +} + +// By Brett Camber on +// https://github.com/tangrams/tangram/blob/master/src/gl/glsl.js + +function parseUniforms(uniforms) { + var prefix = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + var parsed = []; + + for (var _name in uniforms) { + var uniform = uniforms[_name]; + var u = undefined; + + if (prefix) { + _name = prefix + '.' + _name; + } + + // Single float + if (typeof uniform === 'number') { + parsed.push({ + type: 'float', + method: '1f', + name: _name, + value: uniform + }); + } + // Array: vector, array of floats, array of textures, or array of structs + else if (Array.isArray(uniform)) { + // Numeric values + if (typeof uniform[0] === 'number') { + // float vectors (vec2, vec3, vec4) + if (uniform.length === 1) { + parsed.push({ + type: 'float', + method: '1f', + name: _name, + value: uniform + }); + } + // float vectors (vec2, vec3, vec4) + else if (uniform.length >= 2 && uniform.length <= 4) { + parsed.push({ + type: 'vec' + uniform.length, + method: uniform.length + 'fv', + name: _name, + value: uniform + }); + } + // float array + else if (uniform.length > 4) { + parsed.push({ + type: 'float[]', + method: '1fv', + name: _name + '[0]', + value: uniform + }); + } + // TODO: assume matrix for (typeof == Float32Array && length == 16)? + } + // Array of textures + else if (typeof uniform[0] === 'string') { + parsed.push({ + type: 'sampler2D', + method: '1i', + name: _name, + value: uniform + }); + } + // Array of arrays - but only arrays of vectors are allowed in this case + else if (Array.isArray(uniform[0]) && typeof uniform[0][0] === 'number') { + // float vectors (vec2, vec3, vec4) + if (uniform[0].length >= 2 && uniform[0].length <= 4) { + // Set each vector in the array + for (u = 0; u < uniform.length; u++) { + parsed.push({ + type: 'vec' + uniform[0].length, + method: uniform[u].length + 'fv', + name: _name + '[' + u + ']', + value: uniform[u] + }); + } + } + // else error? + } + // Array of structures + else if (typeof uniform[0] === 'object') { + for (u = 0; u < uniform.length; u++) { + // Set each struct in the array + parsed.push.apply(parsed, _toConsumableArray(parseUniforms(uniform[u], _name + '[' + u + ']'))); + } + } + } + // Boolean + else if (typeof uniform === 'boolean') { + parsed.push({ + type: 'bool', + method: '1i', + name: _name, + value: uniform + }); + } + // Texture + else if (typeof uniform === 'string') { + parsed.push({ + type: 'sampler2D', + method: '1i', + name: _name, + value: uniform + }); + } + // Structure + else if (typeof uniform === 'object') { + // Set each field in the struct + parsed.push.apply(parsed, _toConsumableArray(parseUniforms(uniform, _name))); + } + // TODO: support other non-float types? (int, etc.) + } + return parsed; +} + +},{"babel-runtime/helpers/to-consumable-array":11}],95:[function(_dereq_,module,exports){ +'use strict'; + +var _Set = _dereq_('babel-runtime/core-js/set')['default']; + +var _Object$assign = _dereq_('babel-runtime/core-js/object/assign')['default']; + +var _getIterator = _dereq_('babel-runtime/core-js/get-iterator')['default']; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports.isCanvasVisible = isCanvasVisible; +exports.isPowerOf2 = isPowerOf2; +exports.nextHighestPowerOfTwo = nextHighestPowerOfTwo; +exports.FormatNumberLength = FormatNumberLength; +exports.getMousePos = getMousePos; +exports.isDiff = isDiff; +exports.subscribeMixin = subscribeMixin; + +function isCanvasVisible(canvas) { + return canvas.getBoundingClientRect().top + canvas.height > 0 && canvas.getBoundingClientRect().top < (window.innerHeight || document.documentElement.clientHeight); +} + +function isPowerOf2(value) { + return (value & value - 1) === 0; +} + +function nextHighestPowerOfTwo(x) { + --x; + for (var i = 1; i < 32; i <<= 1) { + x = x | x >> i; + } + return x + 1; +} + +function FormatNumberLength(num, length) { + var r = num.toString(); + while (r.length < length) { + r = '0' + r; + } + return r; +} + +function getMousePos(canvas, evt) { + var rect = canvas.getBoundingClientRect(); + return { + x: evt.clientX - rect.left, + y: evt.clientY - rect.top + }; +} + +function isDiff(a, b) { + if (a && b) { + return a.toString() !== b.toString(); + } + return false; +} + +function subscribeMixin(target) { + var listeners = new _Set(); + + return _Object$assign(target, { + + subscribe: function subscribe(listener) { + listeners.add(listener); + }, + + on: function on(type, f) { + var listener = {}; + listener[type] = f; + listeners.add(listener); + }, + + unsubscribe: function unsubscribe(listener) { + listeners['delete'](listener); + }, + + unsubscribeAll: function unsubscribeAll() { + listeners.clear(); + }, + + trigger: function trigger(event) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _len = arguments.length, data = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + data[_key - 1] = arguments[_key]; + } + + for (var _iterator = _getIterator(listeners), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var listener = _step.value; + + if (typeof listener[event] === 'function') { + listener[event].apply(listener, data); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + }); +} + +},{"babel-runtime/core-js/get-iterator":2,"babel-runtime/core-js/object/assign":3,"babel-runtime/core-js/set":7}],96:[function(_dereq_,module,exports){ +'use strict'; + +var _Set = _dereq_('babel-runtime/core-js/set')['default']; + +var _Object$assign = _dereq_('babel-runtime/core-js/object/assign')['default']; + +var _getIterator = _dereq_('babel-runtime/core-js/get-iterator')['default']; + +var _Object$keys = _dereq_('babel-runtime/core-js/object/keys')['default']; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +exports.subscribeMixin = subscribeMixin; + +function subscribeMixin(target) { + var listeners = new _Set(); + + return _Object$assign(target, { + + on: function on(type, f) { + var listener = {}; + listener[type] = f; + listeners.add(listener); + }, + + off: function off(type, f) { + if (f) { + var listener = {}; + listener[type] = f; + listeners['delete'](listener); + } else { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = _getIterator(listeners), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var item = _step.value; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = _getIterator(_Object$keys(item)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var key = _step2.value; + + if (key === type) { + listeners['delete'](item); + return; + } + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2['return']) { + _iterator2['return'](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator['return']) { + _iterator['return'](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + } + }, + + listSubscriptions: function listSubscriptions() { + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = _getIterator(listeners), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var item = _step3.value; + + console.log(item); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3['return']) { + _iterator3['return'](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + }, + + subscribe: function subscribe(listener) { + listeners.add(listener); + }, + + unsubscribe: function unsubscribe(listener) { + listeners['delete'](listener); + }, + + unsubscribeAll: function unsubscribeAll() { + listeners.clear(); + }, + + trigger: function trigger(event) { + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _len = arguments.length, data = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + data[_key - 1] = arguments[_key]; + } + + for (var _iterator4 = _getIterator(listeners), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var listener = _step4.value; + + if (typeof listener[event] === 'function') { + listener[event].apply(listener, data); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4['return']) { + _iterator4['return'](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + } + }); +} + +},{"babel-runtime/core-js/get-iterator":2,"babel-runtime/core-js/object/assign":3,"babel-runtime/core-js/object/keys":5,"babel-runtime/core-js/set":7}]},{},[92])(92) +}); +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2dldC1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2Fzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3NldC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3MtY2FsbC1jaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlLWNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbnRlcm9wLXJlcXVpcmUtZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdG8tY29uc3VtYWJsZS1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmFkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmFuLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmNsYXNzb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5jb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmNvbGxlY3Rpb24tdG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmNvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuY3R4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmRlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuZG9tLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmV4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuaGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuaGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmh0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5pbnZva2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuaXMtYXJyYXktaXRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmlzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLml0ZXItY2FsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLml0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuaXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5pdGVyLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLml0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLml0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQubGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLm1pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLm9iamVjdC1hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5vYmplY3Qtc2FwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQucHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnJlZGVmaW5lLWFsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnJlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuc2FtZS12YWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnNldC1wcm90by5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnNldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5zaGFyZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC5zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuc3RyaWN0LW5ldy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnN0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnRhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvJC50by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQudG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnRvLWxlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnRvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLnVpZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy8kLndrcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvZm9yLWVhY2gvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2xvYmFsL3dpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL3BhcnNlLWhlYWRlcnMuanMiLCJub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94aHIvaW5kZXguanMiLCJub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9vbmNlL29uY2UuanMiLCJub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwiL1VzZXJzL3BhdHJpY2lvL0Rlc2t0b3AvZ2xzbENhbnZhcy9zcmMvR2xzbENhbnZhcy5qcyIsIi9Vc2Vycy9wYXRyaWNpby9EZXNrdG9wL2dsc2xDYW52YXMvc3JjL2dsL1RleHR1cmUuanMiLCIvVXNlcnMvcGF0cmljaW8vRGVza3RvcC9nbHNsQ2FudmFzL3NyYy9nbC9nbC5qcyIsIi9Vc2Vycy9wYXRyaWNpby9EZXNrdG9wL2dsc2xDYW52YXMvc3JjL3Rvb2xzL2NvbW1vbi5qcyIsIi9Vc2Vycy9wYXRyaWNpby9EZXNrdG9wL2dsc2xDYW52YXMvc3JjL3Rvb2xzL21peGluLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUU7QUFDdkMsZ0NBQVEsQ0FBQyxLQUFLLE9BQUMsQ0FBZixRQUFRLEVBQVcsSUFBSSxDQUFDLENBQUM7cUJBQzVCO2lCQUNKOzs7Ozs7Ozs7Ozs7Ozs7U0FDSjtLQUNKLENBQUMsQ0FBQztDQUNOIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2tleXNcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zZXRcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9PYmplY3QkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIilbXCJkZWZhdWx0XCJdO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuXG4gICAgICBfT2JqZWN0JGRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH07XG59KSgpO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX0FycmF5JGZyb20gPSByZXF1aXJlKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb21cIilbXCJkZWZhdWx0XCJdO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gX0FycmF5JGZyb20oYXJyKTtcbiAgfVxufTtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy8kLmNvcmUnKS5BcnJheS5mcm9tOyIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvJC5jb3JlJykuT2JqZWN0LmFzc2lnbjsiLCJ2YXIgJCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvJCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKXtcbiAgcmV0dXJuICQuc2V0RGVzYyhpdCwga2V5LCBkZXNjKTtcbn07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy8kLmNvcmUnKS5PYmplY3Qua2V5czsiLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzLyQuY29yZScpLlByb21pc2U7IiwicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcuc2V0LnRvLWpzb24nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy8kLmNvcmUnKS5TZXQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vJC5jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vJC53a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gKE8gPSBPYmplY3QoaXQpKVtUQUddKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoaWRlICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgcmVkZWZpbmVBbGwgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lLWFsbCcpXG4gICwgY3R4ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgc3RyaWN0TmV3ICAgID0gcmVxdWlyZSgnLi8kLnN0cmljdC1uZXcnKVxuICAsIGRlZmluZWQgICAgICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJylcbiAgLCBmb3JPZiAgICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCAkaXRlckRlZmluZSAgPSByZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKVxuICAsIHN0ZXAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLXN0ZXAnKVxuICAsIElEICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC51aWQnKSgnaWQnKVxuICAsICRoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGlzT2JqZWN0ICAgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIHNldFNwZWNpZXMgICA9IHJlcXVpcmUoJy4vJC5zZXQtc3BlY2llcycpXG4gICwgREVTQ1JJUFRPUlMgID0gcmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJylcbiAgLCBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGlzT2JqZWN0XG4gICwgU0laRSAgICAgICAgID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnXG4gICwgaWQgICAgICAgICAgID0gMDtcblxudmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmKCEkaGFzKGl0LCBJRCkpe1xuICAgIC8vIGNhbid0IHNldCBpZCB0byBmcm96ZW4gb2JqZWN0XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShpdCkpcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBpZFxuICAgIGlmKCFjcmVhdGUpcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBvYmplY3QgaWRcbiAgICBoaWRlKGl0LCBJRCwgKytpZCk7XG4gIC8vIHJldHVybiBvYmplY3QgaWQgd2l0aCBwcmVmaXhcbiAgfSByZXR1cm4gJ08nICsgaXRbSURdO1xufTtcblxudmFyIGdldEVudHJ5ID0gZnVuY3Rpb24odGhhdCwga2V5KXtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KSwgZW50cnk7XG4gIGlmKGluZGV4ICE9PSAnRicpcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yKGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubil7XG4gICAgaWYoZW50cnkuayA9PSBrZXkpcmV0dXJuIGVudHJ5O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBzdHJpY3ROZXcodGhhdCwgQywgTkFNRSk7XG4gICAgICB0aGF0Ll9pID0gJC5jcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAgIC8vIGZpcnN0IGVudHJ5XG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAgICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpe1xuICAgICAgICBmb3IodmFyIHRoYXQgPSB0aGlzLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihlbnRyeS5wKWVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgICAsIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYoZW50cnkpe1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkublxuICAgICAgICAgICAgLCBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZihwcmV2KXByZXYubiA9IG5leHQ7XG4gICAgICAgICAgaWYobmV4dCluZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmKHRoYXQuX2YgPT0gZW50cnkpdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYodGhhdC5fbCA9PSBlbnRyeSl0aGF0Ll9sID0gcHJldjtcbiAgICAgICAgICB0aGF0W1NJWkVdLS07XG4gICAgICAgIH0gcmV0dXJuICEhZW50cnk7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMi4zLjYgU2V0LnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICAvLyAyMy4xLjMuNSBNYXAucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiwgdGhhdCA9IHVuZGVmaW5lZCAqLyl7XG4gICAgICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCAzKVxuICAgICAgICAgICwgZW50cnk7XG4gICAgICAgIHdoaWxlKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZil7XG4gICAgICAgICAgZihlbnRyeS52LCBlbnRyeS5rLCB0aGlzKTtcbiAgICAgICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgICAgICB3aGlsZShlbnRyeSAmJiBlbnRyeS5yKWVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KXtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZihERVNDUklQVE9SUykkLnNldERlc2MoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gZGVmaW5lZCh0aGlzW1NJWkVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbih0aGF0LCBrZXksIHZhbHVlKXtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpXG4gICAgICAsIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmKGVudHJ5KXtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmKCF0aGF0Ll9mKXRoYXQuX2YgPSBlbnRyeTtcbiAgICAgIGlmKHByZXYpcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmKGluZGV4ICE9PSAnRicpdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24oQywgTkFNRSwgSVNfTUFQKXtcbiAgICAvLyBhZGQgLmtleXMsIC52YWx1ZXMsIC5lbnRyaWVzLCBbQEBpdGVyYXRvcl1cbiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExXG4gICAgJGl0ZXJEZWZpbmUoQywgTkFNRSwgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICAgICAgdGhpcy5fdCA9IGl0ZXJhdGVkOyAgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdGhhdCAgPSB0aGlzXG4gICAgICAgICwga2luZCAgPSB0aGF0Ll9rXG4gICAgICAgICwgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZShlbnRyeSAmJiBlbnRyeS5yKWVudHJ5ID0gZW50cnkucDtcbiAgICAgIC8vIGdldCBuZXh0IGVudHJ5XG4gICAgICBpZighdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKXtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycgLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcbiAgfVxufTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgZm9yT2YgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIGNsYXNzb2YgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3JPZih0aGlzLCBmYWxzZSwgYXJyLnB1c2gsIGFycik7XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZmFpbHMgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZmFpbHMnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsIHJlZGVmaW5lQWxsICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lLWFsbCcpXG4gICwgZm9yT2YgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCBzdHJpY3ROZXcgICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpY3QtbmV3JylcbiAgLCBpc09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi8kLnNldC10by1zdHJpbmctdGFnJylcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vJC5kZXNjcmlwdG9ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUsIHdyYXBwZXIsIG1ldGhvZHMsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKXtcbiAgdmFyIEJhc2UgID0gZ2xvYmFsW05BTUVdXG4gICAgLCBDICAgICA9IEJhc2VcbiAgICAsIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJ1xuICAgICwgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlXG4gICAgLCBPICAgICA9IHt9O1xuICBpZighREVTQ1JJUFRPUlMgfHwgdHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICBuZXcgQygpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSl7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgfSBlbHNlIHtcbiAgICBDID0gd3JhcHBlcihmdW5jdGlvbih0YXJnZXQsIGl0ZXJhYmxlKXtcbiAgICAgIHN0cmljdE5ldyh0YXJnZXQsIEMsIE5BTUUpO1xuICAgICAgdGFyZ2V0Ll9jID0gbmV3IEJhc2U7XG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGFyZ2V0W0FEREVSXSwgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICAkLmVhY2guY2FsbCgnYWRkLGNsZWFyLGRlbGV0ZSxmb3JFYWNoLGdldCxoYXMsc2V0LGtleXMsdmFsdWVzLGVudHJpZXMnLnNwbGl0KCcsJyksZnVuY3Rpb24oS0VZKXtcbiAgICAgIHZhciBJU19BRERFUiA9IEtFWSA9PSAnYWRkJyB8fCBLRVkgPT0gJ3NldCc7XG4gICAgICBpZihLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSloaWRlKEMucHJvdG90eXBlLCBLRVksIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICBpZighSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkpcmV0dXJuIEtFWSA9PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGZhbHNlO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY1tLRVldKGEgPT09IDAgPyAwIDogYSwgYik7XG4gICAgICAgIHJldHVybiBJU19BRERFUiA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZignc2l6ZScgaW4gcHJvdG8pJC5zZXREZXNjKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiwgTyk7XG5cbiAgaWYoIUlTX1dFQUspY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcxLjIuNid9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi8kLmNvcmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwga2V5LCBvd24sIG91dDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiBrZXkgaW4gdGFyZ2V0O1xuICAgIGlmKG93biAmJiBrZXkgaW4gZXhwb3J0cyljb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbihwYXJhbSl7XG4gICAgICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgQyA/IG5ldyBDKHBhcmFtKSA6IEMocGFyYW0pO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICBpZihJU19QUk9UTykoZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSkpW2tleV0gPSBvdXQ7XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7IC8vIHdyYXBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi8kLmlzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCl7XG4gIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgfVxufTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiAkLnNldERlc2Mob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi8kLmNvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vJC5pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi8kLnNldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi8kLmhpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vJC5saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuLyQuaXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi8kLnNldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90byAgICAgICA9IHJlcXVpcmUoJy4vJCcpLmdldFByb3RvXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCBtZXRob2RzLCBrZXk7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJG5hdGl2ZSl7XG4gICAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8oJGRlZmF1bHQuY2FsbChuZXcgQmFzZSkpO1xuICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAvLyBGRiBmaXhcbiAgICBpZighTElCUkFSWSAmJiBoYXMocHJvdG8sIEZGX0lURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICAgIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJylcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnaXRlcmF0b3InKVxuICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uKCl7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uKCl7IHRocm93IDI7IH0pO1xufSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMsIHNraXBDbG9zaW5nKXtcbiAgaWYoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgID0gWzddXG4gICAgICAsIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgc2FmZSA9IHRydWU7IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHt9OyIsInZhciAkT2JqZWN0ID0gT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZTogICAgICRPYmplY3QuY3JlYXRlLFxuICBnZXRQcm90bzogICAkT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICBpc0VudW06ICAgICB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgZ2V0RGVzYzogICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIHNldERlc2M6ICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHksXG4gIHNldERlc2NzOiAgICRPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgZ2V0S2V5czogICAgJE9iamVjdC5rZXlzLFxuICBnZXROYW1lczogICAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldFN5bWJvbHM6ICRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICBlYWNoOiAgICAgICBbXS5mb3JFYWNoXG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi8kLnRhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuLyQuY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG52YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICB2YXIgcGFyZW50LCBkb21haW4sIGZuO1xuICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSl7XG4gICAgcHJvY2Vzcy5kb21haW4gPSBudWxsO1xuICAgIHBhcmVudC5leGl0KCk7XG4gIH1cbiAgd2hpbGUoaGVhZCl7XG4gICAgZG9tYWluID0gaGVhZC5kb21haW47XG4gICAgZm4gICAgID0gaGVhZC5mbjtcbiAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgZm4oKTsgLy8gPC0gY3VycmVudGx5IHdlIHVzZSBpdCBvbmx5IGZvciBQcm9taXNlIC0gdHJ5IC8gY2F0Y2ggbm90IHJlcXVpcmVkXG4gICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG59O1xuXG4vLyBOb2RlLmpzXG5pZihpc05vZGUpe1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xuLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG59IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICB2YXIgdG9nZ2xlID0gMVxuICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAtdG9nZ2xlO1xuICB9O1xuLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2Vcbn0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaCk7XG4gIH07XG4vLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuLy8gLSBzZXRJbW1lZGlhdGVcbi8vIC0gTWVzc2FnZUNoYW5uZWxcbi8vIC0gd2luZG93LnBvc3RNZXNzYWdcbi8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4vLyAtIHNldFRpbWVvdXRcbn0gZWxzZSB7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzYXAoZm4pe1xuICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCwgZG9tYWluOiBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW59O1xuICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gIGlmKCFoZWFkKXtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07IiwiLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKTtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBhID0gT2JqZWN0LmFzc2lnblxuICAgICwgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiBhKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKGEoe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRLZXlzICAgID0gJC5nZXRLZXlzXG4gICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzXG4gICAgLCBpc0VudW0gICAgID0gJC5pc0VudW07XG4gIHdoaWxlKCQkbGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KCQkW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH1cbiAgcmV0dXJuIFQ7XG59IDogT2JqZWN0LmFzc2lnbjsiLCIvLyBtb3N0IE9iamVjdCBtZXRob2RzIGJ5IEVTNiBzaG91bGQgYWNjZXB0IHByaW1pdGl2ZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgY29yZSAgICA9IHJlcXVpcmUoJy4vJC5jb3JlJylcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cbiAgICAsIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuaGlkZScpOyIsIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSl7XG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgZ2V0RGVzYyAgPSByZXF1aXJlKCcuLyQnKS5nZXREZXNjXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uKE8sIHByb3RvKXtcbiAgYW5PYmplY3QoTyk7XG4gIGlmKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24odGVzdCwgYnVnZ3ksIHNldCl7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuLyQuY3R4JykoRnVuY3Rpb24uY2FsbCwgZ2V0RGVzYyhPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjb3JlICAgICAgICA9IHJlcXVpcmUoJy4vJC5jb3JlJylcbiAgLCAkICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZKXtcbiAgdmFyIEMgPSBjb3JlW0tFWV07XG4gIGlmKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pJC5zZXREZXNjKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vJCcpLnNldERlc2NcbiAgLCBoYXMgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuLyQud2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSl7XG4gIGlmKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpdGhyb3cgVHlwZUVycm9yKG5hbWUgKyBcIjogdXNlIHRoZSAnbmV3JyBvcGVyYXRvciFcIik7XG4gIHJldHVybiBpdDtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vJC50by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTsiLCJ2YXIgY3R4ICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmh0bWwnKVxuICAsIGNlbCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdG5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuLyQuY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0bmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiAgIHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuLyQuaW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgc3RvcmUgID0gcmVxdWlyZSgnLi8kLnNoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vJC51aWQnKVxuICAsIFN5bWJvbCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5TeW1ib2w7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBTeW1ib2wgJiYgU3ltYm9sW25hbWVdIHx8IChTeW1ib2wgfHwgdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59OyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTsiLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBnZXQgICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5jb3JlJykuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBpdGVyRm4gPSBnZXQoaXQpO1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuLyQuaXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vJC5pcy1hcnJheS1pdGVyJylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKi8pe1xuICAgIHZhciBPICAgICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKVxuICAgICAgLCBDICAgICAgID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheVxuICAgICAgLCAkJCAgICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuICAgPSAkJC5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9ICQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGluZGV4ICAgPSAwXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sICQkbGVuID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi8kLmFkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgICAgICAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGtpbmQgID0gdGhpcy5fa1xuICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKXtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi8kLm9iamVjdC1hc3NpZ24nKX0pOyIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuLyQub2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oJGtleXMpe1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCl7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTsiLG51bGwsIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBMSUJSQVJZICAgID0gcmVxdWlyZSgnLi8kLmxpYnJhcnknKVxuICAsIGdsb2JhbCAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBjdHggICAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgY2xhc3NvZiAgICA9IHJlcXVpcmUoJy4vJC5jbGFzc29mJylcbiAgLCAkZXhwb3J0ICAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgaXNPYmplY3QgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIHN0cmljdE5ldyAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZm9yT2YgICAgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIHNldFByb3RvICAgPSByZXF1aXJlKCcuLyQuc2V0LXByb3RvJykuc2V0XG4gICwgc2FtZSAgICAgICA9IHJlcXVpcmUoJy4vJC5zYW1lLXZhbHVlJylcbiAgLCBTUEVDSUVTICAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdzcGVjaWVzJylcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLyQuc3BlY2llcy1jb25zdHJ1Y3RvcicpXG4gICwgYXNhcCAgICAgICA9IHJlcXVpcmUoJy4vJC5taWNyb3Rhc2snKVxuICAsIFBST01JU0UgICAgPSAnUHJvbWlzZSdcbiAgLCBwcm9jZXNzICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBQICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgV3JhcHBlcjtcblxudmFyIHRlc3RSZXNvbHZlID0gZnVuY3Rpb24oc3ViKXtcbiAgdmFyIHRlc3QgPSBuZXcgUChmdW5jdGlvbigpe30pO1xuICBpZihzdWIpdGVzdC5jb25zdHJ1Y3RvciA9IE9iamVjdDtcbiAgcmV0dXJuIFAucmVzb2x2ZSh0ZXN0KSA9PT0gdGVzdDtcbn07XG5cbnZhciBVU0VfTkFUSVZFID0gZnVuY3Rpb24oKXtcbiAgdmFyIHdvcmtzID0gZmFsc2U7XG4gIGZ1bmN0aW9uIFAyKHgpe1xuICAgIHZhciBzZWxmID0gbmV3IFAoeCk7XG4gICAgc2V0UHJvdG8oc2VsZiwgUDIucHJvdG90eXBlKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuICB0cnkge1xuICAgIHdvcmtzID0gUCAmJiBQLnJlc29sdmUgJiYgdGVzdFJlc29sdmUoKTtcbiAgICBzZXRQcm90byhQMiwgUCk7XG4gICAgUDIucHJvdG90eXBlID0gJC5jcmVhdGUoUC5wcm90b3R5cGUsIHtjb25zdHJ1Y3Rvcjoge3ZhbHVlOiBQMn19KTtcbiAgICAvLyBhY3R1YWwgRmlyZWZveCBoYXMgYnJva2VuIHN1YmNsYXNzIHN1cHBvcnQsIHRlc3QgdGhhdFxuICAgIGlmKCEoUDIucmVzb2x2ZSg1KS50aGVuKGZ1bmN0aW9uKCl7fSkgaW5zdGFuY2VvZiBQMikpe1xuICAgICAgd29ya3MgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gYWN0dWFsIFY4IGJ1ZywgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxNjJcbiAgICBpZih3b3JrcyAmJiByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSl7XG4gICAgICB2YXIgdGhlbmFibGVUaGVuR290dGVuID0gZmFsc2U7XG4gICAgICBQLnJlc29sdmUoJC5zZXREZXNjKHt9LCAndGhlbicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpeyB0aGVuYWJsZVRoZW5Hb3R0ZW4gPSB0cnVlOyB9XG4gICAgICB9KSk7XG4gICAgICB3b3JrcyA9IHRoZW5hYmxlVGhlbkdvdHRlbjtcbiAgICB9XG4gIH0gY2F0Y2goZSl7IHdvcmtzID0gZmFsc2U7IH1cbiAgcmV0dXJuIHdvcmtzO1xufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgaWYoTElCUkFSWSAmJiBhID09PSBQICYmIGIgPT09IFdyYXBwZXIpcmV0dXJuIHRydWU7XG4gIHJldHVybiBzYW1lKGEsIGIpO1xufTtcbnZhciBnZXRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdO1xuICByZXR1cm4gUyAhPSB1bmRlZmluZWQgPyBTIDogQztcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKSxcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdClcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihyZWNvcmQsIGlzUmVqZWN0KXtcbiAgaWYocmVjb3JkLm4pcmV0dXJuO1xuICByZWNvcmQubiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHJlY29yZC5jO1xuICBhc2FwKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcmVjb3JkLnZcbiAgICAgICwgb2sgICAgPSByZWNvcmQucyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvaylyZWNvcmQuaCA9IHRydWU7XG4gICAgICAgICAgcmVzdWx0ID0gaGFuZGxlciA9PT0gdHJ1ZSA/IHZhbHVlIDogaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIGNoYWluLmxlbmd0aCA9IDA7XG4gICAgcmVjb3JkLm4gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdClzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgcHJvbWlzZSA9IHJlY29yZC5wXG4gICAgICAgICwgaGFuZGxlciwgY29uc29sZTtcbiAgICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSByZWNvcmQuYSA9IHVuZGVmaW5lZDtcbiAgICB9LCAxKTtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHZhciByZWNvcmQgPSBwcm9taXNlLl9kXG4gICAgLCBjaGFpbiAgPSByZWNvcmQuYSB8fCByZWNvcmQuY1xuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIGlmKHJlY29yZC5oKXJldHVybiBmYWxzZTtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHJlY29yZCA9IHRoaXM7XG4gIGlmKHJlY29yZC5kKXJldHVybjtcbiAgcmVjb3JkLmQgPSB0cnVlO1xuICByZWNvcmQgPSByZWNvcmQuciB8fCByZWNvcmQ7IC8vIHVud3JhcFxuICByZWNvcmQudiA9IHZhbHVlO1xuICByZWNvcmQucyA9IDI7XG4gIHJlY29yZC5hID0gcmVjb3JkLmMuc2xpY2UoKTtcbiAgbm90aWZ5KHJlY29yZCwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcmVjb3JkID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocmVjb3JkLmQpcmV0dXJuO1xuICByZWNvcmQuZCA9IHRydWU7XG4gIHJlY29yZCA9IHJlY29yZC5yIHx8IHJlY29yZDsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocmVjb3JkLnAgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBhc2FwKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge3I6IHJlY29yZCwgZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZC52ID0gdmFsdWU7XG4gICAgICByZWNvcmQucyA9IDE7XG4gICAgICBub3RpZnkocmVjb3JkLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7cjogcmVjb3JkLCBkOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFAgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIHZhciByZWNvcmQgPSB0aGlzLl9kID0ge1xuICAgICAgcDogc3RyaWN0TmV3KHRoaXMsIFAsIFBST01JU0UpLCAgICAgICAgIC8vIDwtIHByb21pc2VcbiAgICAgIGM6IFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICAgIGE6IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgICAgczogMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgICBkOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gZG9uZVxuICAgICAgdjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICBoOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gaGFuZGxlZCByZWplY3Rpb25cbiAgICAgIG46IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHJlY29yZCwgMSksIGN0eCgkcmVqZWN0LCByZWNvcmQsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwocmVjb3JkLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgcmVxdWlyZSgnLi8kLnJlZGVmaW5lLWFsbCcpKFAucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUCkpXG4gICAgICAgICwgcHJvbWlzZSAgPSByZWFjdGlvbi5wcm9taXNlXG4gICAgICAgICwgcmVjb3JkICAgPSB0aGlzLl9kO1xuICAgICAgcmVhY3Rpb24ub2sgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlY29yZC5jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYocmVjb3JkLmEpcmVjb3JkLmEucHVzaChyZWFjdGlvbik7XG4gICAgICBpZihyZWNvcmQucylub3RpZnkocmVjb3JkLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6IFB9KTtcbnJlcXVpcmUoJy4vJC5zZXQtdG8tc3RyaW5nLXRhZycpKFAsIFBST01JU0UpO1xucmVxdWlyZSgnLi8kLnNldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi8kLmNvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCB0ZXN0UmVzb2x2ZSh0cnVlKSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiBQICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICBQLmFsbChpdGVyKVsnY2F0Y2gnXShmdW5jdGlvbigpe30pO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSBnZXRDb25zdHJ1Y3Rvcih0aGlzKVxuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0XG4gICAgICAsIHZhbHVlcyAgICAgPSBbXTtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCB2YWx1ZXMucHVzaCwgdmFsdWVzKTtcbiAgICAgIHZhciByZW1haW5pbmcgPSB2YWx1ZXMubGVuZ3RoXG4gICAgICAgICwgcmVzdWx0cyAgID0gQXJyYXkocmVtYWluaW5nKTtcbiAgICAgIGlmKHJlbWFpbmluZykkLmVhY2guY2FsbCh2YWx1ZXMsIGZ1bmN0aW9uKHByb21pc2UsIGluZGV4KXtcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgZWxzZSByZXNvbHZlKHJlc3VsdHMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gZ2V0Q29uc3RydWN0b3IodGhpcylcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tc3Ryb25nJyk7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uJykoJ1NldCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSl7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU2V0Jywge3RvSlNPTjogcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKX0pOyIsInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpO1xuSXRlcmF0b3JzLk5vZGVMaXN0ID0gSXRlcmF0b3JzLkhUTUxDb2xsZWN0aW9uID0gSXRlcmF0b3JzLkFycmF5OyIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnaXMtZnVuY3Rpb24nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBmb3JFYWNoKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGl0ZXJhdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKVxuICAgIH1cblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgICBjb250ZXh0ID0gdGhpc1xuICAgIH1cbiAgICBcbiAgICBpZiAodG9TdHJpbmcuY2FsbChsaXN0KSA9PT0gJ1tvYmplY3QgQXJyYXldJylcbiAgICAgICAgZm9yRWFjaEFycmF5KGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSAnc3RyaW5nJylcbiAgICAgICAgZm9yRWFjaFN0cmluZyhsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbiAgICBlbHNlXG4gICAgICAgIGZvckVhY2hPYmplY3QobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG59XG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksIGkpKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIGFycmF5W2ldLCBpLCBhcnJheSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaFN0cmluZyhzdHJpbmcsIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyBubyBzdWNoIHRoaW5nIGFzIGEgc3BhcnNlIHN0cmluZy5cbiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCBzdHJpbmcuY2hhckF0KGkpLCBpLCBzdHJpbmcpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoT2JqZWN0KG9iamVjdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBrIGluIG9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGspKSB7XG4gICAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9iamVjdFtrXSwgaywgb2JqZWN0KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsO1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIil7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xufSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuZnVuY3Rpb24gaXNGdW5jdGlvbiAoZm4pIHtcbiAgdmFyIHN0cmluZyA9IHRvU3RyaW5nLmNhbGwoZm4pXG4gIHJldHVybiBzdHJpbmcgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHxcbiAgICAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIHN0cmluZyAhPT0gJ1tvYmplY3QgUmVnRXhwXScpIHx8XG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgIC8vIElFOCBhbmQgYmVsb3dcbiAgICAgKGZuID09PSB3aW5kb3cuc2V0VGltZW91dCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5hbGVydCB8fFxuICAgICAgZm4gPT09IHdpbmRvdy5jb25maXJtIHx8XG4gICAgICBmbiA9PT0gd2luZG93LnByb21wdCkpXG59O1xuIiwidmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJylcbiAgLCBmb3JFYWNoID0gcmVxdWlyZSgnZm9yLWVhY2gnKVxuICAsIGlzQXJyYXkgPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgaWYgKCFoZWFkZXJzKVxuICAgIHJldHVybiB7fVxuXG4gIHZhciByZXN1bHQgPSB7fVxuXG4gIGZvckVhY2goXG4gICAgICB0cmltKGhlYWRlcnMpLnNwbGl0KCdcXG4nKVxuICAgICwgZnVuY3Rpb24gKHJvdykge1xuICAgICAgICB2YXIgaW5kZXggPSByb3cuaW5kZXhPZignOicpXG4gICAgICAgICAgLCBrZXkgPSB0cmltKHJvdy5zbGljZSgwLCBpbmRleCkpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAsIHZhbHVlID0gdHJpbShyb3cuc2xpY2UoaW5kZXggKyAxKSlcblxuICAgICAgICBpZiAodHlwZW9mKHJlc3VsdFtrZXldKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXN1bHRba2V5XSkpIHtcbiAgICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gWyByZXN1bHRba2V5XSwgdmFsdWUgXVxuICAgICAgICB9XG4gICAgICB9XG4gIClcblxuICByZXR1cm4gcmVzdWx0XG59IiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgd2luZG93ID0gcmVxdWlyZShcImdsb2JhbC93aW5kb3dcIilcbnZhciBvbmNlID0gcmVxdWlyZShcIm9uY2VcIilcbnZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZShcImlzLWZ1bmN0aW9uXCIpXG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZShcInBhcnNlLWhlYWRlcnNcIilcbnZhciB4dGVuZCA9IHJlcXVpcmUoXCJ4dGVuZFwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVhIUlxuY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0ID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0IHx8IG5vb3BcbmNyZWF0ZVhIUi5YRG9tYWluUmVxdWVzdCA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QoKSkgPyBjcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxuZm9yRWFjaEFycmF5KFtcImdldFwiLCBcInB1dFwiLCBcInBvc3RcIiwgXCJwYXRjaFwiLCBcImhlYWRcIiwgXCJkZWxldGVcIl0sIGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgIGNyZWF0ZVhIUlttZXRob2QgPT09IFwiZGVsZXRlXCIgPyBcImRlbFwiIDogbWV0aG9kXSA9IGZ1bmN0aW9uKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgb3B0aW9ucyA9IGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgb3B0aW9ucy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICAgICAgICByZXR1cm4gX2NyZWF0ZVhIUihvcHRpb25zKVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGZvckVhY2hBcnJheShhcnJheSwgaXRlcmF0b3IpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGFycmF5W2ldKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmope1xuICAgIGZvcih2YXIgaSBpbiBvYmope1xuICAgICAgICBpZihvYmouaGFzT3duUHJvcGVydHkoaSkpIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICB2YXIgcGFyYW1zID0gdXJpXG5cbiAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICAgICAgaWYgKHR5cGVvZiB1cmkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt1cmk6dXJpfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zID0geHRlbmQob3B0aW9ucywge3VyaTogdXJpfSlcbiAgICB9XG5cbiAgICBwYXJhbXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZnVuY3Rpb24gY3JlYXRlWEhSKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVYSFIob3B0aW9ucykge1xuICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2tcbiAgICBpZih0eXBlb2YgY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuICAgIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgbG9hZEZ1bmMoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Qm9keSgpIHtcbiAgICAgICAgLy8gQ2hyb21lIHdpdGggcmVxdWVzdFR5cGU9YmxvYiB0aHJvd3MgZXJyb3JzIGFycm91bmQgd2hlbiBldmVuIHRlc3RpbmcgYWNjZXNzIHRvIHJlc3BvbnNlVGV4dFxuICAgICAgICB2YXIgYm9keSA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcInRleHRcIiB8fCAheGhyLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgICAgYm9keSA9IHhoci5yZXNwb25zZVRleHQgfHwgeGhyLnJlc3BvbnNlWE1MXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNKc29uKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJvZHlcbiAgICB9XG5cbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgICAgICAgICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgY2FsbGJhY2soZXZ0LCBmYWlsdXJlUmVzcG9uc2UpXG4gICAgfVxuXG4gICAgLy8gd2lsbCBsb2FkIHRoZSBkYXRhICYgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW4gYSBzcGVjaWFsIHJlc3BvbnNlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGxvYWRGdW5jKCkge1xuICAgICAgICBpZiAoYWJvcnRlZCkgcmV0dXJuXG4gICAgICAgIHZhciBzdGF0dXNcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUaW1lcilcbiAgICAgICAgaWYob3B0aW9ucy51c2VYRFIgJiYgeGhyLnN0YXR1cz09PXVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9JRTggQ09SUyBHRVQgc3VjY2Vzc2Z1bCByZXNwb25zZSBkb2Vzbid0IGhhdmUgYSBzdGF0dXMgZmllbGQsIGJ1dCBib2R5IGlzIGZpbmVcbiAgICAgICAgICAgIHN0YXR1cyA9IDIwMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdHVzID0gKHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzKVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXNwb25zZSA9IGZhaWx1cmVSZXNwb25zZVxuICAgICAgICB2YXIgZXJyID0gbnVsbFxuXG4gICAgICAgIGlmIChzdGF0dXMgIT09IDApe1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICAgICAgYm9keTogZ2V0Qm9keSgpLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgICAgICAgICByYXdSZXF1ZXN0OiB4aHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMpeyAvL3JlbWVtYmVyIHhociBjYW4gaW4gZmFjdCBiZSBYRFIgZm9yIENPUlMgaW4gSUVcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihcIkludGVybmFsIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpXG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXNwb25zZSwgcmVzcG9uc2UuYm9keSlcblxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGEgfHwgbnVsbFxuICAgIHZhciBoZWFkZXJzID0geGhyLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge31cbiAgICB2YXIgc3luYyA9ICEhb3B0aW9ucy5zeW5jXG4gICAgdmFyIGlzSnNvbiA9IGZhbHNlXG4gICAgdmFyIHRpbWVvdXRUaW1lclxuXG4gICAgaWYgKFwianNvblwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZVxuICAgIHhoci5vbmxvYWQgPSBsb2FkRnVuY1xuICAgIHhoci5vbmVycm9yID0gZXJyb3JGdW5jXG4gICAgLy8gSUU5IG11c3QgaGF2ZSBvbnByb2dyZXNzIGJlIHNldCB0byBhIHVuaXF1ZSBmdW5jdGlvbi5cbiAgICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gSUUgbXVzdCBkaWVcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGVycm9yRnVuY1xuICAgIHhoci5vcGVuKG1ldGhvZCwgdXJpLCAhc3luYywgb3B0aW9ucy51c2VybmFtZSwgb3B0aW9ucy5wYXNzd29yZClcbiAgICAvL2hhcyB0byBiZSBhZnRlciBvcGVuXG4gICAgaWYoIXN5bmMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9ICEhb3B0aW9ucy53aXRoQ3JlZGVudGlhbHNcbiAgICB9XG4gICAgLy8gQ2Fubm90IHNldCB0aW1lb3V0IHdpdGggc3luYyByZXF1ZXN0XG4gICAgLy8gbm90IHNldHRpbmcgdGltZW91dCBvbiB0aGUgeGhyIG9iamVjdCwgYmVjYXVzZSBvZiBvbGQgd2Via2l0cyBldGMuIG5vdCBoYW5kbGluZyB0aGF0IGNvcnJlY3RseVxuICAgIC8vIGJvdGggbnBtJ3MgcmVxdWVzdCBhbmQganF1ZXJ5IDEueCB1c2UgdGhpcyBraW5kIG9mIHRpbWVvdXQsIHNvIHRoaXMgaXMgYmVpbmcgY29uc2lzdGVudFxuICAgIGlmICghc3luYyAmJiBvcHRpb25zLnRpbWVvdXQgPiAwICkge1xuICAgICAgICB0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBhYm9ydGVkPXRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgeGhyLnNlbmQoYm9keSlcblxuICAgIHJldHVybiB4aHJcblxuXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuIiwibW9kdWxlLmV4cG9ydHMgPSBvbmNlXG5cbm9uY2UucHJvdG8gPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2UnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlKHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYWxsZWQpIHJldHVyblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiLypcblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTUgUGF0cmljaW8gR29uemFsZXogVml2byAoIGh0dHA6Ly93d3cucGF0cmljaW9nb256YWxlenZpdm8uY29tIClcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZlxudGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW5cbnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG9cbnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mXG50aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sXG5zdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1NcbkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUlxuQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSXG5JTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTlxuQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiovXG5cbmltcG9ydCB4aHIgZnJvbSAneGhyJztcblxuaW1wb3J0IHsgc2V0dXBXZWJHTCwgY3JlYXRlU2hhZGVyLCBjcmVhdGVQcm9ncmFtLCBwYXJzZVVuaWZvcm1zLCBsb2FkVGV4dHVyZSB9IGZyb20gJy4vZ2wvZ2wnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC9UZXh0dXJlJztcblxuaW1wb3J0IHsgaXNDYW52YXNWaXNpYmxlLCBpc0RpZmYgfSBmcm9tICcuL3Rvb2xzL2NvbW1vbic7XG5pbXBvcnQgeyBzdWJzY3JpYmVNaXhpbiB9IGZyb20gJy4vdG9vbHMvbWl4aW4nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHbHNsQ2FudmFzIHtcbiAgICBjb25zdHJ1Y3RvcihjYW52YXMsIG9wdGlvbnMpIHtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IGNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBjYW52YXMuY2xpZW50SGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgICB0aGlzLmdsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICAgICAgdGhpcy52Ym8gPSB7fTtcbiAgICAgICAgdGhpcy5pc1ZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhTdHJpbmcgPSBvcHRpb25zLnZlcnRleFN0cmluZyB8fCBgXG4jaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2VuZGlmXG5cbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjMiBhX3RleGNvb3JkO1xuXG52YXJ5aW5nIHZlYzIgdl90ZXhjb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uLCAwLjAsIDEuMCk7XG4gICAgdl90ZXhjb29yZCA9IGFfdGV4Y29vcmQ7XG59XG5gO1xuICAgICAgICB0aGlzLmZyYWdtZW50U3RyaW5nID0gb3B0aW9ucy5mcmFnbWVudFN0cmluZyB8fCBgXG4jaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2VuZGlmXG5cbnZhcnlpbmcgdmVjMiB2X3RleGNvb3JkO1xuXG52b2lkIG1haW4oKXtcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7XG59XG5gO1xuXG4gICAgICAgIC8vIEdMIENvbnRleHRcbiAgICAgICAgbGV0IGdsID0gc2V0dXBXZWJHTChjYW52YXMsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnRpbWVMb2FkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5mb3JjZVJlbmRlciA9IHRydWU7XG5cbiAgICAgICAgLy8gQWxsb3cgYWxwaGFcbiAgICAgICAgY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yIHx8ICdyZ2JhKDEsMSwxLDApJztcblxuICAgICAgICAvLyBMb2FkIHNoYWRlclxuICAgICAgICBpZiAoY2FudmFzLmhhc0F0dHJpYnV0ZSgnZGF0YS1mcmFnbWVudCcpKSB7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50U3RyaW5nID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnZGF0YS1mcmFnbWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhbnZhcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtZnJhZ21lbnQtdXJsJykpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBjYW52YXMuZ2V0QXR0cmlidXRlKCdkYXRhLWZyYWdtZW50LXVybCcpO1xuICAgICAgICAgICAgeGhyLmdldChzb3VyY2UsIChlcnJvciwgcmVzcG9uc2UsIGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoYm9keSwgdGhpcy52ZXJ0ZXhTdHJpbmcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHNoYWRlclxuICAgICAgICBpZiAoY2FudmFzLmhhc0F0dHJpYnV0ZSgnZGF0YS12ZXJ0ZXgnKSkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhTdHJpbmcgPSBjYW52YXMuZ2V0QXR0cmlidXRlKCdkYXRhLXZlcnRleCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhbnZhcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtdmVydGV4LXVybCcpKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnZGF0YS12ZXJ0ZXgtdXJsJyk7XG4gICAgICAgICAgICB4aHIuZ2V0KHNvdXJjZSwgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZCh0aGlzLmZyYWdtZW50U3RyaW5nLCBib2R5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb2dyYW0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBWZXJ0ZXggYnVmZmVyXG4gICAgICAgIGxldCB0ZXhDb29yZHNMb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sICdhX3RleGNvb3JkJyk7XG4gICAgICAgIHRoaXMudmJvLnRleENvb3JkcyA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZiby50ZXhDb29yZHMpO1xuICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDEuMCwgMS4wLCAwLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICAgICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0ZXhDb29yZHNMb2MpO1xuICAgICAgICB0aGlzLmdsLnZlcnRleEF0dHJpYlBvaW50ZXIodGV4Q29vcmRzTG9jLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNlc0xvYyA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgJ2FfcG9zaXRpb24nKTtcbiAgICAgICAgdGhpcy52Ym8udmVydGljZXMgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdGhpcy52Ym8udmVydGljZXMpO1xuICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFstMS4wLCAtMS4wLCAxLjAsIC0xLjAsIC0xLjAsIDEuMCwgLTEuMCwgMS4wLCAxLjAsIC0xLjAsIDEuMCwgMS4wXSksIGdsLlNUQVRJQ19EUkFXKTtcbiAgICAgICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh2ZXJ0aWNlc0xvYyk7XG4gICAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih2ZXJ0aWNlc0xvYywgMiwgZ2wuRkxPQVQsIGZhbHNlLCAwLCAwKTtcblxuICAgICAgICAvLyBsb2FkIFRFWFRVUkVTXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcbiAgICAgICAgaWYgKGNhbnZhcy5oYXNBdHRyaWJ1dGUoJ2RhdGEtdGV4dHVyZXMnKSkge1xuICAgICAgICAgICAgbGV0IGltZ0xpc3QgPSBjYW52YXMuZ2V0QXR0cmlidXRlKCdkYXRhLXRleHR1cmVzJykuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGZvciAobGV0IG5JbWcgaW4gaW1nTGlzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VW5pZm9ybSgndV90ZXgnICsgbkltZywgaW1nTGlzdFtuSW1nXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBFVkVOVFNcbiAgICAgICAgbGV0IG1vdXNlID0ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDBcbiAgICAgICAgfTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGUpID0+IHtcbiAgICAgICAgICAgIG1vdXNlLnggPSBlLmNsaWVudFggfHwgZS5wYWdlWDtcbiAgICAgICAgICAgIG1vdXNlLnkgPSBlLmNsaWVudFkgfHwgZS5wYWdlWTtcbiAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgIGxldCBzYW5kYm94ID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gUmVuZGVyTG9vcCgpIHtcbiAgICAgICAgICAgIHNhbmRib3guc2V0TW91c2UobW91c2UpO1xuICAgICAgICAgICAgc2FuZGJveC5yZW5kZXIoKTtcbiAgICAgICAgICAgIHNhbmRib3guZm9yY2VSZW5kZXIgPSBzYW5kYm94LnJlc2l6ZSgpO1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShSZW5kZXJMb29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0XG4gICAgICAgIHRoaXMuc2V0TW91c2UoeyB4OiAwLCB5OiAwIH0pO1xuICAgICAgICBSZW5kZXJMb29wKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHRleCBpbiB0aGlzLnRleHR1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGV4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVzID0ge307XG4gICAgICAgIGZvciAobGV0IGF0dCBpbiB0aGlzLmF0dHJpYnMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYXR0cmlic1thdHRdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmdsID0gbnVsbDtcbiAgICB9XG5cbiAgICBsb2FkKGZyYWdTdHJpbmcsIHZlcnRTdHJpbmcpIHtcbiAgICAgICAgLy8gTG9hZCB2ZXJ0ZXggc2hhZGVyIGlmIHRoZXJlIGlzIG9uZVxuICAgICAgICBpZiAodmVydFN0cmluZykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhTdHJpbmcgPSB2ZXJ0U3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9hZCBmcmFnbWVudCBzaGFkZXIgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgIGlmIChmcmFnU3RyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50U3RyaW5nID0gZnJhZ1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5UaW1lcyA9ICh0aGlzLmZyYWdtZW50U3RyaW5nLm1hdGNoKC91X3RpbWUvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgbGV0IG5Nb3VzZSA9ICh0aGlzLmZyYWdtZW50U3RyaW5nLm1hdGNoKC91X21vdXNlL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBuVGltZXMgPiAxIHx8IG5Nb3VzZSA+IDE7XG5cbiAgICAgICAgbGV0IHZlcnRleFNoYWRlciA9IGNyZWF0ZVNoYWRlcih0aGlzLCB0aGlzLnZlcnRleFN0cmluZywgdGhpcy5nbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgbGV0IGZyYWdtZW50U2hhZGVyID0gY3JlYXRlU2hhZGVyKHRoaXMsIHRoaXMuZnJhZ21lbnRTdHJpbmcsIHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSKTtcblxuICAgICAgICAvLyBJZiBGcmFnbWVudCBzaGFkZXIgZmFpbHMgbG9hZCBhIGVtcHR5IG9uZSB0byBzaWduIHRoZSBlcnJvclxuICAgICAgICBpZiAoIWZyYWdtZW50U2hhZGVyKSB7XG4gICAgICAgICAgICBmcmFnbWVudFNoYWRlciA9IGNyZWF0ZVNoYWRlcih0aGlzLCAndm9pZCBtYWluKCl7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xcbn0nLCB0aGlzLmdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYW5kIHVzZSBwcm9ncmFtXG4gICAgICAgIGxldCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh0aGlzLCBbdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcl0pOy8vLCBbMCwxXSxbJ2FfdGV4Y29vcmQnLCdhX3Bvc2l0aW9uJ10pO1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gRGVsZXRlIHNoYWRlcnNcbiAgICAgICAgLy8gdGhpcy5nbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgICAgICAgLy8gdGhpcy5nbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICB0aGlzLmdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICB0aGlzLmdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG5cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgdGhpcy5jaGFuZ2UgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZXZlbnRcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywge30pO1xuXG4gICAgICAgIHRoaXMuZm9yY2VSZW5kZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGxvYWRUZXh0dXJlIChuYW1lLCB1cmxFbGVtZW50T3JEYXRhLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB1cmxFbGVtZW50T3JEYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb3B0aW9ucy51cmwgPSB1cmxFbGVtZW50T3JEYXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1cmxFbGVtZW50T3JEYXRhID09PSAnb2JqZWN0JyAmJiB1cmxFbGVtZW50T3JEYXRhLmRhdGEgJiYgdXJsRWxlbWVudE9yRGF0YS53aWR0aCAmJiB1cmxFbGVtZW50T3JEYXRhLmhlaWdodCkge1xuICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gdXJsRWxlbWVudE9yRGF0YS5kYXRhO1xuICAgICAgICAgICAgb3B0aW9ucy53aWR0aCA9IHVybEVsZW1lbnRPckRhdGEud2lkdGg7XG4gICAgICAgICAgICBvcHRpb25zLmhlaWdodCA9IHVybEVsZW1lbnRPckRhdGEuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1cmxFbGVtZW50T3JEYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgb3B0aW9ucy5lbGVtZW50ID0gdXJsRWxlbWVudE9yRGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVzW25hbWVdID0gbmV3IFRleHR1cmUodGhpcy5nbCwgbmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudGV4dHVyZXNbbmFtZV0ub24oJ2xvYWRlZCcsIChhcmdzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVmcmVzaFVuaWZvcm1zKCkge1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybShuYW1lLCAuLi52YWx1ZSkge1xuICAgICAgICBsZXQgdSA9IHt9O1xuICAgICAgICB1W25hbWVdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0VW5pZm9ybXModSk7XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybXModW5pZm9ybXMpIHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlVW5pZm9ybXModW5pZm9ybXMpO1xuICAgICAgICAvLyBTZXQgZWFjaCB1bmlmb3JtXG4gICAgICAgIGZvciAobGV0IHUgaW4gcGFyc2VkKSB7XG4gICAgICAgICAgICBpZiAocGFyc2VkW3VdLnR5cGUgPT09ICdzYW1wbGVyMkQnKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHR1cmVzLCB3ZSBuZWVkIHRvIHRyYWNrIHRleHR1cmUgdW5pdHMsIHNvIHdlIGhhdmUgYSBzcGVjaWFsIHNldHRlclxuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybVRleHR1cmUocGFyc2VkW3VdLm5hbWUsIHBhcnNlZFt1XS52YWx1ZVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm0ocGFyc2VkW3VdLm1ldGhvZCwgcGFyc2VkW3VdLnR5cGUsIHBhcnNlZFt1XS5uYW1lLCBwYXJzZWRbdV0udmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VSZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TW91c2UobW91c2UpIHtcbiAgICAgICAgLy8gc2V0IHRoZSBtb3VzZSB1bmlmb3JtXG4gICAgICAgIGxldCByZWN0ID0gdGhpcy5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChtb3VzZSAmJlxuICAgICAgICAgICAgbW91c2UueCAmJiBtb3VzZS54ID49IHJlY3QubGVmdCAmJiBtb3VzZS54IDw9IHJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgIG1vdXNlLnkgJiYgbW91c2UueSA+PSByZWN0LnRvcCAmJiBtb3VzZS55IDw9IHJlY3QuYm90dG9tKSB7XG4gICAgICAgICAgICB0aGlzLnVuaWZvcm0oJzJmJywgJ3ZlYzInLCAndV9tb3VzZScsIG1vdXNlLnggLSByZWN0LmxlZnQsIHRoaXMuY2FudmFzLmhlaWdodCAtIChtb3VzZS55IC0gcmVjdC50b3ApKTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvLyBleDogcHJvZ3JhbS51bmlmb3JtKCczZicsICdwb3NpdGlvbicsIHgsIHksIHopO1xuICAgIHVuaWZvcm0gKG1ldGhvZCwgdHlwZSwgbmFtZSwgLi4udmFsdWUpIHsgLy8gJ3ZhbHVlJyBpcyBhIG1ldGhvZC1hcHByb3ByaWF0ZSBhcmd1bWVudHMgbGlzdFxuICAgICAgICB0aGlzLnVuaWZvcm1zW25hbWVdID0gdGhpcy51bmlmb3Jtc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW25hbWVdO1xuICAgICAgICBsZXQgY2hhbmdlID0gaXNEaWZmKHVuaWZvcm0udmFsdWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKGNoYW5nZSB8fCB0aGlzLmNoYW5nZSB8fCB1bmlmb3JtLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgdW5pZm9ybS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1bmlmb3JtLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdW5pZm9ybS50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIHVuaWZvcm0ubWV0aG9kID0gJ3VuaWZvcm0nICsgbWV0aG9kO1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2xbdW5pZm9ybS5tZXRob2RdLmFwcGx5KHRoaXMuZ2wsIFt1bmlmb3JtLmxvY2F0aW9uXS5jb25jYXQodW5pZm9ybS52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdW5pZm9ybVRleHR1cmUobmFtZSwgdGV4dHVyZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRUZXh0dXJlKG5hbWUsIHRleHR1cmUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51bmlmb3JtKCcxaScsICdzYW1wbGVyMkQnLCBuYW1lLCB0aGlzLnRleHVyZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXNbbmFtZV0uYmluZCh0aGlzLnRleHVyZUluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudW5pZm9ybSgnMmYnLCAndmVjMicsIG5hbWUgKyAnUmVzb2x1dGlvbicsIHRoaXMudGV4dHVyZXNbbmFtZV0ud2lkdGgsIHRoaXMudGV4dHVyZXNbbmFtZV0uaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMudGV4dXJlSW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMud2lkdGggIT09IHRoaXMuY2FudmFzLmNsaWVudFdpZHRoIHx8XG4gICAgICAgICAgICB0aGlzLmhlaWdodCAhPT0gdGhpcy5jYW52YXMuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBsZXQgcmVhbFRvQ1NTUGl4ZWxzID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgICAgICAgLy8gTG9va3VwIHRoZSBzaXplIHRoZSBicm93c2VyIGlzIGRpc3BsYXlpbmcgdGhlIGNhbnZhcyBpbiBDU1MgcGl4ZWxzXG4gICAgICAgICAgICAvLyBhbmQgY29tcHV0ZSBhIHNpemUgbmVlZGVkIHRvIG1ha2Ugb3VyIGRyYXdpbmdidWZmZXIgbWF0Y2ggaXQgaW5cbiAgICAgICAgICAgIC8vIGRldmljZSBwaXhlbHMuXG4gICAgICAgICAgICBsZXQgZGlzcGxheVdpZHRoID0gTWF0aC5mbG9vcih0aGlzLmdsLmNhbnZhcy5jbGllbnRXaWR0aCAqIHJlYWxUb0NTU1BpeGVscyk7XG4gICAgICAgICAgICBsZXQgZGlzcGxheUhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5nbC5jYW52YXMuY2xpZW50SGVpZ2h0ICogcmVhbFRvQ1NTUGl4ZWxzKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbnZhcyBpcyBub3QgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICAgIGlmICh0aGlzLmdsLmNhbnZhcy53aWR0aCAhPT0gZGlzcGxheVdpZHRoIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5jYW52YXMuaGVpZ2h0ICE9PSBkaXNwbGF5SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgY2FudmFzIHRoZSBzYW1lIHNpemVcbiAgICAgICAgICAgICAgICB0aGlzLmdsLmNhbnZhcy53aWR0aCA9IGRpc3BsYXlXaWR0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmdsLmNhbnZhcy5oZWlnaHQgPSBkaXNwbGF5SGVpZ2h0O1xuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdmlld3BvcnQgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuZ2wuY2FudmFzLndpZHRoLCB0aGlzLmdsLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5nbC5kcmF3aW5nQnVmZmVyV2lkdGgsIHRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyICgpIHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gaXNDYW52YXNWaXNpYmxlKHRoaXMuY2FudmFzKTtcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VSZW5kZXIgfHxcbiAgICAgICAgICAgICh0aGlzLmFuaW1hdGVkICYmIHRoaXMudmlzaWJsZSkpIHtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgdGltZSB1bmlmb3JtXG4gICAgICAgICAgICBsZXQgdGltZUZyYW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCB0aW1lID0gKHRpbWVGcmFtZSAtIHRoaXMudGltZUxvYWQpIC8gMTAwMC4wO1xuICAgICAgICAgICAgdGhpcy51bmlmb3JtKCcxZicsICdmbG9hdCcsICd1X3RpbWUnLCB0aW1lKTtcblxuICAgICAgICAgICAgLy8gc2V0IHRoZSByZXNvbHV0aW9uIHVuaWZvcm1cbiAgICAgICAgICAgIHRoaXMudW5pZm9ybSgnMmYnLCAndmVjMicsICd1X3Jlc29sdXRpb24nLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcblxuICAgICAgICAgICAgdGhpcy50ZXh1cmVJbmRleCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXggaW4gdGhpcy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybVRleHR1cmUodGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRHJhdyB0aGUgcmVjdGFuZ2xlLlxuICAgICAgICAgICAgdGhpcy5nbC5kcmF3QXJyYXlzKHRoaXMuZ2wuVFJJQU5HTEVTLCAwLCA2KTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBldmVudFxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdyZW5kZXInLCB7fSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcmNlUmVuZGVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gJzAuMC4zJztcbiAgICB9XG59XG5cbndpbmRvdy5HbHNsQ2FudmFzID0gR2xzbENhbnZhcztcblxuZnVuY3Rpb24gbG9hZEFsbEdsc2xDYW52YXMoKSB7XG4gICAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdnbHNsQ2FudmFzJyk7XG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICB3aW5kb3cuZ2xzbENhbnZhc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHNhbmRib3ggPSBuZXcgR2xzbENhbnZhcyhsaXN0W2ldKTtcbiAgICAgICAgICAgIGlmIChzYW5kYm94LmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZ2xzbENhbnZhc2VzLnB1c2goc2FuZGJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbG9hZEFsbEdsc2xDYW52YXMoKTtcbn07XG4iLCIvLyBUZXh0dXJlIG1hbmFnZW1lbnRcbmltcG9ydCB7IGlzUG93ZXJPZjIgfSBmcm9tICcuLi90b29scy9jb21tb24nO1xuaW1wb3J0IHsgc3Vic2NyaWJlTWl4aW4gfSBmcm9tICcuLi90b29scy9taXhpbic7XG5cbi8vIEdMIHRleHR1cmUgd3JhcHBlciBvYmplY3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYSBnbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBrZXllZCBieSBhIHVuaXF1ZSB1c2VyLWRlZmluZWQgbmFtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZSB7XG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdWJzY3JpYmVNaXhpbih0aGlzKTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsOyAvLyBhIFByb21pc2Ugb2JqZWN0IHRvIHRyYWNrIHRoZSBsb2FkaW5nIHN0YXRlIG9mIHRoaXMgdGV4dHVyZVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbGluZWFyJyB9KTtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJpbmcob3B0aW9ucy5maWx0ZXJpbmcpO1xuXG4gICAgICAgIHRoaXMubG9hZChvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGJpbmQodW5pdCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVuaXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoVGV4dHVyZS5hY3RpdmVVbml0ICE9PSB1bml0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLmFjdGl2ZVVuaXQgPSB1bml0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChUZXh0dXJlLmFjdGl2ZVRleHR1cmUgIT09IHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBUZXh0dXJlLmFjdGl2ZVRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQob3B0aW9ucy5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0LCBvcHRpb25zLmRhdGEsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSAndXJsJztcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQoaW1hZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogZmFpbGVkIHRvIGxvYWQgdXJsOiAnJHt0aGlzLnNvdXJjZX0nYCwgZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSAnZGF0YSc7XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSB0ZXh0dXJlIHRvIHRyYWNrIGEgZWxlbWVudCAoY2FudmFzL2ltYWdlKVxuICAgIHNldEVsZW1lbnQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vIGEgc3RyaW5nIGVsZW1lbnQgaXMgaW50ZXJwZXRlZCBhcyBhIENTUyBzZWxlY3RvclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VUeXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1zZyA9IGB0aGUgJ2VsZW1lbnQnIHBhcmFtZXRlciAoXFxgZWxlbWVudDogJHtKU09OLnN0cmluZ2lmeShlbCl9XFxgKSBtdXN0IGJlIGEgQ1NTIGA7XG4gICAgICAgICAgICBtc2cgKz0gYHNlbGVjdG9yIHN0cmluZywgb3IgYSA8Y2FudmFzPiwgPGltYWdlPiBvciA8dmlkZW8+IG9iamVjdGA7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogJHttc2d9YCwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVXBsb2FkcyBjdXJyZW50IGltYWdlIG9yIGJ1ZmZlciB0byB0aGUgR1BVIChjYW4gYmUgdXNlZCB0byB1cGRhdGUgYW5pbWF0ZWQgdGV4dHVyZXMgb24gdGhlIGZseSlcbiAgICB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAob3B0aW9ucy5VTlBBQ0tfRkxJUF9ZX1dFQkdMID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSkpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBvcHRpb25zLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCB8fCBmYWxzZSk7XG5cbiAgICAgICAgLy8gSW1hZ2Ugb3IgQ2FudmFzIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuc291cmNlVHlwZSA9PT0gJ2VsZW1lbnQnICYmXG4gICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICYmIHRoaXMuc291cmNlLmNvbXBsZXRlKSkpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VUeXBlID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5VTlNJR05FRF9CWVRFLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkZWQnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nIChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvd2VyT2YyID0gaXNQb3dlck9mMih0aGlzLndpZHRoKSAmJiBpc1Bvd2VyT2YyKHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgbGV0IGRlZnVhbHRGaWx0ZXIgPSAodGhpcy5wb3dlck9mMiA/ICdtaXBtYXAnIDogJ2xpbmVhcicpO1xuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nIHx8IGRlZnVhbHRGaWx0ZXI7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKHRoaXMucG93ZXJPZjIpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1MgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBvcHRpb25zLlRFWFRVUkVfV1JBUF9UIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmcgPT09ICdtaXBtYXAnKSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIGhhcyBzdHJpY3QgcmVxdWlyZW1lbnRzIG9uIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzOlxuICAgICAgICAgICAgLy8gTm8gbWlwbWFwcyBhbmQgbXVzdCBjbGFtcCB0byBlZGdlXG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmcgPT09ICdtaXBtYXAnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBSZXBvcnQgbWF4IHRleHR1cmUgc2l6ZSBmb3IgYSBHTCBjb250ZXh0XG5UZXh0dXJlLmdldE1heFRleHR1cmVTaXplID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbn07XG5cbi8vIEdsb2JhbCBzZXQgb2YgdGV4dHVyZXMsIGJ5IG5hbWVcblRleHR1cmUuYWN0aXZlVW5pdCA9IC0xO1xuIiwibGV0IGxhc3RFcnJvciA9ICcnO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIEhUTE0gZm9yIGEgZmFpbHVyZSBtZXNzYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2FudmFzQ29udGFpbmVySWQgaWQgb2YgY29udGFpbmVyIG9mIHRoXG4gKiAgICAgICAgY2FudmFzLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaHRtbC5cbiAqL1xuZnVuY3Rpb24gbWFrZUZhaWxIVE1MKG1zZykge1xuICAgIHJldHVybiBgXG48dGFibGUgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjOENFOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlO1wiPjx0cj5cbjx0ZCBhbGlnbj1cImNlbnRlclwiPlxuPGRpdiBzdHlsZT1cImRpc3BsYXk6IHRhYmxlLWNlbGw7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCI+XG48ZGl2IHN0eWxlPVwiXCI+YCArIG1zZyArIGA8L2Rpdj5cbjwvZGl2PlxuPC90ZD48L3RyPjwvdGFibGU+XG5gO1xufVxuXG4vKipcbiAqIE1lc2FzZ2UgZm9yIGdldHRpbmcgYSB3ZWJnbCBicm93c2VyXG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5sZXQgR0VUX0FfV0VCR0xfQlJPV1NFUiA9IGBcblx0VGhpcyBwYWdlIHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIFdlYkdMLjxici8+XG5cdDxhIGhyZWY9XCJodHRwOi8vZ2V0LndlYmdsLm9yZ1wiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxuYDtcblxuLyoqXG4gKiBNZXNhc2dlIGZvciBuZWVkIGJldHRlciBoYXJkd2FyZVxuICogQHR5cGUge3N0cmluZ31cbiAqL1xubGV0IE9USEVSX1BST0JMRU0gPSBgXG5cdEl0IGRvZXMgbm90IGFwcGVhciB5b3VyIGNvbXB1dGVyIGNhbiBzdXBwb3J0IFdlYkdMLjxici8+XG5cdDxhIGhyZWY9XCJodHRwOi8vZ2V0LndlYmdsLm9yZy90cm91Ymxlc2hvb3RpbmcvXCI+Q2xpY2sgaGVyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2E+XG5gO1xuXG4vKipcbiAqIENyZWF0ZXMgYSB3ZWJnbCBjb250ZXh0LiBJZiBjcmVhdGlvbiBmYWlscyBpdCB3aWxsXG4gKiBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIgb2YgdGhlIDxjYW52YXM+XG4gKiB0YWcgdG8gYW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRoZSBjb3JyZWN0IGxpbmtzIGZvciBXZWJHTC5cbiAqIEBwYXJhbSB7RWxlbWVudH0gY2FudmFzLiBUaGUgY2FudmFzIGVsZW1lbnQgdG8gY3JlYXRlIGFcbiAqICAgICBjb250ZXh0IGZyb20uXG4gKiBAcGFyYW0ge1dlYkdMQ29udGV4dENyZWF0aW9uQXR0aXJidXRlc30gb3B0QXR0cmlicyBBbnlcbiAqICAgICBjcmVhdGlvbiBhdHRyaWJ1dGVzIHlvdSB3YW50IHRvIHBhc3MgaW4uXG4gKiBAcmV0dXJuIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IFRoZSBjcmVhdGVkIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFdlYkdMIChjYW52YXMsIG9wdEF0dHJpYnMpIHtcbiAgICBmdW5jdGlvbiBzaG93TGluayhzdHIpIHtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbWFrZUZhaWxIVE1MKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXdpbmRvdy5XZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICAgICAgc2hvd0xpbmsoR0VUX0FfV0VCR0xfQlJPV1NFUik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjb250ZXh0ID0gY3JlYXRlM0RDb250ZXh0KGNhbnZhcywgb3B0QXR0cmlicyk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHNob3dMaW5rKE9USEVSX1BST0JMRU0pO1xuICAgIH1cbiAgICBjb250ZXh0LmdldEV4dGVuc2lvbignT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHdlYmdsIGNvbnRleHQuXG4gKiBAcGFyYW0geyFDYW52YXN9IGNhbnZhcyBUaGUgY2FudmFzIHRhZyB0byBnZXQgY29udGV4dFxuICogICAgIGZyb20uIElmIG9uZSBpcyBub3QgcGFzc2VkIGluIG9uZSB3aWxsIGJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJuIHshV2ViR0xDb250ZXh0fSBUaGUgY3JlYXRlZCBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlM0RDb250ZXh0KGNhbnZhcywgb3B0QXR0cmlicykge1xuICAgIGxldCBuYW1lcyA9IFsnd2ViZ2wnLCAnZXhwZXJpbWVudGFsLXdlYmdsJ107XG4gICAgbGV0IGNvbnRleHQgPSBudWxsO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBuYW1lcy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChuYW1lc1tpaV0sIG9wdEF0dHJpYnMpO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8qXG4gKlx0Q3JlYXRlIGEgVmVydGV4IG9mIGEgc3BlY2lmaWMgdHlwZSAoZ2wuVkVSVEVYX1NIQURFUi8pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFkZXIobWFpbiwgc291cmNlLCB0eXBlKSB7XG4gICAgbGV0IGdsID0gbWFpbi5nbDtcblxuICAgIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIodHlwZSk7XG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBsZXQgY29tcGlsZWQgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7XG5cbiAgICBpZiAoIWNvbXBpbGVkKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBjb21waWxhdGlvbjsgZ2V0IHRoZSBlcnJvclxuICAgICAgICBsYXN0RXJyb3IgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyoqKiBFcnJvciBjb21waWxpbmcgc2hhZGVyICcgKyBzaGFkZXIgKyAnOicgKyBsYXN0RXJyb3IpO1xuICAgICAgICBtYWluLnRyaWdnZXIoJ2Vycm9yJywgeyBzaGFkZXI6IHNoYWRlciwgc291cmNlOiBzb3VyY2UsIHR5cGU6IHR5cGUsIGVycm9yOiBsYXN0RXJyb3IgfSk7XG4gICAgICAgIGdsLmRlbGV0ZVNoYWRlcihzaGFkZXIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhZGVyO1xufVxuXG4vKipcbiAqIExvYWRzIGEgc2hhZGVyLlxuICogQHBhcmFtIHshV2ViR0xDb250ZXh0fSBnbCBUaGUgV2ViR0xDb250ZXh0IHRvIHVzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzaGFkZXJTb3VyY2UgVGhlIHNoYWRlciBzb3VyY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc2hhZGVyVHlwZSBUaGUgdHlwZSBvZiBzaGFkZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6IHZvaWQpIG9wdF9lcnJvckNhbGxiYWNrIGNhbGxiYWNrIGZvciBlcnJvcnMuXG4gKiBAcmV0dXJuIHshV2ViR0xTaGFkZXJ9IFRoZSBjcmVhdGVkIHNoYWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0obWFpbiwgc2hhZGVycywgb3B0QXR0cmlicywgb3B0TG9jYXRpb25zKSB7XG4gICAgbGV0IGdsID0gbWFpbi5nbDtcblxuICAgIGxldCBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBzaGFkZXJzLmxlbmd0aDsgKytpaSkge1xuICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyc1tpaV0pO1xuICAgIH1cbiAgICBpZiAob3B0QXR0cmlicykge1xuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgb3B0QXR0cmlicy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgICAgIGdsLmJpbmRBdHRyaWJMb2NhdGlvbihcbiAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICBvcHRMb2NhdGlvbnMgPyBvcHRMb2NhdGlvbnNbaWldIDogaWksXG4gICAgICAgICAgICBvcHRBdHRyaWJzW2lpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICAvLyBDaGVjayB0aGUgbGluayBzdGF0dXNcbiAgICBsZXQgbGlua2VkID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgbGlua1xuICAgICAgICBsYXN0RXJyb3IgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKTtcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIHByb2dyYW0gbGlua2luZzonICsgbGFzdEVycm9yKTtcbiAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwcm9ncmFtO1xufVxuXG4vLyBCeSBCcmV0dCBDYW1iZXIgb25cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YW5ncmFtcy90YW5ncmFtL2Jsb2IvbWFzdGVyL3NyYy9nbC9nbHNsLmpzXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbmlmb3Jtcyh1bmlmb3JtcywgcHJlZml4ID0gbnVsbCkge1xuICAgIGxldCBwYXJzZWQgPSBbXTtcblxuICAgIGZvciAobGV0IG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgbGV0IHVuaWZvcm0gPSB1bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgbGV0IHU7XG5cbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgbmFtZSA9IHByZWZpeCArICcuJyArIG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5OiB2ZWN0b3IsIGFycmF5IG9mIGZsb2F0cywgYXJyYXkgb2YgdGV4dHVyZXMsIG9yIGFycmF5IG9mIHN0cnVjdHNcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtKSkge1xuICAgICAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodW5pZm9ybS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdFtdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1swXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMgLSBidXQgb25seSBhcnJheXMgb2YgdmVjdG9ycyBhcmUgYWxsb3dlZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybVswXSkgJiYgdHlwZW9mIHVuaWZvcm1bMF1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybVswXS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtWzBdLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm1bMF0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybVt1XS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbHNlIGVycm9yP1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2Ygc3RydWN0dXJlc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGVhY2ggc3RydWN0IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCguLi5wYXJzZVVuaWZvcm1zKHVuaWZvcm1bdV0sIG5hbWUgKyAnWycgKyB1ICsgJ10nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGV4dHVyZVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2FtcGxlcjJEJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RydWN0dXJlXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gU2V0IGVhY2ggZmllbGQgaW4gdGhlIHN0cnVjdFxuICAgICAgICAgICAgcGFyc2VkLnB1c2goLi4ucGFyc2VVbmlmb3Jtcyh1bmlmb3JtLCBuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBub24tZmxvYXQgdHlwZXM/IChpbnQsIGV0Yy4pXG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQ7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDYW52YXNWaXNpYmxlKGNhbnZhcykge1xuICAgIHJldHVyblx0KChjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgY2FudmFzLmhlaWdodCkgPiAwKSAmJlxuICAgICAgICAoY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA8ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQb3dlck9mMih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0SGlnaGVzdFBvd2VyT2ZUd28oeCkge1xuICAgIC0teDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDMyOyBpIDw8PSAxKSB7XG4gICAgICAgIHggPSB4IHwgeCA+PiBpO1xuICAgIH1cbiAgICByZXR1cm4geCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBGb3JtYXROdW1iZXJMZW5ndGgobnVtLCBsZW5ndGgpIHtcbiAgICBsZXQgciA9IG51bS50b1N0cmluZygpO1xuICAgIHdoaWxlIChyLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgICAgICByID0gJzAnICsgcjtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb3VzZVBvcyhjYW52YXMsIGV2dCkge1xuICAgIGxldCByZWN0ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGV2dC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICB5OiBldnQuY2xpZW50WSAtIHJlY3QudG9wXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlmZihhLCBiKSB7XG4gICAgaWYgKGEgJiYgYikge1xuICAgICAgICByZXR1cm4gYS50b1N0cmluZygpICE9PSBiLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZU1peGluICh0YXJnZXQpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gbmV3IFNldCgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XG5cbiAgICAgICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICBvbih0eXBlLCBmKSB7XG4gICAgICAgICAgICBsZXQgbGlzdGVuZXIgPSB7fTtcbiAgICAgICAgICAgIGxpc3RlbmVyW3R5cGVdID0gZjtcbiAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZUFsbCgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVNaXhpbiAodGFyZ2V0KSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IG5ldyBTZXQoKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xuXG4gICAgICAgIG9uKHR5cGUsIGYpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ZW5lciA9IHt9O1xuICAgICAgICAgICAgbGlzdGVuZXJbdHlwZV0gPSBmO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb2ZmKHR5cGUsIGYpIHtcbiAgICAgICAgICAgIGlmIChmKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpc3RlbmVyID0ge307XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJbdHlwZV0gPSBmO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbGlzdFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlcihldmVudCwgLi4uZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcltldmVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuIl19 diff --git a/attachments/russia/js/gsap/CSSRulePlugin.min.js b/attachments/russia/js/gsap/CSSRulePlugin.min.js new file mode 100644 index 0000000..8ba9aeb --- /dev/null +++ b/attachments/russia/js/gsap/CSSRulePlugin.min.js @@ -0,0 +1,11 @@ +/*! + * CSSRulePlugin 3.12.1 + * https://greensock.com + * + * @license Copyright 2023, GreenSock. All rights reserved. + * Subject to the terms at https://greensock.com/standard-license or for Club GreenSock members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).window=e.window||{})}(this,function(e){"use strict";function h(){return"undefined"!=typeof window}function i(){return t||h()&&(t=window.gsap)&&t.registerPlugin&&t}function j(){return n||(s(),o||console.warn("Please gsap.registerPlugin(CSSPlugin, CSSRulePlugin)")),n}var t,n,c,o,s=function _initCore(e){t=e||i(),h()&&(c=document),t&&(o=t.plugins.css)&&(n=1)},r={version:"3.12.1",name:"cssRule",init:function init(e,t,n,i,s){if(!j()||void 0===e.cssText)return!1;var r=e._gsProxy=e._gsProxy||c.createElement("div");this.ss=e,this.style=r.style,r.style.cssText=e.cssText,o.prototype.init.call(this,r,t,n,i,s)},render:function render(e,t){for(var n,i=t._pt,s=t.style,r=t.ss;i;)i.r(e,i.d),i=i._next;for(n=s.length;-1<--n;)r[s[n]]=s[s[n]]},getRule:function getRule(e){j();var t,n,i,s,r=c.all?"rules":"cssRules",o=c.styleSheets,l=o.length,u=":"===e.charAt(0);for(e=(u?"":",")+e.split("::").join(":").toLowerCase()+",",u&&(s=[]);l--;){try{if(!(n=o[l][r]))continue;t=n.length}catch(e){console.warn(e);continue}for(;-1<--t;)if((i=n[t]).selectorText&&-1!==(","+i.selectorText.split("::").join(":").toLowerCase()+",").indexOf(e)){if(!u)return i.style;s.push(i.style)}}return s},register:s};i()&&t.registerPlugin(r),e.CSSRulePlugin=r,e.default=r;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}}); + diff --git a/attachments/russia/js/gsap/CSSRulePlugin.min.js.map b/attachments/russia/js/gsap/CSSRulePlugin.min.js.map new file mode 100644 index 0000000..a7aaf13 --- /dev/null +++ b/attachments/russia/js/gsap/CSSRulePlugin.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CSSRulePlugin.min.js","sources":["../src/CSSRulePlugin.js"],"sourcesContent":["/*!\n * CSSRulePlugin 3.12.1\n * https://greensock.com\n *\n * @license Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nlet gsap, _coreInitted, _win, _doc, CSSPlugin,\n\t_windowExists = () => typeof(window) !== \"undefined\",\n\t_getGSAP = () => gsap || (_windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap),\n\t_checkRegister = () => {\n\t\tif (!_coreInitted) {\n\t\t\t_initCore();\n\t\t\tif (!CSSPlugin) {\n\t\t\t\tconsole.warn(\"Please gsap.registerPlugin(CSSPlugin, CSSRulePlugin)\");\n\t\t\t}\n\t\t}\n\t\treturn _coreInitted;\n\t},\n\t_initCore = core => {\n\t\tgsap = core || _getGSAP();\n\t\tif (_windowExists()) {\n\t\t\t_win = window;\n\t\t\t_doc = document;\n\t\t}\n\t\tif (gsap) {\n\t\t\tCSSPlugin = gsap.plugins.css;\n\t\t\tif (CSSPlugin) {\n\t\t\t\t_coreInitted = 1;\n\t\t\t}\n\t\t}\n\t};\n\n\nexport const CSSRulePlugin = {\n\tversion: \"3.12.1\",\n\tname: \"cssRule\",\n\tinit(target, value, tween, index, targets) {\n\t\tif (!_checkRegister() || typeof(target.cssText) === \"undefined\") {\n\t\t\treturn false;\n\t\t}\n\t\tlet div = target._gsProxy = target._gsProxy || _doc.createElement(\"div\");\n\t\tthis.ss = target;\n\t\tthis.style = div.style;\n\t\tdiv.style.cssText = target.cssText;\n\t\tCSSPlugin.prototype.init.call(this, div, value, tween, index, targets); //we just offload all the work to the regular CSSPlugin and then copy the cssText back over to the rule in the render() method. This allows us to have all of the updates to CSSPlugin automatically flow through to CSSRulePlugin instead of having to maintain both\n\t},\n\trender(ratio, data) {\n\t\tlet pt = data._pt,\n\t\t\tstyle = data.style,\n\t\t\tss = data.ss,\n\t\t\ti;\n\t\twhile (pt) {\n\t\t\tpt.r(ratio, pt.d);\n\t\t\tpt = pt._next;\n\t\t}\n\t\ti = style.length;\n\t\twhile (--i > -1) {\n\t\t\tss[style[i]] = style[style[i]];\n\t\t}\n\t},\n\tgetRule(selector) {\n\t\t_checkRegister();\n\t\tlet ruleProp = _doc.all ? \"rules\" : \"cssRules\",\n\t\t\tstyleSheets = _doc.styleSheets,\n\t\t\ti = styleSheets.length,\n\t\t\tpseudo = (selector.charAt(0) === \":\"),\n\t\t\tj, curSS, cs, a;\n\t\tselector = (pseudo ? \"\" : \",\") + selector.split(\"::\").join(\":\").toLowerCase() + \",\"; //note: old versions of IE report tag name selectors as upper case, so we just change everything to lowercase.\n\t\tif (pseudo) {\n\t\t\ta = [];\n\t\t}\n\t\twhile (i--) {\n\t\t\t//Firefox may throw insecure operation errors when css is loaded from other domains, so try/catch.\n\t\t\ttry {\n\t\t\t\tcurSS = styleSheets[i][ruleProp];\n\t\t\t\tif (!curSS) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tj = curSS.length;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn(e);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\twhile (--j > -1) {\n\t\t\t\tcs = curSS[j];\n\t\t\t\tif (cs.selectorText && (\",\" + cs.selectorText.split(\"::\").join(\":\").toLowerCase() + \",\").indexOf(selector) !== -1) { //note: IE adds an extra \":\" to pseudo selectors, so .myClass:after becomes .myClass::after, so we need to strip the extra one out.\n\t\t\t\t\tif (pseudo) {\n\t\t\t\t\t\ta.push(cs.style);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn cs.style;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn a;\n\t},\n\tregister: _initCore\n};\n\n_getGSAP() && gsap.registerPlugin(CSSRulePlugin);\n\nexport { CSSRulePlugin as default };"],"names":["_windowExists","window","_getGSAP","gsap","registerPlugin","_checkRegister","_coreInitted","_initCore","CSSPlugin","console","warn","_doc","core","document","plugins","css","CSSRulePlugin","version","name","init","target","value","tween","index","targets","cssText","div","_gsProxy","createElement","ss","style","prototype","call","this","render","ratio","data","i","pt","_pt","r","d","_next","length","getRule","selector","j","curSS","cs","a","ruleProp","all","styleSheets","pseudo","charAt","split","join","toLowerCase","e","selectorText","indexOf","push","register"],"mappings":";;;;;;;;;6MAYiB,SAAhBA,UAAyC,oBAAZC,OAClB,SAAXC,WAAiBC,GAASH,MAAoBG,EAAOF,OAAOE,OAASA,EAAKC,gBAAkBD,EAC3E,SAAjBE,WACMC,IACJC,IACKC,GACJC,QAAQC,KAAK,yDAGRJ,MAVLH,EAAMG,EAAoBK,EAAMH,EAYnCD,EAAY,SAAZA,UAAYK,GACXT,EAAOS,GAAQV,IACXF,MAEHW,EAAOE,UAEJV,IACHK,EAAYL,EAAKW,QAAQC,OAExBT,EAAe,IAMNU,EAAgB,CAC5BC,QAAS,SACTC,KAAM,UACNC,mBAAKC,EAAQC,EAAOC,EAAOC,EAAOC,OAC5BnB,UAA+C,IAApBe,EAAOK,eAC/B,MAEJC,EAAMN,EAAOO,SAAWP,EAAOO,UAAYhB,EAAKiB,cAAc,YAC7DC,GAAKT,OACLU,MAAQJ,EAAII,MACjBJ,EAAII,MAAML,QAAUL,EAAOK,QAC3BjB,EAAUuB,UAAUZ,KAAKa,KAAKC,KAAMP,EAAKL,EAAOC,EAAOC,EAAOC,IAE/DU,uBAAOC,EAAOC,WAIZC,EAHGC,EAAKF,EAAKG,IACbT,EAAQM,EAAKN,MACbD,EAAKO,EAAKP,GAEJS,GACNA,EAAGE,EAAEL,EAAOG,EAAGG,GACfH,EAAKA,EAAGI,UAETL,EAAIP,EAAMa,QACI,IAALN,GACRR,EAAGC,EAAMO,IAAMP,EAAMA,EAAMO,KAG7BO,yBAAQC,GACPxC,QAKCyC,EAAGC,EAAOC,EAAIC,EAJXC,EAAWvC,EAAKwC,IAAM,QAAU,WACnCC,EAAczC,EAAKyC,YACnBf,EAAIe,EAAYT,OAChBU,EAAiC,MAAvBR,EAASS,OAAO,OAE3BT,GAAYQ,EAAS,GAAK,KAAOR,EAASU,MAAM,MAAMC,KAAK,KAAKC,cAAgB,IAC5EJ,IACHJ,EAAI,IAEEZ,KAAK,UAGVU,EAAQK,EAAYf,GAAGa,aAIvBJ,EAAIC,EAAMJ,OACT,MAAOe,GACRjD,QAAQC,KAAKgD,kBAGA,IAALZ,OACRE,EAAKD,EAAMD,IACJa,eAAyG,KAAxF,IAAMX,EAAGW,aAAaJ,MAAM,MAAMC,KAAK,KAAKC,cAAgB,KAAKG,QAAQf,GAAkB,KAC9GQ,SAGIL,EAAGlB,MAFVmB,EAAEY,KAAKb,EAAGlB,eAOPmB,GAERa,SAAUvD,GAGXL,KAAcC,EAAKC,eAAeY"} \ No newline at end of file diff --git a/attachments/russia/js/gsap/CustomEase.min.js b/attachments/russia/js/gsap/CustomEase.min.js new file mode 100644 index 0000000..de15caf --- /dev/null +++ b/attachments/russia/js/gsap/CustomEase.min.js @@ -0,0 +1,11 @@ +/*! + * CustomEase 3.12.1 + * https://greensock.com + * + * @license Copyright 2023, GreenSock. All rights reserved. + * Subject to the terms at https://greensock.com/standard-license or for Club GreenSock members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).window=e.window||{})}(this,function(e){"use strict";function m(e){return Math.round(1e5*e)/1e5||0}var b=/[achlmqstvz]|(-?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi,w=/[\+\-]?\d*\.?\d+e[\+\-]?\d+/gi,Y=Math.PI/180,k=Math.sin,B=Math.cos,F=Math.abs,J=Math.sqrt;function arcToSegment(e,t,n,s,a,r,i,o,h){if(e!==o||t!==h){n=F(n),s=F(s);var u=a%360*Y,f=B(u),c=k(u),l=Math.PI,g=2*l,x=(e-o)/2,d=(t-h)/2,m=f*x+c*d,p=-c*x+f*d,y=m*m,M=p*p,v=y/(n*n)+M/(s*s);1u.x||u.y!==h.y&&u.x===h.x||h===u)&&h.x<=1?(u.cx=h.x-u.x,u.cy=h.y-u.y,u.n=h,u.nx=h.x,p&&1f||r===u-1)&&(n.push(c,l),a=(h-l)/(o-c)),c=o,l=h;n="M"+n.join(",")}return y&&y.setAttribute("d",n),n},CustomEase);function CustomEase(e,t,n){a||q(),this.id=e,this.setData(t,n)}p()&&M.registerPlugin(n),n.version="3.12.1",e.CustomEase=n,e.default=n;if (typeof(window)==="undefined"||window!==e){Object.defineProperty(e,"__esModule",{value:!0})} else {delete e.default}}); + diff --git a/attachments/russia/js/gsap/CustomEase.min.js.map b/attachments/russia/js/gsap/CustomEase.min.js.map new file mode 100644 index 0000000..e8b9bf5 --- /dev/null +++ b/attachments/russia/js/gsap/CustomEase.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CustomEase.min.js","sources":["../src/utils/paths.js","../src/CustomEase.js"],"sourcesContent":["/*!\n * paths 3.12.1\n * https://greensock.com\n *\n * Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nlet _svgPathExp = /[achlmqstvz]|(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n\t_numbersExp = /(?:(-)?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n\t_scientific = /[\\+\\-]?\\d*\\.?\\d+e[\\+\\-]?\\d+/ig,\n\t_selectorExp = /(^[#\\.][a-z]|[a-y][a-z])/i,\n\t_DEG2RAD = Math.PI / 180,\n\t_RAD2DEG = 180 / Math.PI,\n\t_sin = Math.sin,\n\t_cos = Math.cos,\n\t_abs = Math.abs,\n\t_sqrt = Math.sqrt,\n\t_atan2 = Math.atan2,\n\t_largeNum = 1e8,\n\t_isString = value => typeof(value) === \"string\",\n\t_isNumber = value => typeof(value) === \"number\",\n\t_isUndefined = value => typeof(value) === \"undefined\",\n\t_temp = {},\n\t_temp2 = {},\n\t_roundingNum = 1e5,\n\t_wrapProgress = progress => (Math.round((progress + _largeNum) % 1 * _roundingNum) / _roundingNum) || ((progress < 0) ? 0 : 1), //if progress lands on 1, the % will make it 0 which is why we || 1, but not if it's negative because it makes more sense for motion to end at 0 in that case.\n\t_round = value => (Math.round(value * _roundingNum) / _roundingNum) || 0,\n\t_roundPrecise = value => (Math.round(value * 1e10) / 1e10) || 0,\n\t_splitSegment = (rawPath, segIndex, i, t) => {\n\t\tlet segment = rawPath[segIndex],\n\t\t\tshift = t === 1 ? 6 : subdivideSegment(segment, i, t);\n\t\tif (shift && shift + i + 2 < segment.length) {\n\t\t\trawPath.splice(segIndex, 0, segment.slice(0, i + shift + 2));\n\t\t\tsegment.splice(0, i + shift);\n\t\t\treturn 1;\n\t\t}\n\t},\n\t_getSampleIndex = (samples, length, progress) => {\n\t\t// slightly slower way than doing this (when there's no lookup): segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0;\n\t\tlet l = samples.length,\n\t\t\ti = ~~(progress * l);\n\t\tif (samples[i] > length) {\n\t\t\twhile (--i && samples[i] > length) {}\n\t\t\ti < 0 && (i = 0);\n\t\t} else {\n\t\t\twhile (samples[++i] < length && i < l) {}\n\t\t}\n\t\treturn i < l ? i : l - 1;\n\t},\n\t_reverseRawPath = (rawPath, skipOuter) => {\n\t\tlet i = rawPath.length;\n\t\tskipOuter || rawPath.reverse();\n\t\twhile (i--) {\n\t\t\trawPath[i].reversed || reverseSegment(rawPath[i]);\n\t\t}\n\t},\n\t_copyMetaData = (source, copy) => {\n\t\tcopy.totalLength = source.totalLength;\n\t\tif (source.samples) { //segment\n\t\t\tcopy.samples = source.samples.slice(0);\n\t\t\tcopy.lookup = source.lookup.slice(0);\n\t\t\tcopy.minLength = source.minLength;\n\t\t\tcopy.resolution = source.resolution;\n\t\t} else if (source.totalPoints) { //rawPath\n\t\t\tcopy.totalPoints = source.totalPoints;\n\t\t}\n\t\treturn copy;\n\t},\n\t//pushes a new segment into a rawPath, but if its starting values match the ending values of the last segment, it'll merge it into that same segment (to reduce the number of segments)\n\t_appendOrMerge = (rawPath, segment) => {\n\t\tlet index = rawPath.length,\n\t\t\tprevSeg = rawPath[index - 1] || [],\n\t\t\tl = prevSeg.length;\n\t\tif (index && segment[0] === prevSeg[l-2] && segment[1] === prevSeg[l-1]) {\n\t\t\tsegment = prevSeg.concat(segment.slice(2));\n\t\t\tindex--;\n\t\t}\n\t\trawPath[index] = segment;\n\t},\n\t_bestDistance;\n\n/* TERMINOLOGY\n - RawPath - an array of arrays, one for each Segment. A single RawPath could have multiple \"M\" commands, defining Segments (paths aren't always connected).\n - Segment - an array containing a sequence of Cubic Bezier coordinates in alternating x, y, x, y format. Starting anchor, then control point 1, control point 2, and ending anchor, then the next control point 1, control point 2, anchor, etc. Uses less memory than an array with a bunch of {x, y} points.\n - Bezier - a single cubic Bezier with a starting anchor, two control points, and an ending anchor.\n - the variable \"t\" is typically the position along an individual Bezier path (time) and it's NOT linear, meaning it could accelerate/decelerate based on the control points whereas the \"p\" or \"progress\" value is linearly mapped to the whole path, so it shouldn't really accelerate/decelerate based on control points. So a progress of 0.2 would be almost exactly 20% along the path. \"t\" is ONLY in an individual Bezier piece.\n */\n\n//accepts basic selector text, a path instance, a RawPath instance, or a Segment and returns a RawPath (makes it easy to homogenize things). If an element or selector text is passed in, it'll also cache the value so that if it's queried again, it'll just take the path data from there instead of parsing it all over again (as long as the path data itself hasn't changed - it'll check).\nexport function getRawPath(value) {\n\tvalue = (_isString(value) && _selectorExp.test(value)) ? document.querySelector(value) || value : value;\n\tlet e = value.getAttribute ? value : 0,\n\t\trawPath;\n\tif (e && (value = value.getAttribute(\"d\"))) {\n\t\t//implements caching\n\t\tif (!e._gsPath) {\n\t\t\te._gsPath = {};\n\t\t}\n\t\trawPath = e._gsPath[value];\n\t\treturn (rawPath && !rawPath._dirty) ? rawPath : (e._gsPath[value] = stringToRawPath(value));\n\t}\n\treturn !value ? console.warn(\"Expecting a element or an SVG path data string\") : _isString(value) ? stringToRawPath(value) : (_isNumber(value[0])) ? [value] : value;\n}\n\n//copies a RawPath WITHOUT the length meta data (for speed)\nexport function copyRawPath(rawPath) {\n\tlet a = [],\n\t\ti = 0;\n\tfor (; i < rawPath.length; i++) {\n\t\ta[i] = _copyMetaData(rawPath[i], rawPath[i].slice(0));\n\t}\n\treturn _copyMetaData(rawPath, a);\n}\n\nexport function reverseSegment(segment) {\n\tlet i = 0,\n\t\ty;\n\tsegment.reverse(); //this will invert the order y, x, y, x so we must flip it back.\n\tfor (; i < segment.length; i += 2) {\n\t\ty = segment[i];\n\t\tsegment[i] = segment[i+1];\n\t\tsegment[i+1] = y;\n\t}\n\tsegment.reversed = !segment.reversed;\n}\n\n\n\nlet _createPath = (e, ignore) => {\n\t\tlet path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\"),\n\t\t\tattr = [].slice.call(e.attributes),\n\t\t\ti = attr.length,\n\t\t\tname;\n\t\tignore = \",\" + ignore + \",\";\n\t\twhile (--i > -1) {\n\t\t\tname = attr[i].nodeName.toLowerCase(); //in Microsoft Edge, if you don't set the attribute with a lowercase name, it doesn't render correctly! Super weird.\n\t\t\tif (ignore.indexOf(\",\" + name + \",\") < 0) {\n\t\t\t\tpath.setAttributeNS(null, name, attr[i].nodeValue);\n\t\t\t}\n\t\t}\n\t\treturn path;\n\t},\n\t_typeAttrs = {\n\t\trect:\"rx,ry,x,y,width,height\",\n\t\tcircle:\"r,cx,cy\",\n\t\tellipse:\"rx,ry,cx,cy\",\n\t\tline:\"x1,x2,y1,y2\"\n\t},\n\t_attrToObj = (e, attrs) => {\n\t\tlet props = attrs ? attrs.split(\",\") : [],\n\t\t\tobj = {},\n\t\t\ti = props.length;\n\t\twhile (--i > -1) {\n\t\t\tobj[props[i]] = +e.getAttribute(props[i]) || 0;\n\t\t}\n\t\treturn obj;\n\t};\n\n//converts an SVG shape like , , , , , etc. to a , swapping it in and copying the attributes to match.\nexport function convertToPath(element, swap) {\n\tlet type = element.tagName.toLowerCase(),\n\t\tcirc = 0.552284749831,\n\t\tdata, x, y, r, ry, path, rcirc, rycirc, points, w, h, x2, x3, x4, x5, x6, y2, y3, y4, y5, y6, attr;\n\tif (type === \"path\" || !element.getBBox) {\n\t\treturn element;\n\t}\n\tpath = _createPath(element, \"x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points\");\n\tattr = _attrToObj(element, _typeAttrs[type]);\n\tif (type === \"rect\") {\n\t\tr = attr.rx;\n\t\try = attr.ry || r;\n\t\tx = attr.x;\n\t\ty = attr.y;\n\t\tw = attr.width - r * 2;\n\t\th = attr.height - ry * 2;\n\t\tif (r || ry) { //if there are rounded corners, render cubic beziers\n\t\t\tx2 = x + r * (1 - circ);\n\t\t\tx3 = x + r;\n\t\t\tx4 = x3 + w;\n\t\t\tx5 = x4 + r * circ;\n\t\t\tx6 = x4 + r;\n\t\t\ty2 = y + ry * (1 - circ);\n\t\t\ty3 = y + ry;\n\t\t\ty4 = y3 + h;\n\t\t\ty5 = y4 + ry * circ;\n\t\t\ty6 = y4 + ry;\n\t\t\tdata = \"M\" + x6 + \",\" + y3 + \" V\" + y4 + \" C\" + [x6, y5, x5, y6, x4, y6, x4 - (x4 - x3) / 3, y6, x3 + (x4 - x3) / 3, y6, x3, y6, x2, y6, x, y5, x, y4, x, y4 - (y4 - y3) / 3, x, y3 + (y4 - y3) / 3, x, y3, x, y2, x2, y, x3, y, x3 + (x4 - x3) / 3, y, x4 - (x4 - x3) / 3, y, x4, y, x5, y, x6, y2, x6, y3].join(\",\") + \"z\";\n\t\t} else {\n\t\t\tdata = \"M\" + (x + w) + \",\" + y + \" v\" + h + \" h\" + (-w) + \" v\" + (-h) + \" h\" + w + \"z\";\n\t\t}\n\n\t} else if (type === \"circle\" || type === \"ellipse\") {\n\t\tif (type === \"circle\") {\n\t\t\tr = ry = attr.r;\n\t\t\trycirc = r * circ;\n\t\t} else {\n\t\t\tr = attr.rx;\n\t\t\try = attr.ry;\n\t\t\trycirc = ry * circ;\n\t\t}\n\t\tx = attr.cx;\n\t\ty = attr.cy;\n\t\trcirc = r * circ;\n\t\tdata = \"M\" + (x+r) + \",\" + y + \" C\" + [x+r, y + rycirc, x + rcirc, y + ry, x, y + ry, x - rcirc, y + ry, x - r, y + rycirc, x - r, y, x - r, y - rycirc, x - rcirc, y - ry, x, y - ry, x + rcirc, y - ry, x + r, y - rycirc, x + r, y].join(\",\") + \"z\";\n\t} else if (type === \"line\") {\n\t\tdata = \"M\" + attr.x1 + \",\" + attr.y1 + \" L\" + attr.x2 + \",\" + attr.y2; //previously, we just converted to \"Mx,y Lx,y\" but Safari has bugs that cause that not to render properly when using a stroke-dasharray that's not fully visible! Using a cubic bezier fixes that issue.\n\t} else if (type === \"polyline\" || type === \"polygon\") {\n\t\tpoints = (element.getAttribute(\"points\") + \"\").match(_numbersExp) || [];\n\t\tx = points.shift();\n\t\ty = points.shift();\n\t\tdata = \"M\" + x + \",\" + y + \" L\" + points.join(\",\");\n\t\tif (type === \"polygon\") {\n\t\t\tdata += \",\" + x + \",\" + y + \"z\";\n\t\t}\n\t}\n\tpath.setAttribute(\"d\", rawPathToString(path._gsRawPath = stringToRawPath(data)));\n\tif (swap && element.parentNode) {\n\t\telement.parentNode.insertBefore(path, element);\n\t\telement.parentNode.removeChild(element);\n\t}\n\treturn path;\n}\n\n\n\n//returns the rotation (in degrees) at a particular progress on a rawPath (the slope of the tangent)\nexport function getRotationAtProgress(rawPath, progress) {\n\tlet d = getProgressData(rawPath, progress >= 1 ? 1 - 1e-9 : progress ? progress : 1e-9);\n\treturn getRotationAtBezierT(d.segment, d.i, d.t);\n}\n\nfunction getRotationAtBezierT(segment, i, t) {\n\tlet a = segment[i],\n\t\tb = segment[i+2],\n\t\tc = segment[i+4],\n\t\tx;\n\ta += (b - a) * t;\n\tb += (c - b) * t;\n\ta += (b - a) * t;\n\tx = b + ((c + (segment[i+6] - c) * t) - b) * t - a;\n\ta = segment[i+1];\n\tb = segment[i+3];\n\tc = segment[i+5];\n\ta += (b - a) * t;\n\tb += (c - b) * t;\n\ta += (b - a) * t;\n\treturn _round(_atan2(b + ((c + (segment[i+7] - c) * t) - b) * t - a, x) * _RAD2DEG);\n}\n\nexport function sliceRawPath(rawPath, start, end) {\n\tend = _isUndefined(end) ? 1 : _roundPrecise(end) || 0; // we must round to avoid issues like 4.15 / 8 = 0.8300000000000001 instead of 0.83 or 2.8 / 5 = 0.5599999999999999 instead of 0.56 and if someone is doing a loop like start: 2.8 / 0.5, end: 2.8 / 0.5 + 1.\n\tstart = _roundPrecise(start) || 0;\n\tlet loops = Math.max(0, ~~(_abs(end - start) - 1e-8)),\n\t\tpath = copyRawPath(rawPath);\n\tif (start > end) {\n\t\tstart = 1 - start;\n\t\tend = 1 - end;\n\t\t_reverseRawPath(path);\n\t\tpath.totalLength = 0;\n\t}\n\tif (start < 0 || end < 0) {\n\t\tlet offset = Math.abs(~~Math.min(start, end)) + 1;\n\t\tstart += offset;\n\t\tend += offset;\n\t}\n\tpath.totalLength || cacheRawPathMeasurements(path);\n\tlet wrap = (end > 1),\n\t\ts = getProgressData(path, start, _temp, true),\n\t\te = getProgressData(path, end, _temp2),\n\t\teSeg = e.segment,\n\t\tsSeg = s.segment,\n\t\teSegIndex = e.segIndex,\n\t\tsSegIndex = s.segIndex,\n\t\tei = e.i,\n\t\tsi = s.i,\n\t\tsameSegment = (sSegIndex === eSegIndex),\n\t\tsameBezier = (ei === si && sameSegment),\n\t\twrapsBehind, sShift, eShift, i, copy, totalSegments, l, j;\n\tif (wrap || loops) {\n\t\twrapsBehind = eSegIndex < sSegIndex || (sameSegment && ei < si) || (sameBezier && e.t < s.t);\n\t\tif (_splitSegment(path, sSegIndex, si, s.t)) {\n\t\t\tsSegIndex++;\n\t\t\tif (!wrapsBehind) {\n\t\t\t\teSegIndex++;\n\t\t\t\tif (sameBezier) {\n\t\t\t\t\te.t = (e.t - s.t) / (1 - s.t);\n\t\t\t\t\tei = 0;\n\t\t\t\t} else if (sameSegment) {\n\t\t\t\t\tei -= si;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Math.abs(1 - (end - start)) < 1e-5) {\n\t\t\teSegIndex = sSegIndex - 1;\n\t\t} else if (!e.t && eSegIndex) {\n\t\t\teSegIndex--;\n\t\t} else if (_splitSegment(path, eSegIndex, ei, e.t) && wrapsBehind) {\n\t\t\tsSegIndex++;\n\t\t}\n\t\tif (s.t === 1) {\n\t\t\tsSegIndex = (sSegIndex + 1) % path.length;\n\t\t}\n\t\tcopy = [];\n\t\ttotalSegments = path.length;\n\t\tl = 1 + totalSegments * loops;\n\t\tj = sSegIndex;\n\t\tl += ((totalSegments - sSegIndex) + eSegIndex) % totalSegments;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\t_appendOrMerge(copy, path[j++ % totalSegments]);\n\t\t}\n\t\tpath = copy;\n\t} else {\n\t\teShift = e.t === 1 ? 6 : subdivideSegment(eSeg, ei, e.t);\n\t\tif (start !== end) {\n\t\t\tsShift = subdivideSegment(sSeg, si, sameBezier ? s.t / e.t : s.t);\n\t\t\tsameSegment && (eShift += sShift);\n\t\t\teSeg.splice(ei + eShift + 2);\n\t\t\t(sShift || si) && sSeg.splice(0, si + sShift);\n\t\t\ti = path.length;\n\t\t\twhile (i--) {\n\t\t\t\t//chop off any extra segments\n\t\t\t\t(i < sSegIndex || i > eSegIndex) &&\tpath.splice(i, 1);\n\t\t\t}\n\t\t} else {\n\t\t\teSeg.angle = getRotationAtBezierT(eSeg, ei + eShift, 0); //record the value before we chop because it'll be impossible to determine the angle after its length is 0!\n\t\t\tei += eShift;\n\t\t\ts = eSeg[ei];\n\t\t\te = eSeg[ei+1];\n\t\t\teSeg.length = eSeg.totalLength = 0;\n\t\t\teSeg.totalPoints = path.totalPoints = 8;\n\t\t\teSeg.push(s, e, s, e, s, e, s, e);\n\t\t}\n\t}\n\tpath.totalLength = 0;\n\treturn path;\n}\n\n//measures a Segment according to its resolution (so if segment.resolution is 6, for example, it'll take 6 samples equally across each Bezier) and create/populate a \"samples\" Array that has the length up to each of those sample points (always increasing from the start) as well as a \"lookup\" array that's broken up according to the smallest distance between 2 samples. This gives us a very fast way of looking up a progress position rather than looping through all the points/Beziers. You can optionally have it only measure a subset, starting at startIndex and going for a specific number of beziers (remember, there are 3 x/y pairs each, for a total of 6 elements for each Bezier). It will also populate a \"totalLength\" property, but that's not generally super accurate because by default it'll only take 6 samples per Bezier. But for performance reasons, it's perfectly adequate for measuring progress values along the path. If you need a more accurate totalLength, either increase the resolution or use the more advanced bezierToPoints() method which keeps adding points until they don't deviate by more than a certain precision value.\nfunction measureSegment(segment, startIndex, bezierQty) {\n\tstartIndex = startIndex || 0;\n\tif (!segment.samples) {\n\t\tsegment.samples = [];\n\t\tsegment.lookup = [];\n\t}\n\tlet resolution = ~~segment.resolution || 12,\n\t\tinc = 1 / resolution,\n\t\tendIndex = bezierQty ? startIndex + bezierQty * 6 + 1 : segment.length,\n\t\tx1 = segment[startIndex],\n\t\ty1 = segment[startIndex + 1],\n\t\tsamplesIndex = startIndex ? (startIndex / 6) * resolution : 0,\n\t\tsamples = segment.samples,\n\t\tlookup = segment.lookup,\n\t\tmin = (startIndex ? segment.minLength : _largeNum) || _largeNum,\n\t\tprevLength = samples[samplesIndex + bezierQty * resolution - 1],\n\t\tlength = startIndex ? samples[samplesIndex-1] : 0,\n\t\ti, j, x4, x3, x2, xd, xd1, y4, y3, y2, yd, yd1, inv, t, lengthIndex, l, segLength;\n\tsamples.length = lookup.length = 0;\n\tfor (j = startIndex + 2; j < endIndex; j += 6) {\n\t\tx4 = segment[j + 4] - x1;\n\t\tx3 = segment[j + 2] - x1;\n\t\tx2 = segment[j] - x1;\n\t\ty4 = segment[j + 5] - y1;\n\t\ty3 = segment[j + 3] - y1;\n\t\ty2 = segment[j + 1] - y1;\n\t\txd = xd1 = yd = yd1 = 0;\n\t\tif (_abs(x4) < .01 && _abs(y4) < .01 && _abs(x2) + _abs(y2) < .01) { //dump points that are sufficiently close (basically right on top of each other, making a bezier super tiny or 0 length)\n\t\t\tif (segment.length > 8) {\n\t\t\t\tsegment.splice(j, 6);\n\t\t\t\tj -= 6;\n\t\t\t\tendIndex -= 6;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 1; i <= resolution; i++) {\n\t\t\t\tt = inc * i;\n\t\t\t\tinv = 1 - t;\n\t\t\t\txd = xd1 - (xd1 = (t * t * x4 + 3 * inv * (t * x3 + inv * x2)) * t);\n\t\t\t\tyd = yd1 - (yd1 = (t * t * y4 + 3 * inv * (t * y3 + inv * y2)) * t);\n\t\t\t\tl = _sqrt(yd * yd + xd * xd);\n\t\t\t\tif (l < min) {\n\t\t\t\t\tmin = l;\n\t\t\t\t}\n\t\t\t\tlength += l;\n\t\t\t\tsamples[samplesIndex++] = length;\n\t\t\t}\n\t\t}\n\t\tx1 += x4;\n\t\ty1 += y4;\n\t}\n\tif (prevLength) {\n\t\tprevLength -= length;\n\t\tfor (; samplesIndex < samples.length; samplesIndex++) {\n\t\t\tsamples[samplesIndex] += prevLength;\n\t\t}\n\t}\n\tif (samples.length && min) {\n\t\tsegment.totalLength = segLength = samples[samples.length-1] || 0;\n\t\tsegment.minLength = min;\n\t\tif (segLength / min < 9999) { // if the lookup would require too many values (memory problem), we skip this and instead we use a loop to lookup values directly in the samples Array\n\t\t\tl = lengthIndex = 0;\n\t\t\tfor (i = 0; i < segLength; i += min) {\n\t\t\t\tlookup[l++] = (samples[lengthIndex] < i) ? ++lengthIndex : lengthIndex;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tsegment.totalLength = samples[0] = 0;\n\t}\n\treturn startIndex ? length - samples[startIndex / 2 - 1] : length;\n}\n\nexport function cacheRawPathMeasurements(rawPath, resolution) {\n\tlet pathLength, points, i;\n\tfor (i = pathLength = points = 0; i < rawPath.length; i++) {\n\t\trawPath[i].resolution = ~~resolution || 12; //steps per Bezier curve (anchor, 2 control points, to anchor)\n\t\tpoints += rawPath[i].length;\n\t\tpathLength += measureSegment(rawPath[i]);\n\t}\n\trawPath.totalPoints = points;\n\trawPath.totalLength = pathLength;\n\treturn rawPath;\n}\n\n//divide segment[i] at position t (value between 0 and 1, progress along that particular cubic bezier segment that starts at segment[i]). Returns how many elements were spliced into the segment array (either 0 or 6)\nexport function subdivideSegment(segment, i, t) {\n\tif (t <= 0 || t >= 1) {\n\t\treturn 0;\n\t}\n\tlet ax = segment[i],\n\t\tay = segment[i+1],\n\t\tcp1x = segment[i+2],\n\t\tcp1y = segment[i+3],\n\t\tcp2x = segment[i+4],\n\t\tcp2y = segment[i+5],\n\t\tbx = segment[i+6],\n\t\tby = segment[i+7],\n\t\tx1a = ax + (cp1x - ax) * t,\n\t\tx2 = cp1x + (cp2x - cp1x) * t,\n\t\ty1a = ay + (cp1y - ay) * t,\n\t\ty2 = cp1y + (cp2y - cp1y) * t,\n\t\tx1 = x1a + (x2 - x1a) * t,\n\t\ty1 = y1a + (y2 - y1a) * t,\n\t\tx2a = cp2x + (bx - cp2x) * t,\n\t\ty2a = cp2y + (by - cp2y) * t;\n\tx2 += (x2a - x2) * t;\n\ty2 += (y2a - y2) * t;\n\tsegment.splice(i + 2, 4,\n\t\t_round(x1a), //first control point\n\t\t_round(y1a),\n\t\t_round(x1), //second control point\n\t\t_round(y1),\n\t\t_round(x1 + (x2 - x1) * t), //new fabricated anchor on line\n\t\t_round(y1 + (y2 - y1) * t),\n\t\t_round(x2), //third control point\n\t\t_round(y2),\n\t\t_round(x2a), //fourth control point\n\t\t_round(y2a)\n\t);\n\tsegment.samples && segment.samples.splice(((i / 6) * segment.resolution) | 0, 0, 0, 0, 0, 0, 0, 0);\n\treturn 6;\n}\n\n// returns an object {path, segment, segIndex, i, t}\nfunction getProgressData(rawPath, progress, decoratee, pushToNextIfAtEnd) {\n\tdecoratee = decoratee || {};\n\trawPath.totalLength || cacheRawPathMeasurements(rawPath);\n\tif (progress < 0 || progress > 1) {\n\t\tprogress = _wrapProgress(progress);\n\t}\n\tlet segIndex = 0,\n\t\tsegment = rawPath[0],\n\t\tsamples, resolution, length, min, max, i, t;\n\tif (!progress) {\n\t\tt = i = segIndex = 0;\n\t\tsegment = rawPath[0];\n\t} else if (progress === 1) {\n\t\tt = 1;\n\t\tsegIndex = rawPath.length - 1;\n\t\tsegment = rawPath[segIndex];\n\t\ti = segment.length - 8;\n\t} else {\n\t\tif (rawPath.length > 1) { //speed optimization: most of the time, there's only one segment so skip the recursion.\n\t\t\tlength = rawPath.totalLength * progress;\n\t\t\tmax = i = 0;\n\t\t\twhile ((max += rawPath[i++].totalLength) < length) {\n\t\t\t\tsegIndex = i;\n\t\t\t}\n\t\t\tsegment = rawPath[segIndex];\n\t\t\tmin = max - segment.totalLength;\n\t\t\tprogress = ((length - min) / (max - min)) || 0;\n\t\t}\n\t\tsamples = segment.samples;\n\t\tresolution = segment.resolution; //how many samples per cubic bezier chunk\n\t\tlength = segment.totalLength * progress;\n\t\ti = segment.lookup.length ? segment.lookup[~~(length / segment.minLength)] || 0 : _getSampleIndex(samples, length, progress);\n\t\tmin = i ? samples[i-1] : 0;\n\t\tmax = samples[i];\n\t\tif (max < length) {\n\t\t\tmin = max;\n\t\t\tmax = samples[++i];\n\t\t}\n\t\tt = (1 / resolution) * (((length - min) / (max - min)) + ((i % resolution)));\n\t\ti = ~~(i / resolution) * 6;\n\t\tif (pushToNextIfAtEnd && t === 1) {\n\t\t\tif (i + 6 < segment.length) {\n\t\t\t\ti += 6;\n\t\t\t\tt = 0;\n\t\t\t} else if (segIndex + 1 < rawPath.length) {\n\t\t\t\ti = t = 0;\n\t\t\t\tsegment = rawPath[++segIndex];\n\t\t\t}\n\t\t}\n\t}\n\tdecoratee.t = t;\n\tdecoratee.i = i;\n\tdecoratee.path = rawPath;\n\tdecoratee.segment = segment;\n\tdecoratee.segIndex = segIndex;\n\treturn decoratee;\n}\n\nexport function getPositionOnPath(rawPath, progress, includeAngle, point) {\n\tlet segment = rawPath[0],\n\t\tresult = point || {},\n\t\tsamples, resolution, length, min, max, i, t, a, inv;\n\tif (progress < 0 || progress > 1) {\n\t\tprogress = _wrapProgress(progress);\n\t}\n\tsegment.lookup || cacheRawPathMeasurements(rawPath);\n\tif (rawPath.length > 1) { //speed optimization: most of the time, there's only one segment so skip the recursion.\n\t\tlength = rawPath.totalLength * progress;\n\t\tmax = i = 0;\n\t\twhile ((max += rawPath[i++].totalLength) < length) {\n\t\t\tsegment = rawPath[i];\n\t\t}\n\t\tmin = max - segment.totalLength;\n\t\tprogress = ((length - min) / (max - min)) || 0;\n\t}\n\tsamples = segment.samples;\n\tresolution = segment.resolution;\n\tlength = segment.totalLength * progress;\n\ti = segment.lookup.length ? segment.lookup[progress < 1 ? ~~(length / segment.minLength) : segment.lookup.length - 1] || 0 : _getSampleIndex(samples, length, progress);\n\tmin = i ? samples[i-1] : 0;\n\tmax = samples[i];\n\tif (max < length) {\n\t\tmin = max;\n\t\tmax = samples[++i];\n\t}\n\tt = ((1 / resolution) * (((length - min) / (max - min)) + ((i % resolution)))) || 0;\n\tinv = 1 - t;\n\ti = ~~(i / resolution) * 6;\n\ta = segment[i];\n\tresult.x = _round((t * t * (segment[i + 6] - a) + 3 * inv * (t * (segment[i + 4] - a) + inv * (segment[i + 2] - a))) * t + a);\n\tresult.y = _round((t * t * (segment[i + 7] - (a = segment[i+1])) + 3 * inv * (t * (segment[i + 5] - a) + inv * (segment[i + 3] - a))) * t + a);\n\tif (includeAngle) {\n\t\tresult.angle = segment.totalLength ? getRotationAtBezierT(segment, i, t >= 1 ? 1 - 1e-9 : t ? t : 1e-9) : segment.angle || 0;\n\t}\n\treturn result;\n}\n\n\n\n//applies a matrix transform to RawPath (or a segment in a RawPath) and returns whatever was passed in (it transforms the values in the array(s), not a copy).\nexport function transformRawPath(rawPath, a, b, c, d, tx, ty) {\n\tlet j = rawPath.length,\n\t\tsegment, l, i, x, y;\n\twhile (--j > -1) {\n\t\tsegment = rawPath[j];\n\t\tl = segment.length;\n\t\tfor (i = 0; i < l; i += 2) {\n\t\t\tx = segment[i];\n\t\t\ty = segment[i+1];\n\t\t\tsegment[i] = x * a + y * c + tx;\n\t\t\tsegment[i+1] = x * b + y * d + ty;\n\t\t}\n\t}\n\trawPath._dirty = 1;\n\treturn rawPath;\n}\n\n\n\n// translates SVG arc data into a segment (cubic beziers). Angle is in degrees.\nfunction arcToSegment(lastX, lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y) {\n\tif (lastX === x && lastY === y) {\n\t\treturn;\n\t}\n\trx = _abs(rx);\n\try = _abs(ry);\n\tlet angleRad = (angle % 360) * _DEG2RAD,\n\t\tcosAngle = _cos(angleRad),\n\t\tsinAngle = _sin(angleRad),\n\t\tPI = Math.PI,\n\t\tTWOPI = PI * 2,\n\t\tdx2 = (lastX - x) / 2,\n\t\tdy2 = (lastY - y) / 2,\n\t\tx1 = (cosAngle * dx2 + sinAngle * dy2),\n\t\ty1 = (-sinAngle * dx2 + cosAngle * dy2),\n\t\tx1_sq = x1 * x1,\n\t\ty1_sq = y1 * y1,\n\t\tradiiCheck = x1_sq / (rx * rx) + y1_sq / (ry * ry);\n\tif (radiiCheck > 1) {\n\t\trx = _sqrt(radiiCheck) * rx;\n\t\try = _sqrt(radiiCheck) * ry;\n\t}\n\tlet rx_sq = rx * rx,\n\t\try_sq = ry * ry,\n\t\tsq = ((rx_sq * ry_sq) - (rx_sq * y1_sq) - (ry_sq * x1_sq)) / ((rx_sq * y1_sq) + (ry_sq * x1_sq));\n\tif (sq < 0) {\n\t\tsq = 0;\n\t}\n\tlet coef = ((largeArcFlag === sweepFlag) ? -1 : 1) * _sqrt(sq),\n\t\tcx1 = coef * ((rx * y1) / ry),\n\t\tcy1 = coef * -((ry * x1) / rx),\n\t\tsx2 = (lastX + x) / 2,\n\t\tsy2 = (lastY + y) / 2,\n\t\tcx = sx2 + (cosAngle * cx1 - sinAngle * cy1),\n\t\tcy = sy2 + (sinAngle * cx1 + cosAngle * cy1),\n\t\tux = (x1 - cx1) / rx,\n\t\tuy = (y1 - cy1) / ry,\n\t\tvx = (-x1 - cx1) / rx,\n\t\tvy = (-y1 - cy1) / ry,\n\t\ttemp = ux * ux + uy * uy,\n\t\tangleStart = ((uy < 0) ? -1 : 1) * Math.acos(ux / _sqrt(temp)),\n\t\tangleExtent = ((ux * vy - uy * vx < 0) ? -1 : 1) * Math.acos((ux * vx + uy * vy) / _sqrt(temp * (vx * vx + vy * vy)));\n\tisNaN(angleExtent) && (angleExtent = PI); //rare edge case. Math.cos(-1) is NaN.\n\tif (!sweepFlag && angleExtent > 0) {\n\t\tangleExtent -= TWOPI;\n\t} else if (sweepFlag && angleExtent < 0) {\n\t\tangleExtent += TWOPI;\n\t}\n\tangleStart %= TWOPI;\n\tangleExtent %= TWOPI;\n\tlet segments = Math.ceil(_abs(angleExtent) / (TWOPI / 4)),\n\t\trawPath = [],\n\t\tangleIncrement = angleExtent / segments,\n\t\tcontrolLength = 4 / 3 * _sin(angleIncrement / 2) / (1 + _cos(angleIncrement / 2)),\n\t\tma = cosAngle * rx,\n\t\tmb = sinAngle * rx,\n\t\tmc = sinAngle * -ry,\n\t\tmd = cosAngle * ry,\n\t\ti;\n\tfor (i = 0; i < segments; i++) {\n\t\tangle = angleStart + i * angleIncrement;\n\t\tx1 = _cos(angle);\n\t\ty1 = _sin(angle);\n\t\tux = _cos(angle += angleIncrement);\n\t\tuy = _sin(angle);\n\t\trawPath.push(x1 - controlLength * y1, y1 + controlLength * x1, ux + controlLength * uy, uy - controlLength * ux, ux, uy);\n\t}\n\t//now transform according to the actual size of the ellipse/arc (the beziers were noramlized, between 0 and 1 on a circle).\n\tfor (i = 0; i < rawPath.length; i+=2) {\n\t\tx1 = rawPath[i];\n\t\ty1 = rawPath[i+1];\n\t\trawPath[i] = x1 * ma + y1 * mc + cx;\n\t\trawPath[i+1] = x1 * mb + y1 * md + cy;\n\t}\n\trawPath[i-2] = x; //always set the end to exactly where it's supposed to be\n\trawPath[i-1] = y;\n\treturn rawPath;\n}\n\n//Spits back a RawPath with absolute coordinates. Each segment starts with a \"moveTo\" command (x coordinate, then y) and then 2 control points (x, y, x, y), then anchor. The goal is to minimize memory and maximize speed.\nexport function stringToRawPath(d) {\n\tlet a = (d + \"\").replace(_scientific, m => { let n = +m; return (n < 0.0001 && n > -0.0001) ? 0 : n; }).match(_svgPathExp) || [], //some authoring programs spit out very small numbers in scientific notation like \"1e-5\", so make sure we round that down to 0 first.\n\t\tpath = [],\n\t\trelativeX = 0,\n\t\trelativeY = 0,\n\t\ttwoThirds = 2 / 3,\n\t\telements = a.length,\n\t\tpoints = 0,\n\t\terrorMessage = \"ERROR: malformed path: \" + d,\n\t\ti, j, x, y, command, isRelative, segment, startX, startY, difX, difY, beziers, prevCommand, flag1, flag2,\n\t\tline = function(sx, sy, ex, ey) {\n\t\t\tdifX = (ex - sx) / 3;\n\t\t\tdifY = (ey - sy) / 3;\n\t\t\tsegment.push(sx + difX, sy + difY, ex - difX, ey - difY, ex, ey);\n\t\t};\n\tif (!d || !isNaN(a[0]) || isNaN(a[1])) {\n\t\tconsole.log(errorMessage);\n\t\treturn path;\n\t}\n\tfor (i = 0; i < elements; i++) {\n\t\tprevCommand = command;\n\t\tif (isNaN(a[i])) {\n\t\t\tcommand = a[i].toUpperCase();\n\t\t\tisRelative = (command !== a[i]); //lower case means relative\n\t\t} else { //commands like \"C\" can be strung together without any new command characters between.\n\t\t\ti--;\n\t\t}\n\t\tx = +a[i + 1];\n\t\ty = +a[i + 2];\n\t\tif (isRelative) {\n\t\t\tx += relativeX;\n\t\t\ty += relativeY;\n\t\t}\n\t\tif (!i) {\n\t\t\tstartX = x;\n\t\t\tstartY = y;\n\t\t}\n\n\t\t// \"M\" (move)\n\t\tif (command === \"M\") {\n\t\t\tif (segment) {\n\t\t\t\tif (segment.length < 8) { //if the path data was funky and just had a M with no actual drawing anywhere, skip it.\n\t\t\t\t\tpath.length -= 1;\n\t\t\t\t} else {\n\t\t\t\t\tpoints += segment.length;\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = startX = x;\n\t\t\trelativeY = startY = y;\n\t\t\tsegment = [x, y];\n\t\t\tpath.push(segment);\n\t\t\ti += 2;\n\t\t\tcommand = \"L\"; //an \"M\" with more than 2 values gets interpreted as \"lineTo\" commands (\"L\").\n\n\t\t// \"C\" (cubic bezier)\n\t\t} else if (command === \"C\") {\n\t\t\tif (!segment) {\n\t\t\t\tsegment = [0, 0];\n\t\t\t}\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\t//note: \"*1\" is just a fast/short way to cast the value as a Number. WAAAY faster in Chrome, slightly slower in Firefox.\n\t\t\tsegment.push(x,\ty, relativeX + a[i + 3] * 1, relativeY + a[i + 4] * 1, (relativeX += a[i + 5] * 1),\t(relativeY += a[i + 6] * 1));\n\t\t\ti += 6;\n\n\t\t// \"S\" (continuation of cubic bezier)\n\t\t} else if (command === \"S\") {\n\t\t\tdifX = relativeX;\n\t\t\tdifY = relativeY;\n\t\t\tif (prevCommand === \"C\" || prevCommand === \"S\") {\n\t\t\t\tdifX += relativeX - segment[segment.length - 4];\n\t\t\t\tdifY += relativeY - segment[segment.length - 3];\n\t\t\t}\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\tsegment.push(difX, difY, x,\ty, (relativeX += a[i + 3] * 1), (relativeY += a[i + 4] * 1));\n\t\t\ti += 4;\n\n\t\t// \"Q\" (quadratic bezier)\n\t\t} else if (command === \"Q\") {\n\t\t\tdifX = relativeX + (x - relativeX) * twoThirds;\n\t\t\tdifY = relativeY + (y - relativeY) * twoThirds;\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\trelativeX += a[i + 3] * 1;\n\t\t\trelativeY += a[i + 4] * 1;\n\t\t\tsegment.push(difX, difY, relativeX + (x - relativeX) * twoThirds, relativeY + (y - relativeY) * twoThirds, relativeX, relativeY);\n\t\t\ti += 4;\n\n\t\t// \"T\" (continuation of quadratic bezier)\n\t\t} else if (command === \"T\") {\n\t\t\tdifX = relativeX - segment[segment.length - 4];\n\t\t\tdifY = relativeY - segment[segment.length - 3];\n\t\t\tsegment.push(relativeX + difX, relativeY + difY, x + ((relativeX + difX * 1.5) - x) * twoThirds, y + ((relativeY + difY * 1.5) - y) * twoThirds, (relativeX = x), (relativeY = y));\n\t\t\ti += 2;\n\n\t\t// \"H\" (horizontal line)\n\t\t} else if (command === \"H\") {\n\t\t\tline(relativeX, relativeY, (relativeX = x), relativeY);\n\t\t\ti += 1;\n\n\t\t// \"V\" (vertical line)\n\t\t} else if (command === \"V\") {\n\t\t\t//adjust values because the first (and only one) isn't x in this case, it's y.\n\t\t\tline(relativeX, relativeY, relativeX, (relativeY = x + (isRelative ? relativeY - relativeX : 0)));\n\t\t\ti += 1;\n\n\t\t// \"L\" (line) or \"Z\" (close)\n\t\t} else if (command === \"L\" || command === \"Z\") {\n\t\t\tif (command === \"Z\") {\n\t\t\t\tx = startX;\n\t\t\t\ty = startY;\n\t\t\t\tsegment.closed = true;\n\t\t\t}\n\t\t\tif (command === \"L\" || _abs(relativeX - x) > 0.5 || _abs(relativeY - y) > 0.5) {\n\t\t\t\tline(relativeX, relativeY, x, y);\n\t\t\t\tif (command === \"L\") {\n\t\t\t\t\ti += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = x;\n\t\t\trelativeY = y;\n\n\t\t// \"A\" (arc)\n\t\t} else if (command === \"A\") {\n\t\t\tflag1 = a[i+4];\n\t\t\tflag2 = a[i+5];\n\t\t\tdifX = a[i+6];\n\t\t\tdifY = a[i+7];\n\t\t\tj = 7;\n\t\t\tif (flag1.length > 1) { // for cases when the flags are merged, like \"a8 8 0 018 8\" (the 0 and 1 flags are WITH the x value of 8, but it could also be \"a8 8 0 01-8 8\" so it may include x or not)\n\t\t\t\tif (flag1.length < 3) {\n\t\t\t\t\tdifY = difX;\n\t\t\t\t\tdifX = flag2;\n\t\t\t\t\tj--;\n\t\t\t\t} else {\n\t\t\t\t\tdifY = flag2;\n\t\t\t\t\tdifX = flag1.substr(2);\n\t\t\t\t\tj-=2;\n\t\t\t\t}\n\t\t\t\tflag2 = flag1.charAt(1);\n\t\t\t\tflag1 = flag1.charAt(0);\n\t\t\t}\n\t\t\tbeziers = arcToSegment(relativeX, relativeY, +a[i+1], +a[i+2], +a[i+3], +flag1, +flag2, (isRelative ? relativeX : 0) + difX*1, (isRelative ? relativeY : 0) + difY*1);\n\t\t\ti += j;\n\t\t\tif (beziers) {\n\t\t\t\tfor (j = 0; j < beziers.length; j++) {\n\t\t\t\t\tsegment.push(beziers[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = segment[segment.length-2];\n\t\t\trelativeY = segment[segment.length-1];\n\n\t\t} else {\n\t\t\tconsole.log(errorMessage);\n\t\t}\n\t}\n\ti = segment.length;\n\tif (i < 6) { //in case there's odd SVG like a M0,0 command at the very end.\n\t\tpath.pop();\n\t\ti = 0;\n\t} else if (segment[0] === segment[i-2] && segment[1] === segment[i-1]) {\n\t\tsegment.closed = true;\n\t}\n\tpath.totalPoints = points + i;\n\treturn path;\n}\n\n//populates the points array in alternating x/y values (like [x, y, x, y...] instead of individual point objects [{x, y}, {x, y}...] to conserve memory and stay in line with how we're handling segment arrays\nexport function bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) {\n\tlet x12 = (x1 + x2) / 2,\n\t\ty12 = (y1 + y2) / 2,\n\t\tx23 = (x2 + x3) / 2,\n\t\ty23 = (y2 + y3) / 2,\n\t\tx34 = (x3 + x4) / 2,\n\t\ty34 = (y3 + y4) / 2,\n\t\tx123 = (x12 + x23) / 2,\n\t\ty123 = (y12 + y23) / 2,\n\t\tx234 = (x23 + x34) / 2,\n\t\ty234 = (y23 + y34) / 2,\n\t\tx1234 = (x123 + x234) / 2,\n\t\ty1234 = (y123 + y234) / 2,\n\t\tdx = x4 - x1,\n\t\tdy = y4 - y1,\n\t\td2 = _abs((x2 - x4) * dy - (y2 - y4) * dx),\n\t\td3 = _abs((x3 - x4) * dy - (y3 - y4) * dx),\n\t\tlength;\n\tif (!points) {\n\t\tpoints = [x1, y1, x4, y4];\n\t\tindex = 2;\n\t}\n\tpoints.splice(index || points.length - 2, 0, x1234, y1234);\n\tif ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) {\n\t\tlength = points.length;\n\t\tbezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index);\n\t\tbezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 2 + (points.length - length));\n\t}\n\treturn points;\n}\n\n/*\nfunction getAngleBetweenPoints(x0, y0, x1, y1, x2, y2) { //angle between 3 points in radians\n\tvar dx1 = x1 - x0,\n\t\tdy1 = y1 - y0,\n\t\tdx2 = x2 - x1,\n\t\tdy2 = y2 - y1,\n\t\tdx3 = x2 - x0,\n\t\tdy3 = y2 - y0,\n\t\ta = dx1 * dx1 + dy1 * dy1,\n\t\tb = dx2 * dx2 + dy2 * dy2,\n\t\tc = dx3 * dx3 + dy3 * dy3;\n\treturn Math.acos( (a + b - c) / _sqrt(4 * a * b) );\n},\n*/\n\n//pointsToSegment() doesn't handle flat coordinates (where y is always 0) the way we need (the resulting control points are always right on top of the anchors), so this function basically makes the control points go directly up and down, varying in length based on the curviness (more curvy, further control points)\nexport function flatPointsToSegment(points, curviness=1) {\n\tlet x = points[0],\n\t\ty = 0,\n\t\tsegment = [x, y],\n\t\ti = 2;\n\tfor (; i < points.length; i+=2) {\n\t\tsegment.push(\n\t\t\tx,\n\t\t\ty,\n\t\t\tpoints[i],\n\t\t\t(y = (points[i] - x) * curviness / 2),\n\t\t\t(x = points[i]),\n\t\t\t-y\n\t\t);\n\t}\n\treturn segment;\n}\n\n//points is an array of x/y points, like [x, y, x, y, x, y]\nexport function pointsToSegment(points, curviness) {\n\t//points = simplifyPoints(points, tolerance);\n\t_abs(points[0] - points[2]) < 1e-4 && _abs(points[1] - points[3]) < 1e-4 && (points = points.slice(2)); // if the first two points are super close, dump the first one.\n\tlet l = points.length-2,\n\t\tx = +points[0],\n\t\ty = +points[1],\n\t\tnextX = +points[2],\n\t\tnextY = +points[3],\n\t\tsegment = [x, y, x, y],\n\t\tdx2 = nextX - x,\n\t\tdy2 = nextY - y,\n\t\tclosed = Math.abs(points[l] - x) < 0.001 && Math.abs(points[l+1] - y) < 0.001,\n\t\tprevX, prevY, i, dx1, dy1, r1, r2, r3, tl, mx1, mx2, mxm, my1, my2, mym;\n\tif (closed) { // if the start and end points are basically on top of each other, close the segment by adding the 2nd point to the end, and the 2nd-to-last point to the beginning (we'll remove them at the end, but this allows the curvature to look perfect)\n\t\tpoints.push(nextX, nextY);\n\t\tnextX = x;\n\t\tnextY = y;\n\t\tx = points[l-2];\n\t\ty = points[l-1];\n\t\tpoints.unshift(x, y);\n\t\tl+=4;\n\t}\n\tcurviness = (curviness || curviness === 0) ? +curviness : 1;\n\tfor (i = 2; i < l; i+=2) {\n\t\tprevX = x;\n\t\tprevY = y;\n\t\tx = nextX;\n\t\ty = nextY;\n\t\tnextX = +points[i+2];\n\t\tnextY = +points[i+3];\n\t\tif (x === nextX && y === nextY) {\n\t\t\tcontinue;\n\t\t}\n\t\tdx1 = dx2;\n\t\tdy1 = dy2;\n\t\tdx2 = nextX - x;\n\t\tdy2 = nextY - y;\n\t\tr1 = _sqrt(dx1 * dx1 + dy1 * dy1); // r1, r2, and r3 correlate x and y (and z in the future). Basically 2D or 3D hypotenuse\n\t\tr2 = _sqrt(dx2 * dx2 + dy2 * dy2);\n\t\tr3 = _sqrt((dx2 / r2 + dx1 / r1) ** 2 + (dy2 / r2 + dy1 / r1) ** 2);\n\t\ttl = ((r1 + r2) * curviness * 0.25) / r3;\n\t\tmx1 = x - (x - prevX) * (r1 ? tl / r1 : 0);\n\t\tmx2 = x + (nextX - x) * (r2 ? tl / r2 : 0);\n\t\tmxm = x - (mx1 + (((mx2 - mx1) * ((r1 * 3 / (r1 + r2)) + 0.5) / 4) || 0));\n\t\tmy1 = y - (y - prevY) * (r1 ? tl / r1 : 0);\n\t\tmy2 = y + (nextY - y) * (r2 ? tl / r2 : 0);\n\t\tmym = y - (my1 + (((my2 - my1) * ((r1 * 3 / (r1 + r2)) + 0.5) / 4) || 0));\n\t\tif (x !== prevX || y !== prevY) {\n\t\t\tsegment.push(\n\t\t\t\t_round(mx1 + mxm), // first control point\n\t\t\t\t_round(my1 + mym),\n\t\t\t\t_round(x), // anchor\n\t\t\t\t_round(y),\n\t\t\t\t_round(mx2 + mxm), // second control point\n\t\t\t\t_round(my2 + mym)\n\t\t\t);\n\t\t}\n\t}\n\tx !== nextX || y !== nextY || segment.length < 4 ? segment.push(_round(nextX), _round(nextY), _round(nextX), _round(nextY)) : (segment.length -= 2);\n\tif (segment.length === 2) { // only one point!\n\t\tsegment.push(x, y, x, y, x, y);\n\t} else if (closed) {\n\t\tsegment.splice(0, 6);\n\t\tsegment.length = segment.length - 6;\n\t}\n\treturn segment;\n}\n\n//returns the squared distance between an x/y coordinate and a segment between x1/y1 and x2/y2\nfunction pointToSegDist(x, y, x1, y1, x2, y2) {\n\tlet dx = x2 - x1,\n\t\tdy = y2 - y1,\n\t\tt;\n\tif (dx || dy) {\n\t\tt = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n\t\tif (t > 1) {\n\t\t\tx1 = x2;\n\t\t\ty1 = y2;\n\t\t} else if (t > 0) {\n\t\t\tx1 += dx * t;\n\t\t\ty1 += dy * t;\n\t\t}\n\t}\n\treturn (x - x1) ** 2 + (y - y1) ** 2;\n}\n\nfunction simplifyStep(points, first, last, tolerance, simplified) {\n\tlet maxSqDist = tolerance,\n\t\tfirstX = points[first],\n\t\tfirstY = points[first+1],\n\t\tlastX = points[last],\n\t\tlastY = points[last+1],\n\t\tindex, i, d;\n\tfor (i = first + 2; i < last; i += 2) {\n\t\td = pointToSegDist(points[i], points[i+1], firstX, firstY, lastX, lastY);\n\t\tif (d > maxSqDist) {\n\t\t\tindex = i;\n\t\t\tmaxSqDist = d;\n\t\t}\n\t}\n\tif (maxSqDist > tolerance) {\n\t\tindex - first > 2 && simplifyStep(points, first, index, tolerance, simplified);\n\t\tsimplified.push(points[index], points[index+1]);\n\t\tlast - index > 2 && simplifyStep(points, index, last, tolerance, simplified);\n\t}\n}\n\n//points is an array of x/y values like [x, y, x, y, x, y]\nexport function simplifyPoints(points, tolerance) {\n\tlet prevX = parseFloat(points[0]),\n\t\tprevY = parseFloat(points[1]),\n\t\ttemp = [prevX, prevY],\n\t\tl = points.length - 2,\n\t\ti, x, y, dx, dy, result, last;\n\ttolerance = (tolerance || 1) ** 2;\n\tfor (i = 2; i < l; i += 2) {\n\t\tx = parseFloat(points[i]);\n\t\ty = parseFloat(points[i+1]);\n\t\tdx = prevX - x;\n\t\tdy = prevY - y;\n\t\tif (dx * dx + dy * dy > tolerance) {\n\t\t\ttemp.push(x, y);\n\t\t\tprevX = x;\n\t\t\tprevY = y;\n\t\t}\n\t}\n\ttemp.push(parseFloat(points[l]), parseFloat(points[l+1]));\n\tlast = temp.length - 2;\n\tresult = [temp[0], temp[1]];\n\tsimplifyStep(temp, 0, last, tolerance, result);\n\tresult.push(temp[last], temp[last+1]);\n\treturn result;\n}\n\nfunction getClosestProgressOnBezier(iterations, px, py, start, end, slices, x0, y0, x1, y1, x2, y2, x3, y3) {\n\tlet inc = (end - start) / slices,\n\t\tbest = 0,\n\t\tt = start,\n\t\tx, y, d, dx, dy, inv;\n\t_bestDistance = _largeNum;\n\twhile (t <= end) {\n\t\tinv = 1 - t;\n\t\tx = inv * inv * inv * x0 + 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t * x3;\n\t\ty = inv * inv * inv * y0 + 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t * y3;\n\t\tdx = x - px;\n\t\tdy = y - py;\n\t\td = dx * dx + dy * dy;\n\t\tif (d < _bestDistance) {\n\t\t\t_bestDistance = d;\n\t\t\tbest = t;\n\t\t}\n\t\tt += inc;\n\t}\n\treturn (iterations > 1) ? getClosestProgressOnBezier(iterations - 1, px, py, Math.max(best - inc, 0), Math.min(best + inc, 1), slices, x0, y0, x1, y1, x2, y2, x3, y3) : best;\n}\n\nexport function getClosestData(rawPath, x, y, slices) { //returns an object with the closest j, i, and t (j is the segment index, i is the index of the point in that segment, and t is the time/progress along that bezier)\n\tlet closest = {j:0, i:0, t:0},\n\t\tbestDistance = _largeNum,\n\t\ti, j, t, segment;\n\tfor (j = 0; j < rawPath.length; j++) {\n\t\tsegment = rawPath[j];\n\t\tfor (i = 0; i < segment.length; i+=6) {\n\t\t\tt = getClosestProgressOnBezier(1, x, y, 0, 1, slices || 20, segment[i], segment[i+1], segment[i+2], segment[i+3], segment[i+4], segment[i+5], segment[i+6], segment[i+7]);\n\t\t\tif (bestDistance > _bestDistance) {\n\t\t\t\tbestDistance = _bestDistance;\n\t\t\t\tclosest.j = j;\n\t\t\t\tclosest.i = i;\n\t\t\t\tclosest.t = t;\n\t\t\t}\n\t\t}\n\t}\n\treturn closest;\n}\n\n//subdivide a Segment closest to a specific x,y coordinate\nexport function subdivideSegmentNear(x, y, segment, slices, iterations) {\n\tlet l = segment.length,\n\t\tbestDistance = _largeNum,\n\t\tbestT = 0,\n\t\tbestSegmentIndex = 0,\n\t\tt, i;\n\tslices = slices || 20;\n\titerations = iterations || 3;\n\tfor (i = 0; i < l; i += 6) {\n\t\tt = getClosestProgressOnBezier(1, x, y, 0, 1, slices, segment[i], segment[i+1], segment[i+2], segment[i+3], segment[i+4], segment[i+5], segment[i+6], segment[i+7]);\n\t\tif (bestDistance > _bestDistance) {\n\t\t\tbestDistance = _bestDistance;\n\t\t\tbestT = t;\n\t\t\tbestSegmentIndex = i;\n\t\t}\n\t}\n\tt = getClosestProgressOnBezier(iterations, x, y, bestT - 0.05, bestT + 0.05, slices, segment[bestSegmentIndex], segment[bestSegmentIndex+1], segment[bestSegmentIndex+2], segment[bestSegmentIndex+3], segment[bestSegmentIndex+4], segment[bestSegmentIndex+5], segment[bestSegmentIndex+6], segment[bestSegmentIndex+7]);\n\tsubdivideSegment(segment, bestSegmentIndex, t);\n\treturn bestSegmentIndex + 6;\n}\n\n/*\nTakes any of the following and converts it to an all Cubic Bezier SVG data string:\n- A data string like \"M0,0 L2,4 v20,15 H100\"\n- A RawPath, like [[x, y, x, y, x, y, x, y][[x, y, x, y, x, y, x, y]]\n- A Segment, like [x, y, x, y, x, y, x, y]\n\nNote: all numbers are rounded down to the closest 0.001 to minimize memory, maximize speed, and avoid odd numbers like 1e-13\n*/\nexport function rawPathToString(rawPath) {\n\tif (_isNumber(rawPath[0])) { //in case a segment is passed in instead\n\t\trawPath = [rawPath];\n\t}\n\tlet result = \"\",\n\t\tl = rawPath.length,\n\t\tsl, s, i, segment;\n\tfor (s = 0; s < l; s++) {\n\t\tsegment = rawPath[s];\n\t\tresult += \"M\" + _round(segment[0]) + \",\" + _round(segment[1]) + \" C\";\n\t\tsl = segment.length;\n\t\tfor (i = 2; i < sl; i++) {\n\t\t\tresult += _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i]) + \" \";\n\t\t}\n\t\tif (segment.closed) {\n\t\t\tresult += \"z\";\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\n// takes a segment with coordinates [x, y, x, y, ...] and converts the control points into angles and lengths [x, y, angle, length, angle, length, x, y, angle, length, ...] so that it animates more cleanly and avoids odd breaks/kinks. For example, if you animate from 1 o'clock to 6 o'clock, it'd just go directly/linearly rather than around. So the length would be very short in the middle of the tween.\nexport function cpCoordsToAngles(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tx, y, i;\n\tfor (i = 0; i < segment.length; i+=6) {\n\t\tx = segment[i+2] - segment[i];\n\t\ty = segment[i+3] - segment[i+1];\n\t\tresult[i+2] = Math.atan2(y, x);\n\t\tresult[i+3] = Math.sqrt(x * x + y * y);\n\t\tx = segment[i+6] - segment[i+4];\n\t\ty = segment[i+7] - segment[i+5];\n\t\tresult[i+4] = Math.atan2(y, x);\n\t\tresult[i+5] = Math.sqrt(x * x + y * y);\n\t}\n\treturn result;\n}\n\n// takes a segment that was converted with cpCoordsToAngles() to have angles and lengths instead of coordinates for the control points, and converts it BACK into coordinates.\nexport function cpAnglesToCoords(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tlength = segment.length,\n\t\trnd = 1000,\n\t\tangle, l, i, j;\n\tfor (i = 0; i < length; i+=6) {\n\t\tangle = segment[i+2];\n\t\tl = segment[i+3]; //length\n\t\tresult[i+2] = (((segment[i] + Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+3] = (((segment[i+1] + Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t\tangle = segment[i+4];\n\t\tl = segment[i+5]; //length\n\t\tresult[i+4] = (((segment[i+6] - Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+5] = (((segment[i+7] - Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t}\n\treturn result;\n}\n\n//adds an \"isSmooth\" array to each segment and populates it with a boolean value indicating whether or not it's smooth (the control points have basically the same slope). For any smooth control points, it converts the coordinates into angle (x, in radians) and length (y) and puts them into the same index value in a smoothData array.\nexport function populateSmoothData(rawPath) {\n\tlet j = rawPath.length,\n\t\tsmooth, segment, x, y, x2, y2, i, l, a, a2, isSmooth, smoothData;\n\twhile (--j > -1) {\n\t\tsegment = rawPath[j];\n\t\tisSmooth = segment.isSmooth = segment.isSmooth || [0, 0, 0, 0];\n\t\tsmoothData = segment.smoothData = segment.smoothData || [0, 0, 0, 0];\n\t\tisSmooth.length = 4;\n\t\tl = segment.length - 2;\n\t\tfor (i = 6; i < l; i += 6) {\n\t\t\tx = segment[i] - segment[i - 2];\n\t\t\ty = segment[i + 1] - segment[i - 1];\n\t\t\tx2 = segment[i + 2] - segment[i];\n\t\t\ty2 = segment[i + 3] - segment[i + 1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tsmooth = (Math.abs(a - a2) < 0.09);\n\t\t\tif (smooth) {\n\t\t\t\tsmoothData[i - 2] = a;\n\t\t\t\tsmoothData[i + 2] = a2;\n\t\t\t\tsmoothData[i - 1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[i + 3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t}\n\t\t\tisSmooth.push(smooth, smooth, 0, 0, smooth, smooth);\n\t\t}\n\t\t//if the first and last points are identical, check to see if there's a smooth transition. We must handle this a bit differently due to their positions in the array.\n\t\tif (segment[l] === segment[0] && segment[l+1] === segment[1]) {\n\t\t\tx = segment[0] - segment[l-2];\n\t\t\ty = segment[1] - segment[l-1];\n\t\t\tx2 = segment[2] - segment[0];\n\t\t\ty2 = segment[3] - segment[1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tif (Math.abs(a - a2) < 0.09) {\n\t\t\t\tsmoothData[l-2] = a;\n\t\t\t\tsmoothData[2] = a2;\n\t\t\t\tsmoothData[l-1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t\tisSmooth[l-2] = isSmooth[l-1] = true; //don't change indexes 2 and 3 because we'll trigger everything from the END, and this will optimize file size a bit.\n\t\t\t}\n\t\t}\n\t}\n\treturn rawPath;\n}\nexport function pointToScreen(svgElement, point) {\n\tif (arguments.length < 2) { //by default, take the first set of coordinates in the path as the point\n\t\tlet rawPath = getRawPath(svgElement);\n\t\tpoint = svgElement.ownerSVGElement.createSVGPoint();\n\t\tpoint.x = rawPath[0][0];\n\t\tpoint.y = rawPath[0][1];\n\t}\n\treturn point.matrixTransform(svgElement.getScreenCTM());\n}\n\n*/","/*!\n * CustomEase 3.12.1\n * https://greensock.com\n *\n * @license Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nimport { stringToRawPath, rawPathToString, transformRawPath } from \"./utils/paths.js\";\n\nlet gsap, _coreInitted,\n\t_getGSAP = () => gsap || (typeof(window) !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap),\n\t_initCore = () => {\n\t\tgsap = _getGSAP();\n\t\tif (gsap) {\n\t\t\tgsap.registerEase(\"_CE\", CustomEase.create);\n\t\t\t_coreInitted = 1;\n\t\t} else {\n\t\t\tconsole.warn(\"Please gsap.registerPlugin(CustomEase)\");\n\t\t}\n\t},\n\t_bigNum = 1e20,\n\t_round = value => ~~(value * 1000 + (value < 0 ? -.5 : .5)) / 1000,\n\t_bonusValidated = 1, //CustomEase\n\t_numExp = /[-+=\\.]*\\d+[\\.e\\-\\+]*\\d*[e\\-\\+]*\\d*/gi, //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n\t_needsParsingExp = /[cLlsSaAhHvVtTqQ]/g,\n\t_findMinimum = values => {\n\t\tlet l = values.length,\n\t\t\tmin = _bigNum,\n\t\t\ti;\n\t\tfor (i = 1; i < l; i += 6) {\n\t\t\t+values[i] < min && (min = +values[i]);\n\t\t}\n\t\treturn min;\n\t},\n\t//takes all the points and translates/scales them so that the x starts at 0 and ends at 1.\n\t_normalize = (values, height, originY) => {\n\t\tif (!originY && originY !== 0) {\n\t\t\toriginY = Math.max(+values[values.length-1], +values[1]);\n\t\t}\n\t\tlet tx = +values[0] * -1,\n\t\t\tty = -originY,\n\t\t\tl = values.length,\n\t\t\tsx = 1 / (+values[l - 2] + tx),\n\t\t\tsy = -height || ((Math.abs(+values[l - 1] - +values[1]) < 0.01 * (+values[l - 2] - +values[0])) ? _findMinimum(values) + ty : +values[l - 1] + ty),\n\t\t\ti;\n\t\tif (sy) { //typically y ends at 1 (so that the end values are reached)\n\t\t\tsy = 1 / sy;\n\t\t} else { //in case the ease returns to its beginning value, scale everything proportionally\n\t\t\tsy = -sx;\n\t\t}\n\t\tfor (i = 0; i < l; i += 2) {\n\t\t\tvalues[i] = (+values[i] + tx) * sx;\n\t\t\tvalues[i + 1] = (+values[i + 1] + ty) * sy;\n\t\t}\n\t},\n\t//note that this function returns point objects like {x, y} rather than working with segments which are arrays with alternating x, y values as in the similar function in paths.js\n\t_bezierToPoints = function (x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) {\n\t\tlet x12 = (x1 + x2) / 2,\n\t\t\ty12 = (y1 + y2) / 2,\n\t\t\tx23 = (x2 + x3) / 2,\n\t\t\ty23 = (y2 + y3) / 2,\n\t\t\tx34 = (x3 + x4) / 2,\n\t\t\ty34 = (y3 + y4) / 2,\n\t\t\tx123 = (x12 + x23) / 2,\n\t\t\ty123 = (y12 + y23) / 2,\n\t\t\tx234 = (x23 + x34) / 2,\n\t\t\ty234 = (y23 + y34) / 2,\n\t\t\tx1234 = (x123 + x234) / 2,\n\t\t\ty1234 = (y123 + y234) / 2,\n\t\t\tdx = x4 - x1,\n\t\t\tdy = y4 - y1,\n\t\t\td2 = Math.abs((x2 - x4) * dy - (y2 - y4) * dx),\n\t\t\td3 = Math.abs((x3 - x4) * dy - (y3 - y4) * dx),\n\t\t\tlength;\n\t\tif (!points) {\n\t\t\tpoints = [{x: x1, y: y1}, {x: x4, y: y4}];\n\t\t\tindex = 1;\n\t\t}\n\t\tpoints.splice(index || points.length - 1, 0, {x: x1234, y: y1234});\n\t\tif ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) {\n\t\t\tlength = points.length;\n\t\t\t_bezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index);\n\t\t\t_bezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 1 + (points.length - length));\n\t\t}\n\t\treturn points;\n\t};\n\nexport class CustomEase {\n\n\tconstructor(id, data, config) {\n\t\t_coreInitted || _initCore();\n\t\tthis.id = id;\n\t\t_bonusValidated && this.setData(data, config);\n\t}\n\n\tsetData(data, config) {\n\t\tconfig = config || {};\n\t\tdata = data || \"0,0,1,1\";\n\t\tlet values = data.match(_numExp),\n\t\t\tclosest = 1,\n\t\t\tpoints = [],\n\t\t\tlookup = [],\n\t\t\tprecision = config.precision || 1,\n\t\t\tfast = (precision <= 1),\n\t\t\tl, a1, a2, i, inc, j, point, prevPoint, p;\n\t\tthis.data = data;\n\t\tif (_needsParsingExp.test(data) || (~data.indexOf(\"M\") && data.indexOf(\"C\") < 0)) {\n\t\t\tvalues = stringToRawPath(data)[0];\n\t\t}\n\t\tl = values.length;\n\t\tif (l === 4) {\n\t\t\tvalues.unshift(0, 0);\n\t\t\tvalues.push(1, 1);\n\t\t\tl = 8;\n\t\t} else if ((l - 2) % 6) {\n\t\t\tthrow \"Invalid CustomEase\";\n\t\t}\n\t\tif (+values[0] !== 0 || +values[l - 2] !== 1) {\n\t\t\t_normalize(values, config.height, config.originY);\n\t\t}\n\t\tthis.segment = values;\n\t\tfor (i = 2; i < l; i += 6) {\n\t\t\ta1 = {x: +values[i - 2], y: +values[i - 1]};\n\t\t\ta2 = {x: +values[i + 4], y: +values[i + 5]};\n\t\t\tpoints.push(a1, a2);\n\t\t\t_bezierToPoints(a1.x, a1.y, +values[i], +values[i + 1], +values[i + 2], +values[i + 3], a2.x, a2.y, 1 / (precision * 200000), points, points.length - 1);\n\t\t}\n\t\tl = points.length;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tpoint = points[i];\n\t\t\tprevPoint = points[i - 1] || point;\n\t\t\tif ((point.x > prevPoint.x || (prevPoint.y !== point.y && prevPoint.x === point.x) || point === prevPoint) && point.x <= 1) { //if a point goes BACKWARD in time or is a duplicate, just drop it. Also it shouldn't go past 1 on the x axis, as could happen in a string like \"M0,0 C0,0 0.12,0.68 0.18,0.788 0.195,0.845 0.308,1 0.32,1 0.403,1.005 0.398,1 0.5,1 0.602,1 0.816,1.005 0.9,1 0.91,1 0.948,0.69 0.962,0.615 1.003,0.376 1,0 1,0\".\n\t\t\t\tprevPoint.cx = point.x - prevPoint.x; //change in x between this point and the next point (performance optimization)\n\t\t\t\tprevPoint.cy = point.y - prevPoint.y;\n\t\t\t\tprevPoint.n = point;\n\t\t\t\tprevPoint.nx = point.x; //next point's x value (performance optimization, making lookups faster in getRatio()). Remember, the lookup will always land on a spot where it's either this point or the very next one (never beyond that)\n\t\t\t\tif (fast && i > 1 && Math.abs(prevPoint.cy / prevPoint.cx - points[i - 2].cy / points[i - 2].cx) > 2) { //if there's a sudden change in direction, prioritize accuracy over speed. Like a bounce ease - you don't want to risk the sampling chunks landing on each side of the bounce anchor and having it clipped off.\n\t\t\t\t\tfast = 0;\n\t\t\t\t}\n\t\t\t\tif (prevPoint.cx < closest) {\n\t\t\t\t\tif (!prevPoint.cx) {\n\t\t\t\t\t\tprevPoint.cx = 0.001; //avoids math problems in getRatio() (dividing by zero)\n\t\t\t\t\t\tif (i === l - 1) { //in case the final segment goes vertical RIGHT at the end, make sure we end at the end.\n\t\t\t\t\t\t\tprevPoint.x -= 0.001;\n\t\t\t\t\t\t\tclosest = Math.min(closest, 0.001);\n\t\t\t\t\t\t\tfast = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclosest = prevPoint.cx;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpoints.splice(i--, 1);\n\t\t\t\tl--;\n\t\t\t}\n\t\t}\n\t\tl = (1 / closest + 1) | 0;\n\t\tinc = 1 / l;\n\t\tj = 0;\n\t\tpoint = points[0];\n\t\tif (fast) {\n\t\t\tfor (i = 0; i < l; i++) { //for fastest lookups, we just sample along the path at equal x (time) distance. Uses more memory and is slightly less accurate for anchors that don't land on the sampling points, but for the vast majority of eases it's excellent (and fast).\n\t\t\t\tp = i * inc;\n\t\t\t\tif (point.nx < p) {\n\t\t\t\t\tpoint = points[++j];\n\t\t\t\t}\n\t\t\t\ta1 = point.y + ((p - point.x) / point.cx) * point.cy;\n\t\t\t\tlookup[i] = {x: p, cx: inc, y: a1, cy: 0, nx: 9};\n\t\t\t\tif (i) {\n\t\t\t\t\tlookup[i - 1].cy = a1 - lookup[i - 1].y;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlookup[l - 1].cy = points[points.length - 1].y - a1;\n\t\t} else { //this option is more accurate, ensuring that EVERY anchor is hit perfectly. Clipping across a bounce, for example, would never happen.\n\t\t\tfor (i = 0; i < l; i++) { //build a lookup table based on the smallest distance so that we can instantly find the appropriate point (well, it'll either be that point or the very next one). We'll look up based on the linear progress. So it's it's 0.5 and the lookup table has 100 elements, it'd be like lookup[Math.floor(0.5 * 100)]\n\t\t\t\tif (point.nx < i * inc) {\n\t\t\t\t\tpoint = points[++j];\n\t\t\t\t}\n\t\t\t\tlookup[i] = point;\n\t\t\t}\n\n\t\t\tif (j < points.length - 1) {\n\t\t\t\tlookup[i-1] = points[points.length-2];\n\t\t\t}\n\t\t}\n\t\t//this._calcEnd = (points[points.length-1].y !== 1 || points[0].y !== 0); //ensures that we don't run into floating point errors. As long as we're starting at 0 and ending at 1, tell GSAP to skip the final calculation and use 0/1 as the factor.\n\n\t\tthis.ease = p => {\n\t\t\tlet point = lookup[(p * l) | 0] || lookup[l - 1];\n\t\t\tif (point.nx < p) {\n\t\t\t\tpoint = point.n;\n\t\t\t}\n\t\t\treturn point.y + ((p - point.x) / point.cx) * point.cy;\n\t\t};\n\n\t\tthis.ease.custom = this;\n\n\t\tthis.id && gsap && gsap.registerEase(this.id, this.ease);\n\n\t\treturn this;\n\t}\n\n\tgetSVGData(config) {\n\t\treturn CustomEase.getSVGData(this, config);\n\t}\n\n\tstatic create(id, data, config) {\n\t\treturn (new CustomEase(id, data, config)).ease;\n\t}\n\n\tstatic register(core) {\n\t\tgsap = core;\n\t\t_initCore();\n\t}\n\n\tstatic get(id) {\n\t\treturn gsap.parseEase(id);\n\t}\n\n\tstatic getSVGData(ease, config) {\n\t\tconfig = config || {};\n\t\tlet width = config.width || 100,\n\t\t\theight = config.height || 100,\n\t\t\tx = config.x || 0,\n\t\t\ty = (config.y || 0) + height,\n\t\t\te = gsap.utils.toArray(config.path)[0],\n\t\t\ta, slope, i, inc, tx, ty, precision, threshold, prevX, prevY;\n\t\tif (config.invert) {\n\t\t\theight = -height;\n\t\t\ty = 0;\n\t\t}\n\t\tif (typeof(ease) === \"string\") {\n\t\t\tease = gsap.parseEase(ease);\n\t\t}\n\t\tif (ease.custom) {\n\t\t\tease = ease.custom;\n\t\t}\n\t\tif (ease instanceof CustomEase) {\n\t\t\ta = rawPathToString(transformRawPath([ease.segment], width, 0, 0, -height, x, y));\n\t\t} else {\n\t\t\ta = [x, y];\n\t\t\tprecision = Math.max(5, (config.precision || 1) * 200);\n\t\t\tinc = 1 / precision;\n\t\t\tprecision += 2;\n\t\t\tthreshold = 5 / precision;\n\t\t\tprevX = _round(x + inc * width);\n\t\t\tprevY = _round(y + ease(inc) * -height);\n\t\t\tslope = (prevY - y) / (prevX - x);\n\t\t\tfor (i = 2; i < precision; i++) {\n\t\t\t\ttx = _round(x + i * inc * width);\n\t\t\t\tty = _round(y + ease(i * inc) * -height);\n\t\t\t\tif (Math.abs((ty - prevY) / (tx - prevX) - slope) > threshold || i === precision - 1) { //only add points when the slope changes beyond the threshold\n\t\t\t\t\ta.push(prevX, prevY);\n\t\t\t\t\tslope = (ty - prevY) / (tx - prevX);\n\t\t\t\t}\n\t\t\t\tprevX = tx;\n\t\t\t\tprevY = ty;\n\t\t\t}\n\t\t\ta = \"M\" + a.join(\",\");\n\t\t}\n\t\te && e.setAttribute(\"d\", a);\n\t\treturn a;\n\t}\n\n}\n\n_getGSAP() && gsap.registerPlugin(CustomEase);\n\nCustomEase.version = \"3.12.1\";\n\nexport { CustomEase as default };"],"names":["_round","value","Math","round","_svgPathExp","_scientific","_DEG2RAD","PI","_sin","sin","_cos","cos","_abs","abs","_sqrt","sqrt","arcToSegment","lastX","lastY","rx","ry","angle","largeArcFlag","sweepFlag","x","y","angleRad","cosAngle","sinAngle","TWOPI","dx2","dy2","x1","y1","x1_sq","y1_sq","radiiCheck","rx_sq","ry_sq","sq","coef","cx1","cy1","cx","cy","ux","uy","vx","vy","temp","angleStart","acos","angleExtent","isNaN","i","segments","ceil","rawPath","angleIncrement","controlLength","ma","mb","mc","md","push","length","stringToRawPath","d","line","sx","sy","ex","ey","difX","difY","segment","j","command","isRelative","startX","startY","beziers","prevCommand","flag1","flag2","a","replace","m","n","match","path","relativeX","relativeY","elements","points","errorMessage","console","log","toUpperCase","closed","substr","charAt","pop","totalPoints","_getGSAP","gsap","window","registerPlugin","_initCore","registerEase","CustomEase","create","_coreInitted","warn","_bezierToPoints","x2","y2","x3","y3","x4","y4","threshold","index","x12","y12","x23","y23","x34","y34","x123","y123","x234","y234","x1234","y1234","dx","dy","d2","d3","splice","_bonusValidated","_needsParsingExp","setData","data","config","l","a1","a2","inc","point","prevPoint","p","values","_numExp","closest","lookup","precision","fast","test","indexOf","unshift","_normalize","height","originY","max","tx","ty","_findMinimum","min","nx","ease","custom","this","id","getSVGData","register","core","get","parseEase","slope","prevX","prevY","width","e","utils","toArray","invert","rawPathToString","_isNumber","sl","s","result","transformRawPath","b","c","_dirty","join","setAttribute","version"],"mappings":"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"} \ No newline at end of file diff --git a/attachments/russia/js/gsap/Draggable.min.js b/attachments/russia/js/gsap/Draggable.min.js new file mode 100644 index 0000000..b8e4a25 --- /dev/null +++ b/attachments/russia/js/gsap/Draggable.min.js @@ -0,0 +1,11 @@ +/*! + * Draggable 3.12.1 + * https://greensock.com + * + * @license Copyright 2023, GreenSock. All rights reserved. + * Subject to the terms at https://greensock.com/standard-license or for Club GreenSock members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).window=e.window||{})}(this,function(e){"use strict";function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function w(e,t){if(e.parentNode&&(h||T(e))){var n=L(e),o=n?n.getAttribute("xmlns")||"http://www.w3.org/2000/svg":"http://www.w3.org/1999/xhtml",r=n?t?"rect":"g":"div",i=2!==t?0:100,a=3===t?100:0,l="position:absolute;display:block;pointer-events:none;margin:0;padding:0;",s=h.createElementNS?h.createElementNS(o.replace(/^https/,"http"),r):h.createElement(r);return t&&(n?(g=g||w(e),s.setAttribute("width",.01),s.setAttribute("height",.01),s.setAttribute("transform","translate("+i+","+a+")"),g.appendChild(s)):(f||((f=w(e)).style.cssText=l),s.style.cssText=l+"width:0.1px;height:0.1px;top:"+a+"px;left:"+i+"px",f.appendChild(s))),s}throw"Need document and parent."}function A(e,t,n,o,r,i,a){return e.a=t,e.b=n,e.c=o,e.d=r,e.e=i,e.f=a,e}var h,u,r,i,f,g,x,m,y,t,v="transform",b=v+"Origin",T=function _setDoc(e){var t=e.ownerDocument||e;!(v in e.style)&&"msTransform"in e.style&&(b=(v="msTransform")+"Origin");for(;t.parentNode&&(t=t.parentNode););if(u=window,x=new ge,t){r=(h=t).documentElement,i=t.body,(m=h.createElementNS("http://www.w3.org/2000/svg","g")).style.transform="none";var n=t.createElement("div"),o=t.createElement("div");i.appendChild(n),n.appendChild(o),n.style.position="static",n.style[v]="translate3d(0,0,1px)",y=o.offsetParent!==n,i.removeChild(n)}return t},D=function _forceNonZeroScale(e){for(var t,n;e&&e!==i;)(n=e._gsap)&&n.uncache&&n.get(e,"x"),n&&!n.scaleX&&!n.scaleY&&n.renderTransform&&(n.scaleX=n.scaleY=1e-4,n.renderTransform(1,n),t?t.push(n):t=[n]),e=e.parentNode;return t},M=[],E=[],S=function _getDocScrollTop(){return u.pageYOffset||h.scrollTop||r.scrollTop||i.scrollTop||0},P=function _getDocScrollLeft(){return u.pageXOffset||h.scrollLeft||r.scrollLeft||i.scrollLeft||0},L=function _svgOwner(e){return e.ownerSVGElement||("svg"===(e.tagName+"").toLowerCase()?e:null)},C=function _isFixed(e){return"fixed"===u.getComputedStyle(e).position||((e=e.parentNode)&&1===e.nodeType?_isFixed(e):void 0)},N=function _placeSiblings(e,t){var n,o,r,i,a,l,s=L(e),c=e===s,d=s?M:E,p=e.parentNode;if(e===u)return e;if(d.length||d.push(w(e,1),w(e,2),w(e,3)),n=s?g:f,s)c?(i=-(r=function _getCTM(e){var t,n=e.getCTM();return n||(t=e.style[v],e.style[v]="none",e.appendChild(m),n=m.getCTM(),e.removeChild(m),t?e.style[v]=t:e.style.removeProperty(v.replace(/([A-Z])/g,"-$1").toLowerCase())),n||x.clone()}(e)).e/r.a,a=-r.f/r.d,o=x):e.getBBox?(r=e.getBBox(),i=(o=(o=e.transform?e.transform.baseVal:{}).numberOfItems?1o.scrollHeight,a.removeChild(o),O=n,Me=function(e){for(var t=e.split(","),n=(("onpointerdown"in s?"pointerdown,pointermove,pointerup,pointercancel":"onmspointerdown"in s?"MSPointerDown,MSPointerMove,MSPointerUp,MSPointerCancel":e).split(",")),o={},r=4;-1<--r;)o[t[r]]=n[r],o[n[r]]=t[r];try{ve.addEventListener("test",null,Object.defineProperty({},"passive",{get:function get(){d=1}}))}catch(e){}return o}("touchstart,touchmove,touchend,touchcancel"),za(ye,"touchcancel",aa),za(me,"touchmove",aa),l&&l.addEventListener("touchstart",aa),za(ye,"contextmenu",function(){for(var e in ze)ze[e].isPressed&&ze[e].endDrag()}),xe=be=Y()}var n,o,r,i,a;xe?(Se=xe.plugins.inertia,Le=xe.core.context||function(){},c=xe.utils.checkPrefix,R=c(R),Ne=c(Ne),Te=xe.utils.toArray,Ye=xe.core.getStyleSaver,k=!!c("perspective")):e&&console.warn("Please gsap.registerPlugin(Draggable)")}var xe,me,ye,ve,l,s,we,be,c,Te,d,De,Me,Ee,_e,Se,Xe,Pe,Le,Ye,k,O,n,Ce=0,R="transform",Ne="transformOrigin",ke=Array.isArray,Ae=180/Math.PI,Oe=1e20,a=new ge,Re=Date.now||function(){return(new Date).getTime()},Be=[],ze={},Fe=0,o=/^(?:a|input|textarea|button|select)$/i,Ie=0,He={},Qe={},We=function _isRoot(e){return!(e&&e!==ve&&9!==e.nodeType&&e!==ye.body&&e!==me&&e.nodeType&&e.parentNode)},p={},Ge={},B=function _getElementBounds(e,t){t=Te(t)[0];var n,o,r,i,a,l,s,c,d,p,u,h,f,g=e.getBBox&&e.ownerSVGElement,x=e.ownerDocument||ye;if(e===me)r=Fa(x),o=(n=Ga(x))+(x.documentElement.clientWidth||e.innerWidth||x.body.clientWidth||0),i=r+((e.innerHeight||0)-20d||l.rightp||l.bottom=l.width*l.height*n:o.width>n&&o.height>n))},Draggable);function Draggable(h,p){var e;e=Ke.call(this)||this,be||_a(1),h=Te(h)[0],e.styles=Ye&&Ye(h,"transform,left,top"),Se=Se||xe.plugins.inertia,e.vars=p=ra(p||{}),e.target=h,e.x=e.y=e.rotation=0,e.dragResistance=parseFloat(p.dragResistance)||0,e.edgeResistance=isNaN(p.edgeResistance)?1:parseFloat(p.edgeResistance)||0,e.lockAxis=p.lockAxis,e.autoScroll=p.autoScroll||0,e.lockedAxis=null,e.allowEventDefault=!!p.allowEventDefault,xe.getProperty(h,"x");function Qg(e,t){return parseFloat(se.get(h,e,t))}function xh(e){return Ba(e),e.stopImmediatePropagation&&e.stopImmediatePropagation(),!1}function yh(e){if(q.autoScroll&&q.isDragging&&(te||Y)){var t,n,o,r,i,a,l,s,c=h,d=15*q.autoScroll;for(te=!1,Qe.scrollTop=null!=me.pageYOffset?me.pageYOffset:null!=de.documentElement.scrollTop?de.documentElement.scrollTop:de.body.scrollTop,Qe.scrollLeft=null!=me.pageXOffset?me.pageXOffset:null!=de.documentElement.scrollLeft?de.documentElement.scrollLeft:de.body.scrollLeft,r=q.pointerX-Qe.scrollLeft,i=q.pointerY-Qe.scrollTop;c&&!n;)t=(n=We(c.parentNode))?Qe:c.parentNode,o=n?{bottom:Math.max(ve.clientHeight,me.innerHeight||0),right:Math.max(ve.clientWidth,me.innerWidth||0),left:0,top:0}:t.getBoundingClientRect(),a=l=0,U&&((s=t._gsMaxScrollY-t.scrollTop)<0?l=s:i>o.bottom-re&&s?(te=!0,l=Math.min(s,d*(1-Math.max(0,o.bottom-i)/re)|0)):io.right-oe&&s?(te=!0,a=Math.min(s,d*(1-Math.max(0,o.right-r)/oe)|0)):rj?(q.y=a,T+(D-a)*c):T):(A&&(s=e*A.a+t*A.c+A.e,t=e*A.b+t*A.d+A.f,e=s),(r=t-b)Math.abs(r)?"y":U?"x":null,s&&Z(q.vars.onLockAxis)&&q.vars.onLockAxis.call(q,q.pointerEvent)),"y"===s?r=0:"x"===s&&(o=0)),i=da(T+o*c),a=da(D+r*c)),(C||N||k)&&(q.x!==i||q.y!==a&&!W)&&(k&&(He.x=i,He.y=a,s=k(He),i=da(s.x),a=da(s.y)),C&&(i=da(C(i))),N&&(a=da(N(a)))),M&&(Ea._gsMaxScrollY&&(a.scrollTop=a._gsMaxScrollY),V&&a.scrollLeft>a._gsMaxScrollX&&(a.scrollLeft=a._gsMaxScrollX),i=a;q.isThrowing&&(r||q.endX>E||q.endXX||q.endY {\n\t\tlet doc = element.ownerDocument || element;\n\t\tif (!(_transformProp in element.style) && \"msTransform\" in element.style) { //to improve compatibility with old Microsoft browsers\n\t\t\t_transformProp = \"msTransform\";\n\t\t\t_transformOriginProp = _transformProp + \"Origin\";\n\t\t}\n\t\twhile (doc.parentNode && (doc = doc.parentNode)) {\t}\n\t\t_win = window;\n\t\t_identityMatrix = new Matrix2D();\n\t\tif (doc) {\n\t\t\t_doc = doc;\n\t\t\t_docElement = doc.documentElement;\n\t\t\t_body = doc.body;\n\t\t\t_gEl = _doc.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\t\t// prevent any existing CSS from transforming it\n\t\t\t_gEl.style.transform = \"none\";\n\t\t\t// now test for the offset reporting bug. Use feature detection instead of browser sniffing to make things more bulletproof and future-proof. Hopefully Safari will fix their bug soon but it's 2020 and it's still not fixed.\n\t\t\tlet d1 = doc.createElement(\"div\"),\n\t\t\t\td2 = doc.createElement(\"div\");\n\t\t\t_body.appendChild(d1);\n\t\t\td1.appendChild(d2);\n\t\t\td1.style.position = \"static\";\n\t\t\td1.style[_transformProp] = \"translate3d(0,0,1px)\";\n\t\t\t_hasOffsetBug = (d2.offsetParent !== d1);\n\t\t\t_body.removeChild(d1);\n\t\t}\n\t\treturn doc;\n\t},\n\t_forceNonZeroScale = e => { // walks up the element's ancestors and finds any that had their scale set to 0 via GSAP, and changes them to 0.0001 to ensure that measurements work. Firefox has a bug that causes it to incorrectly report getBoundingClientRect() when scale is 0.\n\t\tlet a, cache;\n\t\twhile (e && e !== _body) {\n\t\t\tcache = e._gsap;\n\t\t\tcache && cache.uncache && cache.get(e, \"x\"); // force re-parsing of transforms if necessary\n\t\t\tif (cache && !cache.scaleX && !cache.scaleY && cache.renderTransform) {\n\t\t\t\tcache.scaleX = cache.scaleY = 1e-4;\n\t\t\t\tcache.renderTransform(1, cache);\n\t\t\t\ta ? a.push(cache) : (a = [cache]);\n\t\t\t}\n\t\t\te = e.parentNode;\n\t\t}\n\t\treturn a;\n\t},\n\t// possible future addition: pass an element to _forceDisplay() and it'll walk up all its ancestors and make sure anything with display: none is set to display: block, and if there's no parentNode, it'll add it to the body. It returns an Array that you can then feed to _revertDisplay() to have it revert all the changes it made.\n\t// _forceDisplay = e => {\n\t// \tlet a = [],\n\t// \t\tparent;\n\t// \twhile (e && e !== _body) {\n\t// \t\tparent = e.parentNode;\n\t// \t\t(_win.getComputedStyle(e).display === \"none\" || !parent) && a.push(e, e.style.display, parent) && (e.style.display = \"block\");\n\t// \t\tparent || _body.appendChild(e);\n\t// \t\te = parent;\n\t// \t}\n\t// \treturn a;\n\t// },\n\t// _revertDisplay = a => {\n\t// \tfor (let i = 0; i < a.length; i+=3) {\n\t// \t\ta[i+1] ? (a[i].style.display = a[i+1]) : a[i].style.removeProperty(\"display\");\n\t// \t\ta[i+2] || a[i].parentNode.removeChild(a[i]);\n\t// \t}\n\t// },\n\t_svgTemps = [], //we create 3 elements for SVG, and 3 for other DOM elements and cache them for performance reasons. They get nested in _divContainer and _svgContainer so that just one element is added to the DOM on each successive attempt. Again, performance is key.\n\t_divTemps = [],\n\t_getDocScrollTop = () => _win.pageYOffset || _doc.scrollTop || _docElement.scrollTop || _body.scrollTop || 0,\n\t_getDocScrollLeft = () => _win.pageXOffset || _doc.scrollLeft || _docElement.scrollLeft || _body.scrollLeft || 0,\n\t_svgOwner = element => element.ownerSVGElement || ((element.tagName + \"\").toLowerCase() === \"svg\" ? element : null),\n\t_isFixed = element => {\n\t\tif (_win.getComputedStyle(element).position === \"fixed\") {\n\t\t\treturn true;\n\t\t}\n\t\telement = element.parentNode;\n\t\tif (element && element.nodeType === 1) { // avoid document fragments which will throw an error.\n\t\t\treturn _isFixed(element);\n\t\t}\n\t},\n\t_createSibling = (element, i) => {\n\t\tif (element.parentNode && (_doc || _setDoc(element))) {\n\t\t\tlet svg = _svgOwner(element),\n\t\t\t\tns = svg ? (svg.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\") : \"http://www.w3.org/1999/xhtml\",\n\t\t\t\ttype = svg ? (i ? \"rect\" : \"g\") : \"div\",\n\t\t\t\tx = i !== 2 ? 0 : 100,\n\t\t\t\ty = i === 3 ? 100 : 0,\n\t\t\t\tcss = \"position:absolute;display:block;pointer-events:none;margin:0;padding:0;\",\n\t\t\t\te = _doc.createElementNS ? _doc.createElementNS(ns.replace(/^https/, \"http\"), type) : _doc.createElement(type);\n\t\t\tif (i) {\n\t\t\t\tif (!svg) {\n\t\t\t\t\tif (!_divContainer) {\n\t\t\t\t\t\t_divContainer = _createSibling(element);\n\t\t\t\t\t\t_divContainer.style.cssText = css;\n\t\t\t\t\t}\n\t\t\t\t\te.style.cssText = css + \"width:0.1px;height:0.1px;top:\" + y + \"px;left:\" + x + \"px\";\n\t\t\t\t\t_divContainer.appendChild(e);\n\n\t\t\t\t} else {\n\t\t\t\t\t_svgContainer || (_svgContainer = _createSibling(element));\n\t\t\t\t\te.setAttribute(\"width\", 0.01);\n\t\t\t\t\te.setAttribute(\"height\", 0.01);\n\t\t\t\t\te.setAttribute(\"transform\", \"translate(\" + x + \",\" + y + \")\");\n\t\t\t\t\t_svgContainer.appendChild(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn e;\n\t\t}\n\t\tthrow \"Need document and parent.\";\n\t},\n\t_consolidate = m => { // replaces SVGTransformList.consolidate() because a bug in Firefox causes it to break pointer events. See https://greensock.com/forums/topic/23248-touch-is-not-working-on-draggable-in-firefox-windows-v324/?tab=comments#comment-109800\n\t\tlet c = new Matrix2D(),\n\t\t\ti = 0;\n\t\tfor (; i < m.numberOfItems; i++) {\n\t\t\tc.multiply(m.getItem(i).matrix);\n\t\t}\n\t\treturn c;\n\t},\n\t_getCTM = svg => {\n\t\tlet m = svg.getCTM(),\n\t\t\ttransform;\n\t\tif (!m) { // Firefox returns null for getCTM() on root elements, so this is a workaround using a that we temporarily append.\n\t\t\ttransform = svg.style[_transformProp];\n\t\t\tsvg.style[_transformProp] = \"none\"; // a bug in Firefox causes css transforms to contaminate the getCTM()\n\t\t\tsvg.appendChild(_gEl);\n\t\t\tm = _gEl.getCTM();\n\t\t\tsvg.removeChild(_gEl);\n\t\t\ttransform ? (svg.style[_transformProp] = transform) : svg.style.removeProperty(_transformProp.replace(/([A-Z])/g, \"-$1\").toLowerCase());\n\t\t}\n\t\treturn m || _identityMatrix.clone(); // Firefox will still return null if the has a width/height of 0 in the browser.\n\t},\n\t_placeSiblings = (element, adjustGOffset) => {\n\t\tlet svg = _svgOwner(element),\n\t\t\tisRootSVG = element === svg,\n\t\t\tsiblings = svg ? _svgTemps : _divTemps,\n\t\t\tparent = element.parentNode,\n\t\t\tcontainer, m, b, x, y, cs;\n\t\tif (element === _win) {\n\t\t\treturn element;\n\t\t}\n\t\tsiblings.length || siblings.push(_createSibling(element, 1), _createSibling(element, 2), _createSibling(element, 3));\n\t\tcontainer = svg ? _svgContainer : _divContainer;\n\t\tif (svg) {\n\t\t\tif (isRootSVG) {\n\t\t\t\tb = _getCTM(element);\n\t\t\t\tx = -b.e / b.a;\n\t\t\t\ty = -b.f / b.d;\n\t\t\t\tm = _identityMatrix;\n\t\t\t} else if (element.getBBox) {\n\t\t\t\tb = element.getBBox();\n\t\t\t\tm = element.transform ? element.transform.baseVal : {}; // IE11 doesn't follow the spec.\n\t\t\t\tm = !m.numberOfItems ? _identityMatrix : m.numberOfItems > 1 ? _consolidate(m) : m.getItem(0).matrix; // don't call m.consolidate().matrix because a bug in Firefox makes pointer events not work when consolidate() is called on the same tick as getBoundingClientRect()! See https://greensock.com/forums/topic/23248-touch-is-not-working-on-draggable-in-firefox-windows-v324/?tab=comments#comment-109800\n\t\t\t\tx = m.a * b.x + m.c * b.y;\n\t\t\t\ty = m.b * b.x + m.d * b.y;\n\t\t\t} else { // may be a which has no getBBox() so just use defaults instead of throwing errors.\n\t\t\t\tm = new Matrix2D();\n\t\t\t\tx = y = 0;\n\t\t\t}\n\t\t\tif (adjustGOffset && element.tagName.toLowerCase() === \"g\") {\n\t\t\t\tx = y = 0;\n\t\t\t}\n\t\t\t(isRootSVG ? svg : parent).appendChild(container);\n\t\t\tcontainer.setAttribute(\"transform\", \"matrix(\" + m.a + \",\" + m.b + \",\" + m.c + \",\" + m.d + \",\" + (m.e + x) + \",\" + (m.f + y) + \")\");\n\t\t} else {\n\t\t\tx = y = 0;\n\t\t\tif (_hasOffsetBug) { // some browsers (like Safari) have a bug that causes them to misreport offset values. When an ancestor element has a transform applied, it's supposed to treat it as if it's position: relative (new context). Safari botches this, so we need to find the closest ancestor (between the element and its offsetParent) that has a transform applied and if one is found, grab its offsetTop/Left and subtract them to compensate.\n\t\t\t\tm = element.offsetParent;\n\t\t\t\tb = element;\n\t\t\t\twhile (b && (b = b.parentNode) && b !== m && b.parentNode) {\n\t\t\t\t\tif ((_win.getComputedStyle(b)[_transformProp] + \"\").length > 4) {\n\t\t\t\t\t\tx = b.offsetLeft;\n\t\t\t\t\t\ty = b.offsetTop;\n\t\t\t\t\t\tb = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcs = _win.getComputedStyle(element);\n\t\t\tif (cs.position !== \"absolute\" && cs.position !== \"fixed\") {\n\t\t\t\tm = element.offsetParent;\n\t\t\t\twhile (parent && parent !== m) { // if there's an ancestor element between the element and its offsetParent that's scrolled, we must factor that in.\n\t\t\t\t\tx += parent.scrollLeft || 0;\n\t\t\t\t\ty += parent.scrollTop || 0;\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\tb = container.style;\n\t\t\tb.top = (element.offsetTop - y) + \"px\";\n\t\t\tb.left = (element.offsetLeft - x) + \"px\";\n\t\t\tb[_transformProp] = cs[_transformProp];\n\t\t\tb[_transformOriginProp] = cs[_transformOriginProp];\n\t\t\t// b.border = m.border;\n\t\t\t// b.borderLeftStyle = m.borderLeftStyle;\n\t\t\t// b.borderTopStyle = m.borderTopStyle;\n\t\t\t// b.borderLeftWidth = m.borderLeftWidth;\n\t\t\t// b.borderTopWidth = m.borderTopWidth;\n\t\t\tb.position = cs.position === \"fixed\" ? \"fixed\" : \"absolute\";\n\t\t\telement.parentNode.appendChild(container);\n\t\t}\n\t\treturn container;\n\t},\n\t_setMatrix = (m, a, b, c, d, e, f) => {\n\t\tm.a = a;\n\t\tm.b = b;\n\t\tm.c = c;\n\t\tm.d = d;\n\t\tm.e = e;\n\t\tm.f = f;\n\t\treturn m;\n\t};\n\nexport class Matrix2D {\n\tconstructor(a=1, b=0, c=0, d=1, e=0, f=0) {\n\t\t_setMatrix(this, a, b, c, d, e, f);\n\t}\n\n\tinverse() {\n\t\tlet {a, b, c, d, e, f} = this,\n\t\t\tdeterminant = (a * d - b * c) || 1e-10;\n\t\treturn _setMatrix(\n\t\t\tthis,\n\t\t\td / determinant,\n\t\t\t-b / determinant,\n\t\t\t-c / determinant,\n\t\t\ta / determinant,\n\t\t\t(c * f - d * e) / determinant,\n\t\t\t-(a * f - b * e) / determinant\n\t\t);\n\t}\n\n\tmultiply(matrix) {\n\t\tlet {a, b, c, d, e, f} = this,\n\t\t\ta2 = matrix.a,\n\t\t\tb2 = matrix.c,\n\t\t\tc2 = matrix.b,\n\t\t\td2 = matrix.d,\n\t\t\te2 = matrix.e,\n\t\t\tf2 = matrix.f;\n\t\treturn _setMatrix(this,\n\t\t\ta2 * a + c2 * c,\n\t\t\ta2 * b + c2 * d,\n\t\t\tb2 * a + d2 * c,\n\t\t\tb2 * b + d2 * d,\n\t\t\te + e2 * a + f2 * c,\n\t\t\tf + e2 * b + f2 * d);\n\t}\n\n\tclone() {\n\t\treturn new Matrix2D(this.a, this.b, this.c, this.d, this.e, this.f);\n\t}\n\n\tequals(matrix) {\n\t\tlet {a, b, c, d, e, f} = this;\n\t\treturn (a === matrix.a && b === matrix.b && c === matrix.c && d === matrix.d && e === matrix.e && f === matrix.f);\n\t}\n\n\tapply(point, decoratee={}) {\n\t\tlet {x, y} = point,\n\t\t\t{a, b, c, d, e, f} = this;\n\t\tdecoratee.x = (x * a + y * c + e) || 0;\n\t\tdecoratee.y = (x * b + y * d + f) || 0;\n\t\treturn decoratee;\n\t}\n\n}\n\n// Feed in an element and it'll return a 2D matrix (optionally inverted) so that you can translate between coordinate spaces.\n// Inverting lets you translate a global point into a local coordinate space. No inverting lets you go the other way.\n// We needed this to work around various browser bugs, like Firefox doesn't accurately report getScreenCTM() when there\n// are transforms applied to ancestor elements.\n// The matrix math to convert any x/y coordinate is as follows, which is wrapped in a convenient apply() method of Matrix2D above:\n// tx = m.a * x + m.c * y + m.e\n// ty = m.b * x + m.d * y + m.f\nexport function getGlobalMatrix(element, inverse, adjustGOffset, includeScrollInFixed) { // adjustGOffset is typically used only when grabbing an element's PARENT's global matrix, and it ignores the x/y offset of any SVG elements because they behave in a special way.\n\tif (!element || !element.parentNode || (_doc || _setDoc(element)).documentElement === element) {\n\t\treturn new Matrix2D();\n\t}\n\tlet zeroScales = _forceNonZeroScale(element),\n\t\tsvg = _svgOwner(element),\n\t\ttemps = svg ? _svgTemps : _divTemps,\n\t\tcontainer = _placeSiblings(element, adjustGOffset),\n\t\tb1 = temps[0].getBoundingClientRect(),\n\t\tb2 = temps[1].getBoundingClientRect(),\n\t\tb3 = temps[2].getBoundingClientRect(),\n\t\tparent = container.parentNode,\n\t\tisFixed = !includeScrollInFixed && _isFixed(element),\n\t\tm = new Matrix2D(\n\t\t\t(b2.left - b1.left) / 100,\n\t\t\t(b2.top - b1.top) / 100,\n\t\t\t(b3.left - b1.left) / 100,\n\t\t\t(b3.top - b1.top) / 100,\n\t\t\tb1.left + (isFixed ? 0 : _getDocScrollLeft()),\n\t\t\tb1.top + (isFixed ? 0 : _getDocScrollTop())\n\t\t);\n\tparent.removeChild(container);\n\tif (zeroScales) {\n\t\tb1 = zeroScales.length;\n\t\twhile (b1--) {\n\t\t\tb2 = zeroScales[b1];\n\t\t\tb2.scaleX = b2.scaleY = 0;\n\t\t\tb2.renderTransform(1, b2);\n\t\t}\n\t}\n\treturn inverse ? m.inverse() : m;\n}\n\nexport { _getDocScrollTop, _getDocScrollLeft, _setDoc, _isFixed, _getCTM };\n\n// export function getMatrix(element) {\n// \t_doc || _setDoc(element);\n// \tlet m = (_win.getComputedStyle(element)[_transformProp] + \"\").substr(7).match(/[-.]*\\d+[.e\\-+]*\\d*[e\\-\\+]*\\d*/g),\n// \t\tis2D = m && m.length === 6;\n// \treturn !m || m.length < 6 ? new Matrix2D() : new Matrix2D(+m[0], +m[1], +m[is2D ? 2 : 4], +m[is2D ? 3 : 5], +m[is2D ? 4 : 12], +m[is2D ? 5 : 13]);\n// }","/*!\n * Draggable 3.12.1\n * https://greensock.com\n *\n * @license Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n */\n/* eslint-disable */\n\nimport { getGlobalMatrix, Matrix2D } from \"./utils/matrix.js\";\n\nlet gsap, _win, _doc, _docElement, _body, _tempDiv, _placeholderDiv, _coreInitted, _checkPrefix, _toArray, _supportsPassive, _isTouchDevice, _touchEventLookup, _isMultiTouching, _isAndroid, InertiaPlugin, _defaultCursor, _supportsPointer, _context, _getStyleSaver,\n\t_dragCount = 0,\n\t_windowExists = () => typeof(window) !== \"undefined\",\n\t_getGSAP = () => gsap || (_windowExists() && (gsap = window.gsap) && gsap.registerPlugin && gsap),\n\t_isFunction = value => typeof(value) === \"function\",\n\t_isObject = value => typeof(value) === \"object\",\n\t_isUndefined = value => typeof(value) === \"undefined\",\n\t_emptyFunc = () => false,\n\t_transformProp = \"transform\",\n\t_transformOriginProp = \"transformOrigin\",\n\t_round = value => Math.round(value * 10000) / 10000,\n\t_isArray = Array.isArray,\n\t_createElement = (type, ns) => {\n\t\tlet e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\t\treturn e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n\t},\n\t_RAD2DEG = 180 / Math.PI,\n\t_bigNum = 1e20,\n\t_identityMatrix = new Matrix2D(),\n\t_getTime = Date.now || (() => new Date().getTime()),\n\t_renderQueue = [],\n\t_lookup = {}, //when a Draggable is created, the target gets a unique _gsDragID property that allows gets associated with the Draggable instance for quick lookups in Draggable.get(). This avoids circular references that could cause gc problems.\n\t_lookupCount = 0,\n\t_clickableTagExp = /^(?:a|input|textarea|button|select)$/i,\n\t_lastDragTime = 0,\n\t_temp1 = {}, // a simple object we reuse and populate (usually x/y properties) to conserve memory and improve performance.\n\t_windowProxy = {}, //memory/performance optimization - we reuse this object during autoScroll to store window-related bounds/offsets.\n\t_copy = (obj, factor) => {\n\t\tlet copy = {}, p;\n\t\tfor (p in obj) {\n\t\t\tcopy[p] = factor ? obj[p] * factor : obj[p];\n\t\t}\n\t\treturn copy;\n\t},\n\t_extend = (obj, defaults) => {\n\t\tfor (let p in defaults) {\n\t\t\tif (!(p in obj)) {\n\t\t\t\tobj[p] = defaults[p];\n\t\t\t}\n\t\t}\n\t\treturn obj;\n\t},\n\t_setTouchActionForAllDescendants = (elements, value) => {\n\t\tlet i = elements.length,\n\t\t\tchildren;\n\t\twhile (i--) {\n\t\t\tvalue ? (elements[i].style.touchAction = value) : elements[i].style.removeProperty(\"touch-action\");\n\t\t\tchildren = elements[i].children;\n\t\t\tchildren && children.length && _setTouchActionForAllDescendants(children, value);\n\t\t}\n\t},\n\t_renderQueueTick = () => _renderQueue.forEach(func => func()),\n\t_addToRenderQueue = func => {\n\t\t_renderQueue.push(func);\n\t\tif (_renderQueue.length === 1) {\n\t\t\tgsap.ticker.add(_renderQueueTick);\n\t\t}\n\t},\n\t_renderQueueTimeout = () => !_renderQueue.length && gsap.ticker.remove(_renderQueueTick),\n\t_removeFromRenderQueue = func => {\n\t\tlet i = _renderQueue.length;\n\t\twhile (i--) {\n\t\t\tif (_renderQueue[i] === func) {\n\t\t\t\t_renderQueue.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tgsap.to(_renderQueueTimeout, {overwrite:true, delay:15, duration:0, onComplete:_renderQueueTimeout, data:\"_draggable\"}); //remove the \"tick\" listener only after the render queue is empty for 15 seconds (to improve performance). Adding/removing it constantly for every click/touch wouldn't deliver optimal speed, and we also don't want the ticker to keep calling the render method when things are idle for long periods of time (we want to improve battery life on mobile devices).\n\t},\n\t_setDefaults = (obj, defaults) => {\n\t\tfor (let p in defaults) {\n\t\t\tif (!(p in obj)) {\n\t\t\t\tobj[p] = defaults[p];\n\t\t\t}\n\t\t}\n\t\treturn obj;\n\t},\n\t_addListener = (element, type, func, capture) => {\n\t\tif (element.addEventListener) {\n\t\t\tlet touchType = _touchEventLookup[type];\n\t\t\tcapture = capture || (_supportsPassive ? {passive: false} : null);\n\t\t\telement.addEventListener(touchType || type, func, capture);\n\t\t\t(touchType && type !== touchType) && element.addEventListener(type, func, capture);//some browsers actually support both, so must we. But pointer events cover all.\n\t\t}\n\t},\n\t_removeListener = (element, type, func, capture) => {\n\t\tif (element.removeEventListener) {\n\t\t\tlet touchType = _touchEventLookup[type];\n\t\t\telement.removeEventListener(touchType || type, func, capture);\n\t\t\t(touchType && type !== touchType) && element.removeEventListener(type, func, capture);\n\t\t}\n\t},\n\t_preventDefault = event => {\n\t\tevent.preventDefault && event.preventDefault();\n\t\tevent.preventManipulation && event.preventManipulation(); //for some Microsoft browsers\n\t},\n\t_hasTouchID = (list, ID) => {\n\t\tlet i = list.length;\n\t\twhile (i--) {\n\t\t\tif (list[i].identifier === ID) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t},\n\t_onMultiTouchDocumentEnd = event => {\n\t\t_isMultiTouching = (event.touches && _dragCount < event.touches.length);\n\t\t_removeListener(event.target, \"touchend\", _onMultiTouchDocumentEnd);\n\t},\n\n\t_onMultiTouchDocument = event => {\n\t\t_isMultiTouching = (event.touches && _dragCount < event.touches.length);\n\t\t_addListener(event.target, \"touchend\", _onMultiTouchDocumentEnd);\n\t},\n\t_getDocScrollTop = doc => _win.pageYOffset || doc.scrollTop || doc.documentElement.scrollTop || doc.body.scrollTop || 0,\n\t_getDocScrollLeft = doc => _win.pageXOffset || doc.scrollLeft || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0,\n\t_addScrollListener = (e, callback) => {\n\t\t_addListener(e, \"scroll\", callback);\n\t\tif (!_isRoot(e.parentNode)) {\n\t\t\t_addScrollListener(e.parentNode, callback);\n\t\t}\n\t},\n\t_removeScrollListener = (e, callback) => {\n\t\t_removeListener(e, \"scroll\", callback);\n\t\tif (!_isRoot(e.parentNode)) {\n\t\t\t_removeScrollListener(e.parentNode, callback);\n\t\t}\n\t},\n\t_isRoot = e => !!(!e || e === _docElement || e.nodeType === 9 || e === _doc.body || e === _win || !e.nodeType || !e.parentNode),\n\t_getMaxScroll = (element, axis) => {\n\t\tlet dim = (axis === \"x\") ? \"Width\" : \"Height\",\n\t\t\tscroll = \"scroll\" + dim,\n\t\t\tclient = \"client\" + dim;\n\t\treturn Math.max(0, _isRoot(element) ? Math.max(_docElement[scroll], _body[scroll]) - (_win[\"inner\" + dim] || _docElement[client] || _body[client]) : element[scroll] - element[client]);\n\t},\n\t_recordMaxScrolls = (e, skipCurrent) => { //records _gsMaxScrollX and _gsMaxScrollY properties for the element and all ancestors up the chain so that we can cap it, otherwise dragging beyond the edges with autoScroll on can endlessly scroll.\n\t\tlet x = _getMaxScroll(e, \"x\"),\n\t\t\ty = _getMaxScroll(e, \"y\");\n\t\tif (_isRoot(e)) {\n\t\t\te = _windowProxy;\n\t\t} else {\n\t\t\t_recordMaxScrolls(e.parentNode, skipCurrent);\n\t\t}\n\t\te._gsMaxScrollX = x;\n\t\te._gsMaxScrollY = y;\n\t\tif (!skipCurrent) {\n\t\t\te._gsScrollX = e.scrollLeft || 0;\n\t\t\te._gsScrollY = e.scrollTop || 0;\n\t\t}\n\t},\n\t_setStyle = (element, property, value) => {\n\t\tlet style = element.style;\n\t\tif (!style) {\n\t\t\treturn;\n\t\t}\n\t\tif (_isUndefined(style[property])) {\n\t\t\tproperty = _checkPrefix(property, element) || property;\n\t\t}\n\t\tif (value == null) {\n\t\t\tstyle.removeProperty && style.removeProperty(property.replace(/([A-Z])/g, \"-$1\").toLowerCase());\n\t\t} else {\n\t\t\tstyle[property] = value;\n\t\t}\n\t},\n\t_getComputedStyle = element => _win.getComputedStyle((element instanceof Element) ? element : element.host || (element.parentNode || {}).host || element), //the \"host\" stuff helps to accommodate ShadowDom objects.\n\n\t_tempRect = {}, //reuse to reduce garbage collection tasks\n\t_parseRect = e => { //accepts a DOM element, a mouse event, or a rectangle object and returns the corresponding rectangle with left, right, width, height, top, and bottom properties\n\t\tif (e === _win) {\n\t\t\t_tempRect.left = _tempRect.top = 0;\n\t\t\t_tempRect.width = _tempRect.right = _docElement.clientWidth || e.innerWidth || _body.clientWidth || 0;\n\t\t\t_tempRect.height = _tempRect.bottom = ((e.innerHeight || 0) - 20 < _docElement.clientHeight) ? _docElement.clientHeight : e.innerHeight || _body.clientHeight || 0;\n\t\t\treturn _tempRect;\n\t\t}\n\t\tlet doc = e.ownerDocument || _doc,\n\t\t\tr = !_isUndefined(e.pageX) ? {left: e.pageX - _getDocScrollLeft(doc), top: e.pageY - _getDocScrollTop(doc), right: e.pageX - _getDocScrollLeft(doc) + 1, bottom: e.pageY - _getDocScrollTop(doc) + 1} : (!e.nodeType && !_isUndefined(e.left) && !_isUndefined(e.top)) ? e : _toArray(e)[0].getBoundingClientRect();\n\t\tif (_isUndefined(r.right) && !_isUndefined(r.width)) {\n\t\t\tr.right = r.left + r.width;\n\t\t\tr.bottom = r.top + r.height;\n\t\t} else if (_isUndefined(r.width)) { //some browsers don't include width and height properties. We can't just set them directly on r because some browsers throw errors, so create a new generic object.\n\t\t\tr = {width: r.right - r.left, height: r.bottom - r.top, right: r.right, left: r.left, bottom: r.bottom, top: r.top};\n\t\t}\n\t\treturn r;\n\t},\n\n\t_dispatchEvent = (target, type, callbackName) => {\n\t\tlet vars = target.vars,\n\t\t\tcallback = vars[callbackName],\n\t\t\tlisteners = target._listeners[type],\n\t\t\tresult;\n\t\tif (_isFunction(callback)) {\n\t\t\tresult = callback.apply(vars.callbackScope || target, vars[callbackName + \"Params\"] || [target.pointerEvent]);\n\t\t}\n\t\tif (listeners && target.dispatchEvent(type) === false) {\n\t\t\tresult = false;\n\t\t}\n\t\treturn result;\n\t},\n\t_getBounds = (target, context) => { //accepts any of the following: a DOM element, jQuery object, selector text, or an object defining bounds as {top, left, width, height} or {minX, maxX, minY, maxY}. Returns an object with left, top, width, and height properties.\n\t\tlet e = _toArray(target)[0],\n\t\t\ttop, left, offset;\n\t\tif (!e.nodeType && e !== _win) {\n\t\t\tif (!_isUndefined(target.left)) {\n\t\t\t\toffset = {x:0, y:0}; //_getOffsetTransformOrigin(context); //the bounds should be relative to the origin\n\t\t\t\treturn {left: target.left - offset.x, top: target.top - offset.y, width: target.width, height: target.height};\n\t\t\t}\n\t\t\tleft = target.min || target.minX || target.minRotation || 0;\n\t\t\ttop = target.min || target.minY || 0;\n\t\t\treturn {left:left, top:top, width:(target.max || target.maxX || target.maxRotation || 0) - left, height:(target.max || target.maxY || 0) - top};\n\t\t}\n\t\treturn _getElementBounds(e, context);\n\t},\n\t_point1 = {}, //we reuse to minimize garbage collection tasks.\n\t_getElementBounds = (element, context) => {\n\t\tcontext = _toArray(context)[0];\n\t\tlet isSVG = (element.getBBox && element.ownerSVGElement),\n\t\t\tdoc = element.ownerDocument || _doc,\n\t\t\tleft, right, top, bottom, matrix, p1, p2, p3, p4, bbox, width, height, cs;\n\t\tif (element === _win) {\n\t\t\ttop = _getDocScrollTop(doc);\n\t\t\tleft = _getDocScrollLeft(doc);\n\t\t\tright = left + (doc.documentElement.clientWidth || element.innerWidth || doc.body.clientWidth || 0);\n\t\t\tbottom = top + (((element.innerHeight || 0) - 20 < doc.documentElement.clientHeight) ? doc.documentElement.clientHeight : element.innerHeight || doc.body.clientHeight || 0); //some browsers (like Firefox) ignore absolutely positioned elements, and collapse the height of the documentElement, so it could be 8px, for example, if you have just an absolutely positioned div. In that case, we use the innerHeight to resolve this.\n\t\t} else if (context === _win || _isUndefined(context)) {\n\t\t\treturn element.getBoundingClientRect();\n\t\t} else {\n\t\t\tleft = top = 0;\n\t\t\tif (isSVG) {\n\t\t\t\tbbox = element.getBBox();\n\t\t\t\twidth = bbox.width;\n\t\t\t\theight = bbox.height;\n\t\t\t} else {\n\t\t\t\tif (element.viewBox && (bbox = element.viewBox.baseVal)) {\n\t\t\t\t\tleft = bbox.x || 0;\n\t\t\t\t\ttop = bbox.y || 0;\n\t\t\t\t\twidth = bbox.width;\n\t\t\t\t\theight = bbox.height;\n\t\t\t\t}\n\t\t\t\tif (!width) {\n\t\t\t\t\tcs = _getComputedStyle(element);\n\t\t\t\t\tbbox = cs.boxSizing === \"border-box\";\n\t\t\t\t\twidth = (parseFloat(cs.width) || element.clientWidth || 0) + (bbox ? 0 : parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth));\n\t\t\t\t\theight = (parseFloat(cs.height) || element.clientHeight || 0) + (bbox ? 0 : parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth));\n\t\t\t\t}\n\t\t\t}\n\t\t\tright = width;\n\t\t\tbottom = height;\n\t\t}\n\t\tif (element === context) {\n\t\t\treturn {left:left, top:top, width: right - left, height: bottom - top};\n\t\t}\n\t\tmatrix = getGlobalMatrix(context, true).multiply(getGlobalMatrix(element));\n\t\tp1 = matrix.apply({x:left, y:top});\n\t\tp2 = matrix.apply({x:right, y:top});\n\t\tp3 = matrix.apply({x:right, y:bottom});\n\t\tp4 = matrix.apply({x:left, y:bottom});\n\t\tleft = Math.min(p1.x, p2.x, p3.x, p4.x);\n\t\ttop = Math.min(p1.y, p2.y, p3.y, p4.y);\n\t\treturn {left: left, top: top, width: Math.max(p1.x, p2.x, p3.x, p4.x) - left, height: Math.max(p1.y, p2.y, p3.y, p4.y) - top};\n\t},\n\t_parseInertia = (draggable, snap, max, min, factor, forceZeroVelocity) => {\n\t\tlet vars = {},\n\t\t\ta, i, l;\n\t\tif (snap) {\n\t\t\tif (factor !== 1 && snap instanceof Array) { //some data must be altered to make sense, like if the user passes in an array of rotational values in degrees, we must convert it to radians. Or for scrollLeft and scrollTop, we invert the values.\n\t\t\t\tvars.end = a = [];\n\t\t\t\tl = snap.length;\n\t\t\t\tif (_isObject(snap[0])) { //if the array is populated with objects, like points ({x:100, y:200}), make copies before multiplying by the factor, otherwise we'll mess up the originals and the user may reuse it elsewhere.\n\t\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\t\ta[i] = _copy(snap[i], factor);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\t\ta[i] = snap[i] * factor;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmax += 1.1; //allow 1.1 pixels of wiggle room when snapping in order to work around some browser inconsistencies in the way bounds are reported which can make them roughly a pixel off. For example, if \"snap:[-$('#menu').width(), 0]\" was defined and #menu had a wrapper that was used as the bounds, some browsers would be one pixel off, making the minimum -752 for example when snap was [-753,0], thus instead of snapping to -753, it would snap to 0 since -753 was below the minimum.\n\t\t\t\tmin -= 1.1;\n\t\t\t} else if (_isFunction(snap)) {\n\t\t\t\tvars.end = value => {\n\t\t\t\t\tlet result = snap.call(draggable, value),\n\t\t\t\t\t\tcopy, p;\n\t\t\t\t\tif (factor !== 1) {\n\t\t\t\t\t\tif (_isObject(result)) {\n\t\t\t\t\t\t\tcopy = {};\n\t\t\t\t\t\t\tfor (p in result) {\n\t\t\t\t\t\t\t\tcopy[p] = result[p] * factor;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresult = copy;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult *= factor;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result; //we need to ensure that we can scope the function call to the Draggable instance itself so that users can access important values like maxX, minX, maxY, minY, x, and y from within that function.\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tvars.end = snap;\n\t\t\t}\n\t\t}\n\t\tif (max || max === 0) {\n\t\t\tvars.max = max;\n\t\t}\n\t\tif (min || min === 0) {\n\t\t\tvars.min = min;\n\t\t}\n\t\tif (forceZeroVelocity) {\n\t\t\tvars.velocity = 0;\n\t\t}\n\t\treturn vars;\n\t},\n\t_isClickable = element => { //sometimes it's convenient to mark an element as clickable by adding a data-clickable=\"true\" attribute (in which case we won't preventDefault() the mouse/touch event). This method checks if the element is an , . Skip the vendor prefixed ones.\n\t\t\t\t\tif (!+p && !_prefixExp.test(p) && cs[p] && typeof style[p] === \"string\" && p !== \"0\") {\n\t\t\t\t\t\tstyle[p] = cs[p];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.top = top;\n\t\t\t\tstyle.left = left;\n\t\t\t} else {\n\t\t\t\tstyle.cssText = element._stOrig;\n\t\t\t}\n\t\t\tgsap.core.getCache(element).uncache = 1;\n\t\t\tparent.appendChild(element);\n\t\t}\n\t},\n\t_interruptionTracker = (getValueFunc, initialValue, onInterrupt) => {\n\t\tlet last1 = initialValue,\n\t\t\tlast2 = last1;\n\t\treturn value => {\n\t\t\tlet current = Math.round(getValueFunc()); // round because in some [very uncommon] Windows environments, scroll can get reported with decimals even though it was set without.\n\t\t\tif (current !== last1 && current !== last2 && Math.abs(current - last1) > 3 && Math.abs(current - last2) > 3) { // if the user scrolls, kill the tween. iOS Safari intermittently misreports the scroll position, it may be the most recently-set one or the one before that! When Safari is zoomed (CMD-+), it often misreports as 1 pixel off too! So if we set the scroll position to 125, for example, it'll actually report it as 124.\n\t\t\t\tvalue = current;\n\t\t\t\tonInterrupt && onInterrupt();\n\t\t\t}\n\t\t\tlast2 = last1;\n\t\t\tlast1 = value;\n\t\t\treturn value;\n\t\t};\n\t},\n\t_shiftMarker = (marker, direction, value) => {\n\t\tlet vars = {};\n\t\tvars[direction.p] = \"+=\" + value;\n\t\tgsap.set(marker, vars);\n\t},\n\t// _mergeAnimations = animations => {\n\t// \tlet tl = gsap.timeline({smoothChildTiming: true}).startTime(Math.min(...animations.map(a => a.globalTime(0))));\n\t// \tanimations.forEach(a => {let time = a.totalTime(); tl.add(a); a.totalTime(time); });\n\t// \ttl.smoothChildTiming = false;\n\t// \treturn tl;\n\t// },\n\n\t// returns a function that can be used to tween the scroll position in the direction provided, and when doing so it'll add a .tween property to the FUNCTION itself, and remove it when the tween completes or gets killed. This gives us a way to have multiple ScrollTriggers use a central function for any given scroller and see if there's a scroll tween running (which would affect if/how things get updated)\n\t_getTweenCreator = (scroller, direction) => {\n\t\tlet getScroll = _getScrollFunc(scroller, direction),\n\t\t\tprop = \"_scroll\" + direction.p2, // add a tweenable property to the scroller that's a getter/setter function, like _scrollTop or _scrollLeft. This way, if someone does gsap.killTweensOf(scroller) it'll kill the scroll tween.\n\t\t\tgetTween = (scrollTo, vars, initialValue, change1, change2) => {\n\t\t\t\tlet tween = getTween.tween,\n\t\t\t\t\tonComplete = vars.onComplete,\n\t\t\t\t\tmodifiers = {};\n\t\t\t\tinitialValue = initialValue || getScroll();\n\t\t\t\tlet checkForInterruption = _interruptionTracker(getScroll, initialValue, () => {\n\t\t\t\t\ttween.kill();\n\t\t\t\t\tgetTween.tween = 0;\n\t\t\t\t})\n\t\t\t\tchange2 = (change1 && change2) || 0; // if change1 is 0, we set that to the difference and ignore change2. Otherwise, there would be a compound effect.\n\t\t\t\tchange1 = change1 || (scrollTo - initialValue);\n\t\t\t\ttween && tween.kill();\n\t\t\t\tvars[prop] = scrollTo;\n\t\t\t\tvars.modifiers = modifiers;\n\t\t\t\tmodifiers[prop] = () => checkForInterruption(initialValue + change1 * tween.ratio + change2 * tween.ratio * tween.ratio);\n\t\t\t\tvars.onUpdate = () => {\n\t\t\t\t\t_scrollers.cache++;\n\t\t\t\t\t_updateAll();\n\t\t\t\t};\n\t\t\t\tvars.onComplete = () => {\n\t\t\t\t\tgetTween.tween = 0;\n\t\t\t\t\tonComplete && onComplete.call(tween);\n\t\t\t\t};\n\t\t\t\ttween = getTween.tween = gsap.to(scroller, vars);\n\t\t\t\treturn tween;\n\t\t\t};\n\t\tscroller[prop] = getScroll;\n\t\tgetScroll.wheelHandler = () => getTween.tween && getTween.tween.kill() && (getTween.tween = 0);\n\t\t_addListener(scroller, \"wheel\", getScroll.wheelHandler); // Windows machines handle mousewheel scrolling in chunks (like \"3 lines per scroll\") meaning the typical strategy for cancelling the scroll isn't as sensitive. It's much more likely to match one of the previous 2 scroll event positions. So we kill any snapping as soon as there's a wheel event.\n\t\tScrollTrigger.isTouch && _addListener(scroller, \"touchmove\", getScroll.wheelHandler);\n\t\treturn getTween;\n\t};\n\n\n\n\nexport class ScrollTrigger {\n\n\tconstructor(vars, animation) {\n\t\t_coreInitted || ScrollTrigger.register(gsap) || console.warn(\"Please gsap.registerPlugin(ScrollTrigger)\");\n\t\t_context(this);\n\t\tthis.init(vars, animation);\n\t}\n\n\tinit(vars, animation) {\n\t\tthis.progress = this.start = 0;\n\t\tthis.vars && this.kill(true, true); // in case it's being initted again\n\t\tif (!_enabled) {\n\t\t\tthis.update = this.refresh = this.kill = _passThrough;\n\t\t\treturn;\n\t\t}\n\t\tvars = _setDefaults((_isString(vars) || _isNumber(vars) || vars.nodeType) ? {trigger: vars} : vars, _defaults);\n\t\tlet {onUpdate, toggleClass, id, onToggle, onRefresh, scrub, trigger, pin, pinSpacing, invalidateOnRefresh, anticipatePin, onScrubComplete, onSnapComplete, once, snap, pinReparent, pinSpacer, containerAnimation, fastScrollEnd, preventOverlaps} = vars,\n\t\t\tdirection = vars.horizontal || (vars.containerAnimation && vars.horizontal !== false) ? _horizontal : _vertical,\n\t\t\tisToggle = !scrub && scrub !== 0,\n\t\t\tscroller = _getTarget(vars.scroller || _win),\n\t\t\tscrollerCache = gsap.core.getCache(scroller),\n\t\t\tisViewport = _isViewport(scroller),\n\t\t\tuseFixedPosition = (\"pinType\" in vars ? vars.pinType : _getProxyProp(scroller, \"pinType\") || (isViewport && \"fixed\")) === \"fixed\",\n\t\t\tcallbacks = [vars.onEnter, vars.onLeave, vars.onEnterBack, vars.onLeaveBack],\n\t\t\ttoggleActions = isToggle && vars.toggleActions.split(\" \"),\n\t\t\tmarkers = \"markers\" in vars ? vars.markers : _defaults.markers,\n\t\t\tborderWidth = isViewport ? 0 : parseFloat(_getComputedStyle(scroller)[\"border\" + direction.p2 + _Width]) || 0,\n\t\t\tself = this,\n\t\t\tonRefreshInit = vars.onRefreshInit && (() => vars.onRefreshInit(self)),\n\t\t\tgetScrollerSize = _getSizeFunc(scroller, isViewport, direction),\n\t\t\tgetScrollerOffsets = _getOffsetsFunc(scroller, isViewport),\n\t\t\tlastSnap = 0,\n\t\t\tlastRefresh = 0,\n\t\t\tprevProgress = 0,\n\t\t\tscrollFunc = _getScrollFunc(scroller, direction),\n\t\t\ttweenTo, pinCache, snapFunc, scroll1, scroll2, start, end, markerStart, markerEnd, markerStartTrigger, markerEndTrigger, markerVars, executingOnRefresh,\n\t\t\tchange, pinOriginalState, pinActiveState, pinState, spacer, offset, pinGetter, pinSetter, pinStart, pinChange, spacingStart, spacerState, markerStartSetter, pinMoves,\n\t\t\tmarkerEndSetter, cs, snap1, snap2, scrubTween, scrubSmooth, snapDurClamp, snapDelayedCall, prevScroll, prevAnimProgress, caMarkerSetter, customRevertReturn;\n\n\t\t// for the sake of efficiency, _startClamp/_endClamp serve like a truthy value indicating that clamping was enabled on the start/end, and ALSO store the actual pre-clamped numeric value. We tap into that in ScrollSmoother for speed effects. So for example, if start=\"clamp(top bottom)\" results in a start of -100 naturally, it would get clamped to 0 but -100 would be stored in _startClamp.\n\t\tself._startClamp = self._endClamp = false;\n\t\tself._dir = direction;\n\t\tanticipatePin *= 45;\n\t\tself.scroller = scroller;\n\t\tself.scroll = containerAnimation ? containerAnimation.time.bind(containerAnimation) : scrollFunc;\n\t\tscroll1 = scrollFunc();\n\t\tself.vars = vars;\n\t\tanimation = animation || vars.animation;\n\t\tif (\"refreshPriority\" in vars) {\n\t\t\t_sort = 1;\n\t\t\tvars.refreshPriority === -9999 && (_primary = self); // used by ScrollSmoother\n\t\t}\n\t\tscrollerCache.tweenScroll = scrollerCache.tweenScroll || {\n\t\t\ttop: _getTweenCreator(scroller, _vertical),\n\t\t\tleft: _getTweenCreator(scroller, _horizontal)\n\t\t};\n\t\tself.tweenTo = tweenTo = scrollerCache.tweenScroll[direction.p];\n\t\tself.scrubDuration = value => {\n\t\t\tscrubSmooth = _isNumber(value) && value;\n\t\t\tif (!scrubSmooth) {\n\t\t\t\tscrubTween && scrubTween.progress(1).kill();\n\t\t\t\tscrubTween = 0;\n\t\t\t} else {\n\t\t\t\tscrubTween ? scrubTween.duration(value) : (scrubTween = gsap.to(animation, {ease: \"expo\", totalProgress: \"+=0\", duration: scrubSmooth, paused: true, onComplete: () => onScrubComplete && onScrubComplete(self)}));\n\t\t\t}\n\t\t};\n\t\tif (animation) {\n\t\t\tanimation.vars.lazy = false;\n\t\t\t(animation._initted && !self.isReverted) || (animation.vars.immediateRender !== false && vars.immediateRender !== false && animation.duration() && animation.render(0, true, true)); // special case: if this ScrollTrigger gets re-initted, a from() tween with a stagger could get initted initially and then reverted on the re-init which means it'll need to get rendered again here to properly display things. Otherwise, See https://greensock.com/forums/topic/36777-scrollsmoother-splittext-nextjs/ and https://codepen.io/GreenSock/pen/eYPyPpd?editors=0010\n\t\t\tself.animation = animation.pause();\n\t\t\tanimation.scrollTrigger = self;\n\t\t\tself.scrubDuration(scrub);\n\t\t\tsnap1 = 0;\n\t\t\tid || (id = animation.vars.id);\n\t\t}\n\n\t\tif (snap) {\n\t\t\t// TODO: potential idea: use legitimate CSS scroll snapping by pushing invisible elements into the DOM that serve as snap positions, and toggle the document.scrollingElement.style.scrollSnapType onToggle. See https://codepen.io/GreenSock/pen/JjLrgWM for a quick proof of concept.\n\t\t\tif (!_isObject(snap) || snap.push) {\n\t\t\t\tsnap = {snapTo: snap};\n\t\t\t}\n\t\t\t(\"scrollBehavior\" in _body.style) && gsap.set(isViewport ? [_body, _docEl] : scroller, {scrollBehavior: \"auto\"}); // smooth scrolling doesn't work with snap.\n\t\t\t_scrollers.forEach(o => _isFunction(o) && o.target === (isViewport ? _doc.scrollingElement || _docEl : scroller) && (o.smooth = false)); // note: set smooth to false on both the vertical and horizontal scroll getters/setters\n\t\t\tsnapFunc = _isFunction(snap.snapTo) ? snap.snapTo : snap.snapTo === \"labels\" ? _getClosestLabel(animation) : snap.snapTo === \"labelsDirectional\" ? _getLabelAtDirection(animation) : snap.directional !== false ? (value, st) => _snapDirectional(snap.snapTo)(value, _getTime() - lastRefresh < 500 ? 0 : st.direction) : gsap.utils.snap(snap.snapTo);\n\t\t\tsnapDurClamp = snap.duration || {min: 0.1, max: 2};\n\t\t\tsnapDurClamp = _isObject(snapDurClamp) ? _clamp(snapDurClamp.min, snapDurClamp.max) : _clamp(snapDurClamp, snapDurClamp);\n\t\t\tsnapDelayedCall = gsap.delayedCall(snap.delay || (scrubSmooth / 2) || 0.1, () => {\n\t\t\t\tlet scroll = scrollFunc(),\n\t\t\t\t\trefreshedRecently = _getTime() - lastRefresh < 500,\n\t\t\t\t\ttween = tweenTo.tween;\n\t\t\t\tif ((refreshedRecently || Math.abs(self.getVelocity()) < 10) && !tween && !_pointerIsDown && lastSnap !== scroll) {\n\t\t\t\t\tlet progress = (scroll - start) / change, // don't use self.progress because this might run between the refresh() and when the scroll position updates and self.progress is set properly in the update() method.\n\t\t\t\t\t\ttotalProgress = animation && !isToggle ? animation.totalProgress() : progress,\n\t\t\t\t\t\tvelocity = refreshedRecently ? 0 : ((totalProgress - snap2) / (_getTime() - _time2) * 1000) || 0,\n\t\t\t\t\t\tchange1 = gsap.utils.clamp(-progress, 1 - progress, _abs(velocity / 2) * velocity / 0.185),\n\t\t\t\t\t\tnaturalEnd = progress + (snap.inertia === false ? 0 : change1),\n\t\t\t\t\t\tendValue = _clamp(0, 1, snapFunc(naturalEnd, self)),\n\t\t\t\t\t\tendScroll = Math.round(start + endValue * change),\n\t\t\t\t\t\t{ onStart, onInterrupt, onComplete } = snap;\n\t\t\t\t\tif (scroll <= end && scroll >= start && endScroll !== scroll) {\n\t\t\t\t\t\tif (tween && !tween._initted && tween.data <= _abs(endScroll - scroll)) { // there's an overlapping snap! So we must figure out which one is closer and let that tween live.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (snap.inertia === false) {\n\t\t\t\t\t\t\tchange1 = endValue - progress;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttweenTo(endScroll, {\n\t\t\t\t\t\t\tduration: snapDurClamp(_abs( (Math.max(_abs(naturalEnd - totalProgress), _abs(endValue - totalProgress)) * 0.185 / velocity / 0.05) || 0)),\n\t\t\t\t\t\t\tease: snap.ease || \"power3\",\n\t\t\t\t\t\t\tdata: _abs(endScroll - scroll), // record the distance so that if another snap tween occurs (conflict) we can prioritize the closest snap.\n\t\t\t\t\t\t\tonInterrupt: () => snapDelayedCall.restart(true) && onInterrupt && onInterrupt(self),\n\t\t\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\t\t\tself.update();\n\t\t\t\t\t\t\t\tlastSnap = scrollFunc();\n\t\t\t\t\t\t\t\tsnap1 = snap2 = animation && !isToggle ? animation.totalProgress() : self.progress;\n\t\t\t\t\t\t\t\tonSnapComplete && onSnapComplete(self);\n\t\t\t\t\t\t\t\tonComplete && onComplete(self);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, scroll, change1 * change, endScroll - scroll - change1 * change);\n\t\t\t\t\t\tonStart && onStart(self, tweenTo.tween);\n\t\t\t\t\t}\n\t\t\t\t} else if (self.isActive && lastSnap !== scroll) {\n\t\t\t\t\tsnapDelayedCall.restart(true);\n\t\t\t\t}\n\t\t\t}).pause();\n\t\t}\n\t\tid && (_ids[id] = self);\n\t\ttrigger = self.trigger = _getTarget(trigger || (pin !== true && pin));\n\n\t\t// if a trigger has some kind of scroll-related effect applied that could contaminate the \"y\" or \"x\" position (like a ScrollSmoother effect), we needed a way to temporarily revert it, so we use the stRevert property of the gsCache. It can return another function that we'll call at the end so it can return to its normal state.\n\t\tcustomRevertReturn = trigger && trigger._gsap && trigger._gsap.stRevert;\n\t\tcustomRevertReturn && (customRevertReturn = customRevertReturn(self));\n\n\t\tpin = pin === true ? trigger : _getTarget(pin);\n\t\t_isString(toggleClass) && (toggleClass = {targets: trigger, className: toggleClass});\n\t\tif (pin) {\n\t\t\t(pinSpacing === false || pinSpacing === _margin) || (pinSpacing = !pinSpacing && pin.parentNode && pin.parentNode.style && _getComputedStyle(pin.parentNode).display === \"flex\" ? false : _padding); // if the parent is display: flex, don't apply pinSpacing by default. We should check that pin.parentNode is an element (not shadow dom window)\n\t\t\tself.pin = pin;\n\t\t\tpinCache = gsap.core.getCache(pin);\n\t\t\tif (!pinCache.spacer) { // record the spacer and pinOriginalState on the cache in case someone tries pinning the same element with MULTIPLE ScrollTriggers - we don't want to have multiple spacers or record the \"original\" pin state after it has already been affected by another ScrollTrigger.\n\t\t\t\tif (pinSpacer) {\n\t\t\t\t\tpinSpacer = _getTarget(pinSpacer);\n\t\t\t\t\tpinSpacer && !pinSpacer.nodeType && (pinSpacer = pinSpacer.current || pinSpacer.nativeElement); // for React & Angular\n\t\t\t\t\tpinCache.spacerIsNative = !!pinSpacer;\n\t\t\t\t\tpinSpacer && (pinCache.spacerState = _getState(pinSpacer));\n\t\t\t\t}\n\t\t\t\tpinCache.spacer = spacer = pinSpacer || _doc.createElement(\"div\");\n\t\t\t\tspacer.classList.add(\"pin-spacer\");\n\t\t\t\tid && spacer.classList.add(\"pin-spacer-\" + id);\n\t\t\t\tpinCache.pinState = pinOriginalState = _getState(pin);\n\t\t\t} else {\n\t\t\t\tpinOriginalState = pinCache.pinState;\n\t\t\t}\n\t\t\tvars.force3D !== false && gsap.set(pin, {force3D: true});\n\t\t\tself.spacer = spacer = pinCache.spacer;\n\t\t\tcs = _getComputedStyle(pin);\n\t\t\tspacingStart = cs[pinSpacing + direction.os2];\n\t\t\tpinGetter = gsap.getProperty(pin);\n\t\t\tpinSetter = gsap.quickSetter(pin, direction.a, _px);\n\t\t\t// pin.firstChild && !_maxScroll(pin, direction) && (pin.style.overflow = \"hidden\"); // protects from collapsing margins, but can have unintended consequences as demonstrated here: https://codepen.io/GreenSock/pen/1e42c7a73bfa409d2cf1e184e7a4248d so it was removed in favor of just telling people to set up their CSS to avoid the collapsing margins (overflow: hidden | auto is just one option. Another is border-top: 1px solid transparent).\n\t\t\t_swapPinIn(pin, spacer, cs);\n\t\t\tpinState = _getState(pin);\n\t\t}\n\t\tif (markers) {\n\t\t\tmarkerVars = _isObject(markers) ? _setDefaults(markers, _markerDefaults) : _markerDefaults;\n\t\t\tmarkerStartTrigger = _createMarker(\"scroller-start\", id, scroller, direction, markerVars, 0);\n\t\t\tmarkerEndTrigger = _createMarker(\"scroller-end\", id, scroller, direction, markerVars, 0, markerStartTrigger);\n\t\t\toffset = markerStartTrigger[\"offset\" + direction.op.d2];\n\t\t\tlet content = _getTarget(_getProxyProp(scroller, \"content\") || scroller);\n\t\t\tmarkerStart = this.markerStart = _createMarker(\"start\", id, content, direction, markerVars, offset, 0, containerAnimation);\n\t\t\tmarkerEnd = this.markerEnd = _createMarker(\"end\", id, content, direction, markerVars, offset, 0, containerAnimation);\n\t\t\tcontainerAnimation && (caMarkerSetter = gsap.quickSetter([markerStart, markerEnd], direction.a, _px));\n\t\t\tif ((!useFixedPosition && !(_proxies.length && _getProxyProp(scroller, \"fixedMarkers\") === true))) {\n\t\t\t\t_makePositionable(isViewport ? _body : scroller);\n\t\t\t\tgsap.set([markerStartTrigger, markerEndTrigger], {force3D: true});\n\t\t\t\tmarkerStartSetter = gsap.quickSetter(markerStartTrigger, direction.a, _px);\n\t\t\t\tmarkerEndSetter = gsap.quickSetter(markerEndTrigger, direction.a, _px);\n\t\t\t}\n\t\t}\n\n\t\tif (containerAnimation) {\n\t\t\tlet oldOnUpdate = containerAnimation.vars.onUpdate,\n\t\t\t\toldParams = containerAnimation.vars.onUpdateParams;\n\t\t\tcontainerAnimation.eventCallback(\"onUpdate\", () => {\n\t\t\t\tself.update(0, 0, 1);\n\t\t\t\toldOnUpdate && oldOnUpdate.apply(containerAnimation, oldParams || []);\n\t\t\t});\n\t\t}\n\n\t\tself.previous = () => _triggers[_triggers.indexOf(self) - 1];\n\t\tself.next = () => _triggers[_triggers.indexOf(self) + 1];\n\n\t\tself.revert = (revert, temp) => {\n\t\t\tif (!temp) { return self.kill(true); } // for compatibility with gsap.context() and gsap.matchMedia() which call revert()\n\t\t\tlet r = revert !== false || !self.enabled,\n\t\t\t\tprevRefreshing = _refreshing;\n\t\t\tif (r !== self.isReverted) {\n\t\t\t\tif (r) {\n\t\t\t\t\tprevScroll = Math.max(scrollFunc(), self.scroll.rec || 0); // record the scroll so we can revert later (repositioning/pinning things can affect scroll position). In the static refresh() method, we first record all the scroll positions as a reference.\n\t\t\t\t\tprevProgress = self.progress;\n\t\t\t\t\tprevAnimProgress = animation && animation.progress();\n\t\t\t\t}\n\t\t\t\tmarkerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(m => m.style.display = r ? \"none\" : \"block\");\n\t\t\t\tif (r) {\n\t\t\t\t\t_refreshing = self;\n\t\t\t\t\tself.update(r); // make sure the pin is back in its original position so that all the measurements are correct. do this BEFORE swapping the pin out\n\t\t\t\t}\n\t\t\t\tif (pin && (!pinReparent || !self.isActive)) {\n\t\t\t\t\tif (r) {\n\t\t\t\t\t\t_swapPinOut(pin, spacer, pinOriginalState);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_swapPinIn(pin, spacer, _getComputedStyle(pin), spacerState);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tr || self.update(r); // when we're restoring, the update should run AFTER swapping the pin into its pin-spacer.\n\t\t\t\t_refreshing = prevRefreshing; // restore. We set it to true during the update() so that things fire properly in there.\n\t\t\t\tself.isReverted = r;\n\t\t\t}\n\t\t}\n\n\t\tself.refresh = (soft, force, position, pinOffset) => { // position is typically only defined if it's coming from setPositions() - it's a way to skip the normal parsing. pinOffset is also only from setPositions() and is mostly related to fancy stuff we need to do in ScrollSmoother with effects\n\t\t\tif ((_refreshing || !self.enabled) && !force) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (pin && soft && _lastScrollTime) {\n\t\t\t\t_addListener(ScrollTrigger, \"scrollEnd\", _softRefresh);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t!_refreshingAll && onRefreshInit && onRefreshInit(self);\n\t\t\t_refreshing = self;\n\t\t\tif (tweenTo.tween) {\n\t\t\t\ttweenTo.tween.kill();\n\t\t\t\ttweenTo.tween = 0;\n\t\t\t}\n\t\t\tscrubTween && scrubTween.pause();\n\t\t\tinvalidateOnRefresh && animation && animation.revert({kill: false}).invalidate();\n\t\t\tself.isReverted || self.revert(true, true);\n\t\t\tself._subPinOffset = false; // we'll set this to true in the sub-pins if we find any\n\t\t\tlet size = getScrollerSize(),\n\t\t\t\tscrollerBounds = getScrollerOffsets(),\n\t\t\t\tmax = containerAnimation ? containerAnimation.duration() : _maxScroll(scroller, direction),\n\t\t\t\tisFirstRefresh = change <= 0.01,\n\t\t\t\toffset = 0,\n\t\t\t\totherPinOffset = pinOffset || 0,\n\t\t\t\tparsedEnd = _isObject(position) ? position.end : vars.end,\n\t\t\t\tparsedEndTrigger = vars.endTrigger || trigger,\n\t\t\t\tparsedStart = _isObject(position) ? position.start : (vars.start || (vars.start === 0 || !trigger ? 0 : (pin ? \"0 0\" : \"0 100%\"))),\n\t\t\t\tpinnedContainer = self.pinnedContainer = vars.pinnedContainer && _getTarget(vars.pinnedContainer, self),\n\t\t\t\ttriggerIndex = (trigger && Math.max(0, _triggers.indexOf(self))) || 0,\n\t\t\t\ti = triggerIndex,\n\t\t\t\tcs, bounds, scroll, isVertical, override, curTrigger, curPin, oppositeScroll, initted, revertedPins, forcedOverflow, markerStartOffset, markerEndOffset;\n\t\t\tif (markers && _isObject(position)) { // if we alter the start/end positions with .setPositions(), it generally feeds in absolute NUMBERS which don't convey information about where to line up the markers, so to keep it intuitive, we record how far the trigger positions shift after applying the new numbers and then offset by that much in the opposite direction. We do the same to the associated trigger markers too of course.\n\t\t\t\tmarkerStartOffset = gsap.getProperty(markerStartTrigger, direction.p);\n\t\t\t\tmarkerEndOffset = gsap.getProperty(markerEndTrigger, direction.p);\n\t\t\t}\n\t\t\twhile (i--) { // user might try to pin the same element more than once, so we must find any prior triggers with the same pin, revert them, and determine how long they're pinning so that we can offset things appropriately. Make sure we revert from last to first so that things \"rewind\" properly.\n\t\t\t\tcurTrigger = _triggers[i];\n\t\t\t\tcurTrigger.end || curTrigger.refresh(0, 1) || (_refreshing = self); // if it's a timeline-based trigger that hasn't been fully initialized yet because it's waiting for 1 tick, just force the refresh() here, otherwise if it contains a pin that's supposed to affect other ScrollTriggers further down the page, they won't be adjusted properly.\n\t\t\t\tcurPin = curTrigger.pin;\n\t\t\t\tif (curPin && (curPin === trigger || curPin === pin || curPin === pinnedContainer) && !curTrigger.isReverted) {\n\t\t\t\t\trevertedPins || (revertedPins = []);\n\t\t\t\t\trevertedPins.unshift(curTrigger); // we'll revert from first to last to make sure things reach their end state properly\n\t\t\t\t\tcurTrigger.revert(true, true);\n\t\t\t\t}\n\t\t\t\tif (curTrigger !== _triggers[i]) { // in case it got removed.\n\t\t\t\t\ttriggerIndex--;\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t_isFunction(parsedStart) && (parsedStart = parsedStart(self));\n\t\t\tparsedStart = _parseClamp(parsedStart, \"start\", self);\n\t\t\tstart = _parsePosition(parsedStart, trigger, size, direction, scrollFunc(), markerStart, markerStartTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._startClamp && \"_startClamp\") || (pin ? -0.001 : 0);\n\t\t\t_isFunction(parsedEnd) && (parsedEnd = parsedEnd(self));\n\t\t\tif (_isString(parsedEnd) && !parsedEnd.indexOf(\"+=\")) {\n\t\t\t\tif (~parsedEnd.indexOf(\" \")) {\n\t\t\t\t\tparsedEnd = (_isString(parsedStart) ? parsedStart.split(\" \")[0] : \"\") + parsedEnd;\n\t\t\t\t} else {\n\t\t\t\t\toffset = _offsetToPx(parsedEnd.substr(2), size);\n\t\t\t\t\tparsedEnd = _isString(parsedStart) ? parsedStart : (containerAnimation ? gsap.utils.mapRange(0, containerAnimation.duration(), containerAnimation.scrollTrigger.start, containerAnimation.scrollTrigger.end, start) : start) + offset; // _parsePosition won't factor in the offset if the start is a number, so do it here.\n\t\t\t\t\tparsedEndTrigger = trigger;\n\t\t\t\t}\n\t\t\t}\n\t\t\tparsedEnd = _parseClamp(parsedEnd, \"end\", self);\n\t\t\tend = Math.max(start, _parsePosition(parsedEnd || (parsedEndTrigger ? \"100% 0\" : max), parsedEndTrigger, size, direction, scrollFunc() + offset, markerEnd, markerEndTrigger, self, scrollerBounds, borderWidth, useFixedPosition, max, containerAnimation, self._endClamp && \"_endClamp\")) || -0.001;\n\n\t\t\toffset = 0;\n\t\t\ti = triggerIndex;\n\t\t\twhile (i--) {\n\t\t\t\tcurTrigger = _triggers[i];\n\t\t\t\tcurPin = curTrigger.pin;\n\t\t\t\tif (curPin && curTrigger.start - curTrigger._pinPush <= start && !containerAnimation && curTrigger.end > 0) {\n\t\t\t\t\tcs = curTrigger.end - (self._startClamp ? Math.max(0, curTrigger.start) : curTrigger.start);\n\t\t\t\t\tif (((curPin === trigger && curTrigger.start - curTrigger._pinPush < start) || curPin === pinnedContainer) && isNaN(parsedStart)) { // numeric start values shouldn't be offset at all - treat them as absolute\n\t\t\t\t\t\toffset += cs * (1 - curTrigger.progress);\n\t\t\t\t\t}\n\t\t\t\t\tcurPin === pin && (otherPinOffset += cs);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstart += offset;\n\t\t\tend += offset;\n\t\t\tself._startClamp && (self._startClamp += offset);\n\n\t\t\tif (self._endClamp && !_refreshingAll) {\n\t\t\t\tself._endClamp = end || -0.001;\n\t\t\t\tend = Math.min(end, _maxScroll(scroller, direction));\n\t\t\t}\n\t\t\tchange = (end - start) || ((start -= 0.01) && 0.001);\n\n\t\t\tif (isFirstRefresh) { // on the very first refresh(), the prevProgress couldn't have been accurate yet because the start/end were never calculated, so we set it here. Before 3.11.5, it could lead to an inaccurate scroll position restoration with snapping.\n\t\t\t\tprevProgress = gsap.utils.clamp(0, 1, gsap.utils.normalize(start, end, prevScroll));\n\t\t\t}\n\t\t\tself._pinPush = otherPinOffset;\n\t\t\tif (markerStart && offset) { // offset the markers if necessary\n\t\t\t\tcs = {};\n\t\t\t\tcs[direction.a] = \"+=\" + offset;\n\t\t\t\tpinnedContainer && (cs[direction.p] = \"-=\" + scrollFunc());\n\t\t\t\tgsap.set([markerStart, markerEnd], cs);\n\t\t\t}\n\n\t\t\tif (pin) {\n\t\t\t\tcs = _getComputedStyle(pin);\n\t\t\t\tisVertical = direction === _vertical;\n\t\t\t\tscroll = scrollFunc(); // recalculate because the triggers can affect the scroll\n\t\t\t\tpinStart = parseFloat(pinGetter(direction.a)) + otherPinOffset;\n\t\t\t\tif (!max && end > 1) { // makes sure the scroller has a scrollbar, otherwise if something has width: 100%, for example, it would be too big (exclude the scrollbar). See https://greensock.com/forums/topic/25182-scrolltrigger-width-of-page-increase-where-markers-are-set-to-false/\n\t\t\t\t\tforcedOverflow = (isViewport ? (_doc.scrollingElement || _docEl) : scroller).style;\n\t\t\t\t\tforcedOverflow = {style: forcedOverflow, value: forcedOverflow[\"overflow\" + direction.a.toUpperCase()]};\n\t\t\t\t\tif (isViewport && _getComputedStyle(_body)[\"overflow\" + direction.a.toUpperCase()] !== \"scroll\") { // avoid an extra scrollbar if BOTH and have overflow set to \"scroll\"\n\t\t\t\t\t\tforcedOverflow.style[\"overflow\" + direction.a.toUpperCase()] = \"scroll\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t_swapPinIn(pin, spacer, cs);\n\t\t\t\tpinState = _getState(pin);\n\t\t\t\t// transforms will interfere with the top/left/right/bottom placement, so remove them temporarily. getBoundingClientRect() factors in transforms.\n\t\t\t\tbounds = _getBounds(pin, true);\n\t\t\t\toppositeScroll = useFixedPosition && _getScrollFunc(scroller, isVertical ? _horizontal : _vertical)();\n\t\t\t\tif (pinSpacing) {\n\t\t\t\t\tspacerState = [pinSpacing + direction.os2, change + otherPinOffset + _px];\n\t\t\t\t\tspacerState.t = spacer;\n\t\t\t\t\ti = (pinSpacing === _padding) ? _getSize(pin, direction) + change + otherPinOffset : 0;\n\t\t\t\t\ti && spacerState.push(direction.d, i + _px); // for box-sizing: border-box (must include padding).\n\t\t\t\t\t_setState(spacerState);\n\t\t\t\t\tif (pinnedContainer) { // in ScrollTrigger.refresh(), we need to re-evaluate the pinContainer's size because this pinSpacing may stretch it out, but we can't just add the exact distance because depending on layout, it may not push things down or it may only do so partially.\n\t\t\t\t\t\t_triggers.forEach(t => {\n\t\t\t\t\t\t\tif (t.pin === pinnedContainer && t.vars.pinSpacing !== false) {\n\t\t\t\t\t\t\t\tt._subPinOffset = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tuseFixedPosition && scrollFunc(prevScroll);\n\t\t\t\t}\n\t\t\t\tif (useFixedPosition) {\n\t\t\t\t\toverride = {\n\t\t\t\t\t\ttop: (bounds.top + (isVertical ? scroll - start : oppositeScroll)) + _px,\n\t\t\t\t\t\tleft: (bounds.left + (isVertical ? oppositeScroll : scroll - start)) + _px,\n\t\t\t\t\t\tboxSizing: \"border-box\",\n\t\t\t\t\t\tposition: \"fixed\"\n\t\t\t\t\t};\n\t\t\t\t\toverride[_width] = override[\"max\" + _Width] = Math.ceil(bounds.width) + _px;\n\t\t\t\t\toverride[_height] = override[\"max\" + _Height] = Math.ceil(bounds.height) + _px;\n\t\t\t\t\toverride[_margin] = override[_margin + _Top] = override[_margin + _Right] = override[_margin + _Bottom] = override[_margin + _Left] = \"0\";\n\t\t\t\t\toverride[_padding] = cs[_padding];\n\t\t\t\t\toverride[_padding + _Top] = cs[_padding + _Top];\n\t\t\t\t\toverride[_padding + _Right] = cs[_padding + _Right];\n\t\t\t\t\toverride[_padding + _Bottom] = cs[_padding + _Bottom];\n\t\t\t\t\toverride[_padding + _Left] = cs[_padding + _Left];\n\t\t\t\t\tpinActiveState = _copyState(pinOriginalState, override, pinReparent);\n\t\t\t\t\t_refreshingAll && scrollFunc(0);\n\t\t\t\t}\n\t\t\t\tif (animation) { // the animation might be affecting the transform, so we must jump to the end, check the value, and compensate accordingly. Otherwise, when it becomes unpinned, the pinSetter() will get set to a value that doesn't include whatever the animation did.\n\t\t\t\t\tinitted = animation._initted; // if not, we must invalidate() after this step, otherwise it could lock in starting values prematurely.\n\t\t\t\t\t_suppressOverwrites(1);\n\t\t\t\t\tanimation.render(animation.duration(), true, true);\n\t\t\t\t\tpinChange = pinGetter(direction.a) - pinStart + change + otherPinOffset;\n\t\t\t\t\tpinMoves = Math.abs(change - pinChange) > 1;\n\t\t\t\t\tuseFixedPosition && pinMoves && pinActiveState.splice(pinActiveState.length - 2, 2); // transform is the last property/value set in the state Array. Since the animation is controlling that, we should omit it.\n\t\t\t\t\tanimation.render(0, true, true);\n\t\t\t\t\tinitted || animation.invalidate(true);\n\t\t\t\t\tanimation.parent || animation.totalTime(animation.totalTime()); // if, for example, a toggleAction called play() and then refresh() happens and when we render(1) above, it would cause the animation to complete and get removed from its parent, so this makes sure it gets put back in.\n\t\t\t\t\t_suppressOverwrites(0);\n\t\t\t\t} else {\n\t\t\t\t\tpinChange = change\n\t\t\t\t}\n\t\t\t\tforcedOverflow && (forcedOverflow.value ? (forcedOverflow.style[\"overflow\" + direction.a.toUpperCase()] = forcedOverflow.value) : forcedOverflow.style.removeProperty(\"overflow-\" + direction.a));\n\t\t\t} else if (trigger && scrollFunc() && !containerAnimation) { // it may be INSIDE a pinned element, so walk up the tree and look for any elements with _pinOffset to compensate because anything with pinSpacing that's already scrolled would throw off the measurements in getBoundingClientRect()\n\t\t\t\tbounds = trigger.parentNode;\n\t\t\t\twhile (bounds && bounds !== _body) {\n\t\t\t\t\tif (bounds._pinOffset) {\n\t\t\t\t\t\tstart -= bounds._pinOffset;\n\t\t\t\t\t\tend -= bounds._pinOffset;\n\t\t\t\t\t}\n\t\t\t\t\tbounds = bounds.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t\trevertedPins && revertedPins.forEach(t => t.revert(false, true));\n\t\t\tself.start = start;\n\t\t\tself.end = end;\n\t\t\tscroll1 = scroll2 = _refreshingAll ? prevScroll : scrollFunc(); // reset velocity\n\t\t\tif (!containerAnimation && !_refreshingAll) {\n\t\t\t\tscroll1 < prevScroll && scrollFunc(prevScroll);\n\t\t\t\tself.scroll.rec = 0;\n\t\t\t}\n\t\t\tself.revert(false, true);\n\t\t\tlastRefresh = _getTime();\n\t\t\tif (snapDelayedCall) {\n\t\t\t\tlastSnap = -1;\n\t\t\t\tself.isActive && scrollFunc(start + change * prevProgress); // just so snapping gets re-enabled, clear out any recorded last value\n\t\t\t\tsnapDelayedCall.restart(true);\n\t\t\t}\n\t\t\t_refreshing = 0;\n\t\t\tanimation && isToggle && (animation._initted || prevAnimProgress) && animation.progress() !== prevAnimProgress && animation.progress(prevAnimProgress || 0, true).render(animation.time(), true, true); // must force a re-render because if saveStyles() was used on the target(s), the styles could have been wiped out during the refresh().\n\t\t\tif (isFirstRefresh || prevProgress !== self.progress || containerAnimation) { // ensures that the direction is set properly (when refreshing, progress is set back to 0 initially, then back again to wherever it needs to be) and that callbacks are triggered.\n\t\t\t\tanimation && !isToggle && animation.totalProgress(containerAnimation && start < -0.001 && !prevProgress ? gsap.utils.normalize(start, end, 0) : prevProgress, true); // to avoid issues where animation callbacks like onStart aren't triggered.\n\t\t\t\tself.progress = isFirstRefresh || ((scroll1 - start) / change === prevProgress) ? 0 : prevProgress;\n\t\t\t}\n\t\t\tpin && pinSpacing && (spacer._pinOffset = Math.round(self.progress * pinChange));\n\t\t\tscrubTween && scrubTween.invalidate();\n\n\t\t\tif (!isNaN(markerStartOffset)) { // numbers were passed in for the position which are absolute, so instead of just putting the markers at the very bottom of the viewport, we figure out how far they shifted down (it's safe to assume they were originally positioned in closer relation to the trigger element with values like \"top\", \"center\", a percentage or whatever, so we offset that much in the opposite direction to basically revert them to the relative position thy were at previously.\n\t\t\t\tmarkerStartOffset -= gsap.getProperty(markerStartTrigger, direction.p);\n\t\t\t\tmarkerEndOffset -= gsap.getProperty(markerEndTrigger, direction.p);\n\t\t\t\t_shiftMarker(markerStartTrigger, direction, markerStartOffset);\n\t\t\t\t_shiftMarker(markerStart, direction, markerStartOffset - (pinOffset || 0));\n\t\t\t\t_shiftMarker(markerEndTrigger, direction, markerEndOffset);\n\t\t\t\t_shiftMarker(markerEnd, direction, markerEndOffset - (pinOffset || 0));\n\t\t\t}\n\n\t\t\tisFirstRefresh && !_refreshingAll && self.update(); // edge case - when you reload a page when it's already scrolled down, some browsers fire a \"scroll\" event before DOMContentLoaded, triggering an updateAll(). If we don't update the self.progress as part of refresh(), then when it happens next, it may record prevProgress as 0 when it really shouldn't, potentially causing a callback in an animation to fire again.\n\n\t\t\tif (onRefresh && !_refreshingAll && !executingOnRefresh) { // when refreshing all, we do extra work to correct pinnedContainer sizes and ensure things don't exceed the maxScroll, so we should do all the refreshes at the end after all that work so that the start/end values are corrected.\n\t\t\t\texecutingOnRefresh = true;\n\t\t\t\tonRefresh(self);\n\t\t\t\texecutingOnRefresh = false;\n\t\t\t}\n\t\t};\n\n\t\tself.getVelocity = () => ((scrollFunc() - scroll2) / (_getTime() - _time2) * 1000) || 0;\n\n\t\tself.endAnimation = () => {\n\t\t\t_endAnimation(self.callbackAnimation);\n\t\t\tif (animation) {\n\t\t\t\tscrubTween ? scrubTween.progress(1) : (!animation.paused() ? _endAnimation(animation, animation.reversed()) : isToggle || _endAnimation(animation, self.direction < 0, 1));\n\t\t\t}\n\t\t};\n\n\t\tself.labelToScroll = label => animation && animation.labels && ((start || self.refresh() || start) + (animation.labels[label] / animation.duration()) * change) || 0;\n\n\t\tself.getTrailing = name => {\n\t\t\tlet i = _triggers.indexOf(self),\n\t\t\t\ta = self.direction > 0 ? _triggers.slice(0, i).reverse() : _triggers.slice(i+1);\n\t\t\treturn (_isString(name) ? a.filter(t => t.vars.preventOverlaps === name) : a).filter(t => self.direction > 0 ? t.end <= start : t.start >= end);\n\t\t};\n\n\n\t\tself.update = (reset, recordVelocity, forceFake) => {\n\t\t\tif (containerAnimation && !forceFake && !reset) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet scroll = _refreshingAll === true ? prevScroll : self.scroll(),\n\t\t\t\tp = reset ? 0 : (scroll - start) / change,\n\t\t\t\tclipped = p < 0 ? 0 : p > 1 ? 1 : p || 0,\n\t\t\t\tprevProgress = self.progress,\n\t\t\t\tisActive, wasActive, toggleState, action, stateChanged, toggled, isAtMax, isTakingAction;\n\t\t\tif (recordVelocity) {\n\t\t\t\tscroll2 = scroll1;\n\t\t\t\tscroll1 = containerAnimation ? scrollFunc() : scroll;\n\t\t\t\tif (snap) {\n\t\t\t\t\tsnap2 = snap1;\n\t\t\t\t\tsnap1 = animation && !isToggle ? animation.totalProgress() : clipped;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// anticipate the pinning a few ticks ahead of time based on velocity to avoid a visual glitch due to the fact that most browsers do scrolling on a separate thread (not synced with requestAnimationFrame).\n\t\t\t(anticipatePin && !clipped && pin && !_refreshing && !_startup && _lastScrollTime && start < scroll + ((scroll - scroll2) / (_getTime() - _time2)) * anticipatePin) && (clipped = 0.0001);\n\t\t\tif (clipped !== prevProgress && self.enabled) {\n\t\t\t\tisActive = self.isActive = !!clipped && clipped < 1;\n\t\t\t\twasActive = !!prevProgress && prevProgress < 1;\n\t\t\t\ttoggled = isActive !== wasActive;\n\t\t\t\tstateChanged = toggled || !!clipped !== !!prevProgress; // could go from start all the way to end, thus it didn't toggle but it did change state in a sense (may need to fire a callback)\n\t\t\t\tself.direction = clipped > prevProgress ? 1 : -1;\n\t\t\t\tself.progress = clipped;\n\n\t\t\t\tif (stateChanged && !_refreshing) {\n\t\t\t\t\ttoggleState = clipped && !prevProgress ? 0 : clipped === 1 ? 1 : prevProgress === 1 ? 2 : 3; // 0 = enter, 1 = leave, 2 = enterBack, 3 = leaveBack (we prioritize the FIRST encounter, thus if you scroll really fast past the onEnter and onLeave in one tick, it'd prioritize onEnter.\n\t\t\t\t\tif (isToggle) {\n\t\t\t\t\t\taction = (!toggled && toggleActions[toggleState + 1] !== \"none\" && toggleActions[toggleState + 1]) || toggleActions[toggleState]; // if it didn't toggle, that means it shot right past and since we prioritize the \"enter\" action, we should switch to the \"leave\" in this case (but only if one is defined)\n\t\t\t\t\t\tisTakingAction = animation && (action === \"complete\" || action === \"reset\" || action in animation);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpreventOverlaps && (toggled || isTakingAction) && (isTakingAction || scrub || !animation) && (_isFunction(preventOverlaps) ? preventOverlaps(self) : self.getTrailing(preventOverlaps).forEach(t => t.endAnimation()));\n\n\t\t\t\tif (!isToggle) {\n\t\t\t\t\tif (scrubTween && !_refreshing && !_startup) {\n\t\t\t\t\t\t(scrubTween._dp._time - scrubTween._start !== scrubTween._time) && scrubTween.render(scrubTween._dp._time - scrubTween._start); // if there's a scrub on both the container animation and this one (or a ScrollSmoother), the update order would cause this one not to have rendered yet, so it wouldn't make any progress before we .restart() it heading toward the new progress so it'd appear stuck thus we force a render here.\n\t\t\t\t\t\tif (scrubTween.resetTo) {\n\t\t\t\t\t\t\tscrubTween.resetTo(\"totalProgress\", clipped, animation._tTime / animation._tDur);\n\t\t\t\t\t\t} else { // legacy support (courtesy), before 3.10.0\n\t\t\t\t\t\t\tscrubTween.vars.totalProgress = clipped;\n\t\t\t\t\t\t\tscrubTween.invalidate().restart();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (animation) {\n\t\t\t\t\t\tanimation.totalProgress(clipped, !!(_refreshing && (lastRefresh || reset)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pin) {\n\t\t\t\t\treset && pinSpacing && (spacer.style[pinSpacing + direction.os2] = spacingStart);\n\t\t\t\t\tif (!useFixedPosition) {\n\t\t\t\t\t\tpinSetter(_round(pinStart + pinChange * clipped));\n\t\t\t\t\t} else if (stateChanged) {\n\t\t\t\t\t\tisAtMax = !reset && clipped > prevProgress && end + 1 > scroll && scroll + 1 >= _maxScroll(scroller, direction); // if it's at the VERY end of the page, don't switch away from position: fixed because it's pointless and it could cause a brief flash when the user scrolls back up (when it gets pinned again)\n\t\t\t\t\t\tif (pinReparent) {\n\t\t\t\t\t\t\tif (!reset && (isActive || isAtMax)) {\n\t\t\t\t\t\t\t\tlet bounds = _getBounds(pin, true),\n\t\t\t\t\t\t\t\t\toffset = scroll - start;\n\t\t\t\t\t\t\t\t_reparent(pin, _body, (bounds.top + (direction === _vertical ? offset : 0)) + _px, (bounds.left + (direction === _vertical ? 0 : offset)) + _px);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t_reparent(pin, spacer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_setState(isActive || isAtMax ? pinActiveState : pinState);\n\t\t\t\t\t\t(pinMoves && clipped < 1 && isActive) || pinSetter(pinStart + (clipped === 1 && !isAtMax ? pinChange : 0));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsnap && !tweenTo.tween && !_refreshing && !_startup && snapDelayedCall.restart(true);\n\t\t\t\ttoggleClass && (toggled || (once && clipped && (clipped < 1 || !_limitCallbacks))) && _toArray(toggleClass.targets).forEach(el => el.classList[isActive || once ? \"add\" : \"remove\"](toggleClass.className)); // classes could affect positioning, so do it even if reset or refreshing is true.\n\t\t\t\tonUpdate && !isToggle && !reset && onUpdate(self);\n\t\t\t\tif (stateChanged && !_refreshing) {\n\t\t\t\t\tif (isToggle) {\n\t\t\t\t\t\tif (isTakingAction) {\n\t\t\t\t\t\t\tif (action === \"complete\") {\n\t\t\t\t\t\t\t\tanimation.pause().totalProgress(1);\n\t\t\t\t\t\t\t} else if (action === \"reset\") {\n\t\t\t\t\t\t\t\tanimation.restart(true).pause();\n\t\t\t\t\t\t\t} else if (action === \"restart\") {\n\t\t\t\t\t\t\t\tanimation.restart(true);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tanimation[action]();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tonUpdate && onUpdate(self);\n\t\t\t\t\t}\n\t\t\t\t\tif (toggled || !_limitCallbacks) { // on startup, the page could be scrolled and we don't want to fire callbacks that didn't toggle. For example onEnter shouldn't fire if the ScrollTrigger isn't actually entered.\n\t\t\t\t\t\tonToggle && toggled && _callback(self, onToggle);\n\t\t\t\t\t\tcallbacks[toggleState] && _callback(self, callbacks[toggleState]);\n\t\t\t\t\t\tonce && (clipped === 1 ? self.kill(false, 1) : (callbacks[toggleState] = 0)); // a callback shouldn't be called again if once is true.\n\t\t\t\t\t\tif (!toggled) { // it's possible to go completely past, like from before the start to after the end (or vice-versa) in which case BOTH callbacks should be fired in that order\n\t\t\t\t\t\t\ttoggleState = clipped === 1 ? 1 : 3;\n\t\t\t\t\t\t\tcallbacks[toggleState] && _callback(self, callbacks[toggleState]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (fastScrollEnd && !isActive && Math.abs(self.getVelocity()) > (_isNumber(fastScrollEnd) ? fastScrollEnd : 2500)) {\n\t\t\t\t\t\t_endAnimation(self.callbackAnimation);\n\t\t\t\t\t\tscrubTween ? scrubTween.progress(1) : _endAnimation(animation, action === \"reverse\" ? 1 : !clipped, 1);\n\t\t\t\t\t}\n\t\t\t\t} else if (isToggle && onUpdate && !_refreshing) {\n\t\t\t\t\tonUpdate(self);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// update absolutely-positioned markers (only if the scroller isn't the viewport)\n\t\t\tif (markerEndSetter) {\n\t\t\t\tlet n = containerAnimation ? scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0) : scroll;\n\t\t\t\tmarkerStartSetter(n + (markerStartTrigger._isFlipped ? 1 : 0));\n\t\t\t\tmarkerEndSetter(n);\n\t\t\t}\n\t\t\tcaMarkerSetter && caMarkerSetter(-scroll / containerAnimation.duration() * (containerAnimation._caScrollDist || 0));\n\t\t};\n\n\t\tself.enable = (reset, refresh) => {\n\t\t\tif (!self.enabled) {\n\t\t\t\tself.enabled = true;\n\t\t\t\t_addListener(scroller, \"resize\", _onResize);\n\t\t\t\t_addListener(isViewport ? _doc : scroller, \"scroll\", _onScroll);\n\t\t\t\tonRefreshInit && _addListener(ScrollTrigger, \"refreshInit\", onRefreshInit);\n\t\t\t\tif (reset !== false) {\n\t\t\t\t\tself.progress = prevProgress = 0;\n\t\t\t\t\tscroll1 = scroll2 = lastSnap = scrollFunc();\n\t\t\t\t}\n\t\t\t\trefresh !== false && self.refresh();\n\t\t\t}\n\t\t};\n\n\t\tself.getTween = snap => snap && tweenTo ? tweenTo.tween : scrubTween;\n\n\t\tself.setPositions = (newStart, newEnd, keepClamp, pinOffset) => { // doesn't persist after refresh()! Intended to be a way to override values that were set during refresh(), like you could set it in onRefresh()\n\t\t\tif (containerAnimation) { // convert ratios into scroll positions. Remember, start/end values on ScrollTriggers that have a containerAnimation refer to the time (in seconds), NOT scroll positions.\n\t\t\t\tlet st = containerAnimation.scrollTrigger,\n\t\t\t\t\tduration = containerAnimation.duration(),\n\t\t\t\t\tchange = st.end - st.start;\n\t\t\t\tnewStart = st.start + change * newStart / duration;\n\t\t\t\tnewEnd = st.start + change * newEnd / duration;\n\t\t\t}\n\t\t\tself.refresh(false, false, {start: _keepClamp(newStart, keepClamp && !!self._startClamp), end: _keepClamp(newEnd, keepClamp && !!self._endClamp)}, pinOffset);\n\t\t\tself.update();\n\t\t};\n\n\t\tself.adjustPinSpacing = amount => {\n\t\t\tif (spacerState && amount) {\n\t\t\t\tlet i = spacerState.indexOf(direction.d) + 1;\n\t\t\t\tspacerState[i] = (parseFloat(spacerState[i]) + amount) + _px;\n\t\t\t\tspacerState[1] = (parseFloat(spacerState[1]) + amount) + _px;\n\t\t\t\t_setState(spacerState);\n\t\t\t}\n\t\t};\n\n\t\tself.disable = (reset, allowAnimation) => {\n\t\t\tif (self.enabled) {\n\t\t\t\treset !== false && self.revert(true, true);\n\t\t\t\tself.enabled = self.isActive = false;\n\t\t\t\tallowAnimation || (scrubTween && scrubTween.pause());\n\t\t\t\tprevScroll = 0;\n\t\t\t\tpinCache && (pinCache.uncache = 1);\n\t\t\t\tonRefreshInit && _removeListener(ScrollTrigger, \"refreshInit\", onRefreshInit);\n\t\t\t\tif (snapDelayedCall) {\n\t\t\t\t\tsnapDelayedCall.pause();\n\t\t\t\t\ttweenTo.tween && tweenTo.tween.kill() && (tweenTo.tween = 0);\n\t\t\t\t}\n\t\t\t\tif (!isViewport) {\n\t\t\t\t\tlet i = _triggers.length;\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tif (_triggers[i].scroller === scroller && _triggers[i] !== self) {\n\t\t\t\t\t\t\treturn; //don't remove the listeners if there are still other triggers referencing it.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_removeListener(scroller, \"resize\", _onResize);\n\t\t\t\t\t_removeListener(scroller, \"scroll\", _onScroll);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tself.kill = (revert, allowAnimation) => {\n\t\t\tself.disable(revert, allowAnimation);\n\t\t\tscrubTween && !allowAnimation && scrubTween.kill();\n\t\t\tid && (delete _ids[id]);\n\t\t\tlet i = _triggers.indexOf(self);\n\t\t\ti >= 0 && _triggers.splice(i, 1);\n\t\t\ti === _i && _direction > 0 && _i--; // if we're in the middle of a refresh() or update(), splicing would cause skips in the index, so adjust...\n\n\t\t\t// if no other ScrollTrigger instances of the same scroller are found, wipe out any recorded scroll position. Otherwise, in a single page application, for example, it could maintain scroll position when it really shouldn't.\n\t\t\ti = 0;\n\t\t\t_triggers.forEach(t => t.scroller === self.scroller && (i = 1));\n\t\t\ti || _refreshingAll || (self.scroll.rec = 0);\n\n\t\t\tif (animation) {\n\t\t\t\tanimation.scrollTrigger = null;\n\t\t\t\trevert && animation.revert({kill: false});\n\t\t\t\tallowAnimation || animation.kill();\n\t\t\t}\n\t\t\tmarkerStart && [markerStart, markerEnd, markerStartTrigger, markerEndTrigger].forEach(m => m.parentNode && m.parentNode.removeChild(m));\n\t\t\t_primary === self && (_primary = 0);\n\t\t\tif (pin) {\n\t\t\t\tpinCache && (pinCache.uncache = 1);\n\t\t\t\ti = 0;\n\t\t\t\t_triggers.forEach(t => t.pin === pin && i++);\n\t\t\t\ti || (pinCache.spacer = 0); // if there aren't any more ScrollTriggers with the same pin, remove the spacer, otherwise it could be contaminated with old/stale values if the user re-creates a ScrollTrigger for the same element.\n\t\t\t}\n\t\t\tvars.onKill && vars.onKill(self);\n\t\t};\n\n\t\t_triggers.push(self);\n\t\tself.enable(false, false);\n\t\tcustomRevertReturn && customRevertReturn(self);\n\n\t\tif (animation && animation.add && !change) { // if the animation is a timeline, it may not have been populated yet, so it wouldn't render at the proper place on the first refresh(), thus we should schedule one for the next tick. If \"change\" is defined, we know it must be re-enabling, thus we can refresh() right away.\n\t\t\tlet updateFunc = self.update; // some browsers may fire a scroll event BEFORE a tick elapses and/or the DOMContentLoaded fires. So there's a chance update() will be called BEFORE a refresh() has happened on a Timeline-attached ScrollTrigger which means the start/end won't be calculated yet. We don't want to add conditional logic inside the update() method (like check to see if end is defined and if not, force a refresh()) because that's a function that gets hit a LOT (performance). So we swap out the real update() method for this one that'll re-attach it the first time it gets called and of course forces a refresh().\n\t\t\tself.update = () => {\n\t\t\t\tself.update = updateFunc;\n\t\t\t\tstart || end || self.refresh();\n\t\t\t};\n\t\t\tgsap.delayedCall(0.01, self.update);\n\t\t\tchange = 0.01;\n\t\t\tstart = end = 0;\n\t\t} else {\n\t\t\tself.refresh();\n\t\t}\n\t\tpin && _queueRefreshAll(); // pinning could affect the positions of other things, so make sure we queue a full refresh()\n\t}\n\n\n\tstatic register(core) {\n\t\tif (!_coreInitted) {\n\t\t\tgsap = core || _getGSAP();\n\t\t\t_windowExists() && window.document && ScrollTrigger.enable();\n\t\t\t_coreInitted = _enabled;\n\t\t}\n\t\treturn _coreInitted;\n\t}\n\n\tstatic defaults(config) {\n\t\tif (config) {\n\t\t\tfor (let p in config) {\n\t\t\t\t_defaults[p] = config[p];\n\t\t\t}\n\t\t}\n\t\treturn _defaults;\n\t}\n\n\tstatic disable(reset, kill) {\n\t\t_enabled = 0;\n\t\t_triggers.forEach(trigger => trigger[kill ? \"kill\" : \"disable\"](reset));\n\t\t_removeListener(_win, \"wheel\", _onScroll);\n\t\t_removeListener(_doc, \"scroll\", _onScroll);\n\t\tclearInterval(_syncInterval);\n\t\t_removeListener(_doc, \"touchcancel\", _passThrough);\n\t\t_removeListener(_body, \"touchstart\", _passThrough);\n\t\t_multiListener(_removeListener, _doc, \"pointerdown,touchstart,mousedown\", _pointerDownHandler);\n\t\t_multiListener(_removeListener, _doc, \"pointerup,touchend,mouseup\", _pointerUpHandler);\n\t\t_resizeDelay.kill();\n\t\t_iterateAutoRefresh(_removeListener);\n\t\tfor (let i = 0; i < _scrollers.length; i+=3) {\n\t\t\t_wheelListener(_removeListener, _scrollers[i], _scrollers[i+1]);\n\t\t\t_wheelListener(_removeListener, _scrollers[i], _scrollers[i+2]);\n\t\t}\n\t}\n\n\tstatic enable() {\n\t\t_win = window;\n\t\t_doc = document;\n\t\t_docEl = _doc.documentElement;\n\t\t_body = _doc.body;\n\t\tif (gsap) {\n\t\t\t_toArray = gsap.utils.toArray;\n\t\t\t_clamp = gsap.utils.clamp;\n\t\t\t_context = gsap.core.context || _passThrough;\n\t\t\t_suppressOverwrites = gsap.core.suppressOverwrites || _passThrough;\n\t\t\t_scrollRestoration = _win.history.scrollRestoration || \"auto\";\n\t\t\t_lastScroll = _win.pageYOffset;\n\t\t\tgsap.core.globals(\"ScrollTrigger\", ScrollTrigger); // must register the global manually because in Internet Explorer, functions (classes) don't have a \"name\" property.\n\t\t\tif (_body) {\n\t\t\t\t_enabled = 1;\n\t\t\t\t_rafBugFix();\n\t\t\t\tObserver.register(gsap);\n\t\t\t\t// isTouch is 0 if no touch, 1 if ONLY touch, and 2 if it can accommodate touch but also other types like mouse/pointer.\n\t\t\t\tScrollTrigger.isTouch = Observer.isTouch;\n\t\t\t\t_fixIOSBug = Observer.isTouch && /(iPad|iPhone|iPod|Mac)/g.test(navigator.userAgent); // since 2017, iOS has had a bug that causes event.clientX/Y to be inaccurate when a scroll occurs, thus we must alternate ignoring every other touchmove event to work around it. See https://bugs.webkit.org/show_bug.cgi?id=181954 and https://codepen.io/GreenSock/pen/ExbrPNa/087cef197dc35445a0951e8935c41503\n\t\t\t\t_addListener(_win, \"wheel\", _onScroll); // mostly for 3rd party smooth scrolling libraries.\n\t\t\t\t_root = [_win, _doc, _docEl, _body];\n\t\t\t\tif (gsap.matchMedia) {\n\t\t\t\t\tScrollTrigger.matchMedia = vars => {\n\t\t\t\t\t\tlet mm = gsap.matchMedia(),\n\t\t\t\t\t\t\tp;\n\t\t\t\t\t\tfor (p in vars) {\n\t\t\t\t\t\t\tmm.add(p, vars[p]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn mm;\n\t\t\t\t\t};\n\t\t\t\t\tgsap.addEventListener(\"matchMediaInit\", () => _revertAll());\n\t\t\t\t\tgsap.addEventListener(\"matchMediaRevert\", () => _revertRecorded());\n\t\t\t\t\tgsap.addEventListener(\"matchMedia\", () => {\n\t\t\t\t\t\t_refreshAll(0, 1);\n\t\t\t\t\t\t_dispatch(\"matchMedia\");\n\t\t\t\t\t});\n\t\t\t\t\tgsap.matchMedia(\"(orientation: portrait)\", () => { // when orientation changes, we should take new base measurements for the ignoreMobileResize feature.\n\t\t\t\t\t\t_setBaseDimensions();\n\t\t\t\t\t\treturn _setBaseDimensions;\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\"Requires GSAP 3.11.0 or later\");\n\t\t\t\t}\n\t\t\t\t_setBaseDimensions();\n\t\t\t\t_addListener(_doc, \"scroll\", _onScroll); // some browsers (like Chrome), the window stops dispatching scroll events on the window if you scroll really fast, but it's consistent on the document!\n\t\t\t\tlet bodyStyle = _body.style,\n\t\t\t\t\tborder = bodyStyle.borderTopStyle,\n\t\t\t\t\tAnimationProto = gsap.core.Animation.prototype,\n\t\t\t\t\tbounds, i;\n\t\t\t\tAnimationProto.revert || Object.defineProperty(AnimationProto, \"revert\", { value: function() { return this.time(-0.01, true); }}); // only for backwards compatibility (Animation.revert() was added after 3.10.4)\n\t\t\t\tbodyStyle.borderTopStyle = \"solid\"; // works around an issue where a margin of a child element could throw off the bounds of the _body, making it seem like there's a margin when there actually isn't. The border ensures that the bounds are accurate.\n\t\t\t\tbounds = _getBounds(_body);\n\t\t\t\t_vertical.m = Math.round(bounds.top + _vertical.sc()) || 0; // accommodate the offset of the caused by margins and/or padding\n\t\t\t\t_horizontal.m = Math.round(bounds.left + _horizontal.sc()) || 0;\n\t\t\t\tborder ? (bodyStyle.borderTopStyle = border) : bodyStyle.removeProperty(\"border-top-style\");\n\t\t\t\t// TODO: (?) maybe move to leveraging the velocity mechanism in Observer and skip intervals.\n\t\t\t\t_syncInterval = setInterval(_sync, 250);\n\t\t\t\tgsap.delayedCall(0.5, () => _startup = 0);\n\t\t\t\t_addListener(_doc, \"touchcancel\", _passThrough); // some older Android devices intermittently stop dispatching \"touchmove\" events if we don't listen for \"touchcancel\" on the document.\n\t\t\t\t_addListener(_body, \"touchstart\", _passThrough); //works around Safari bug: https://greensock.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/\n\t\t\t\t_multiListener(_addListener, _doc, \"pointerdown,touchstart,mousedown\", _pointerDownHandler);\n\t\t\t\t_multiListener(_addListener, _doc, \"pointerup,touchend,mouseup\", _pointerUpHandler);\n\t\t\t\t_transformProp = gsap.utils.checkPrefix(\"transform\");\n\t\t\t\t_stateProps.push(_transformProp);\n\t\t\t\t_coreInitted = _getTime();\n\t\t\t\t_resizeDelay = gsap.delayedCall(0.2, _refreshAll).pause();\n\t\t\t\t_autoRefresh = [_doc, \"visibilitychange\", () => {\n\t\t\t\t\tlet w = _win.innerWidth,\n\t\t\t\t\t\th = _win.innerHeight;\n\t\t\t\t\tif (_doc.hidden) {\n\t\t\t\t\t\t_prevWidth = w;\n\t\t\t\t\t\t_prevHeight = h;\n\t\t\t\t\t} else if (_prevWidth !== w || _prevHeight !== h) {\n\t\t\t\t\t\t_onResize();\n\t\t\t\t\t}\n\t\t\t\t}, _doc, \"DOMContentLoaded\", _refreshAll, _win, \"load\", _refreshAll, _win, \"resize\", _onResize];\n\t\t\t\t_iterateAutoRefresh(_addListener);\n\t\t\t\t_triggers.forEach(trigger => trigger.enable(0, 1));\n\t\t\t\tfor (i = 0; i < _scrollers.length; i+=3) {\n\t\t\t\t\t_wheelListener(_removeListener, _scrollers[i], _scrollers[i+1]);\n\t\t\t\t\t_wheelListener(_removeListener, _scrollers[i], _scrollers[i+2]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic config(vars) {\n\t\t(\"limitCallbacks\" in vars) && (_limitCallbacks = !!vars.limitCallbacks);\n\t\tlet ms = vars.syncInterval;\n\t\tms && clearInterval(_syncInterval) || ((_syncInterval = ms) && setInterval(_sync, ms));\n\t\t(\"ignoreMobileResize\" in vars) && (_ignoreMobileResize = ScrollTrigger.isTouch === 1 && vars.ignoreMobileResize);\n\t\tif (\"autoRefreshEvents\" in vars) {\n\t\t\t_iterateAutoRefresh(_removeListener) || _iterateAutoRefresh(_addListener, vars.autoRefreshEvents || \"none\");\n\t\t\t_ignoreResize = (vars.autoRefreshEvents + \"\").indexOf(\"resize\") === -1;\n\t\t}\n\t}\n\n\tstatic scrollerProxy(target, vars) {\n\t\tlet t = _getTarget(target),\n\t\t\ti = _scrollers.indexOf(t),\n\t\t\tisViewport = _isViewport(t);\n\t\tif (~i) {\n\t\t\t_scrollers.splice(i, isViewport ? 6 : 2);\n\t\t}\n\t\tif (vars) {\n\t\t\tisViewport ? _proxies.unshift(_win, vars, _body, vars, _docEl, vars) : _proxies.unshift(t, vars);\n\t\t}\n\t}\n\n\tstatic clearMatchMedia(query) {\n\t\t_triggers.forEach(t => t._ctx && t._ctx.query === query && t._ctx.kill(true, true));\n\t}\n\n\tstatic isInViewport(element, ratio, horizontal) {\n\t\tlet bounds = (_isString(element) ? _getTarget(element) : element).getBoundingClientRect(),\n\t\t\toffset = bounds[horizontal ? _width : _height] * ratio || 0;\n\t\treturn horizontal ? bounds.right - offset > 0 && bounds.left + offset < _win.innerWidth : bounds.bottom - offset > 0 && bounds.top + offset < _win.innerHeight;\n\t}\n\n\tstatic positionInViewport(element, referencePoint, horizontal) {\n\t\t_isString(element) && (element = _getTarget(element));\n\t\tlet bounds = element.getBoundingClientRect(),\n\t\t\tsize = bounds[horizontal ? _width : _height],\n\t\t\toffset = referencePoint == null ? size / 2 : ((referencePoint in _keywords) ? _keywords[referencePoint] * size : ~referencePoint.indexOf(\"%\") ? parseFloat(referencePoint) * size / 100 : parseFloat(referencePoint) || 0);\n\t\treturn horizontal ? (bounds.left + offset) / _win.innerWidth : (bounds.top + offset) / _win.innerHeight;\n\t}\n\n\tstatic killAll(allowListeners) {\n\t\t_triggers.slice(0).forEach(t => t.vars.id !== \"ScrollSmoother\" && t.kill());\n\t\tif (allowListeners !== true) {\n\t\t\tlet listeners = _listeners.killAll || [];\n\t\t\t_listeners = {};\n\t\t\tlisteners.forEach(f => f());\n\t\t}\n\t}\n\n}\n\nScrollTrigger.version = \"3.12.1\";\nScrollTrigger.saveStyles = targets => targets ? _toArray(targets).forEach(target => { // saved styles are recorded in a consecutive alternating Array, like [element, cssText, transform attribute, cache, matchMedia, ...]\n\tif (target && target.style) {\n\t\tlet i = _savedStyles.indexOf(target);\n\t\ti >= 0 && _savedStyles.splice(i, 5);\n\t\t_savedStyles.push(target, target.style.cssText, target.getBBox && target.getAttribute(\"transform\"), gsap.core.getCache(target), _context());\n\t}\n}) : _savedStyles;\nScrollTrigger.revert = (soft, media) => _revertAll(!soft, media);\nScrollTrigger.create = (vars, animation) => new ScrollTrigger(vars, animation);\nScrollTrigger.refresh = safe => safe ? _onResize() : (_coreInitted || ScrollTrigger.register()) && _refreshAll(true);\nScrollTrigger.update = force => ++_scrollers.cache && _updateAll(force === true ? 2 : 0);\nScrollTrigger.clearScrollMemory = _clearScrollMemory;\nScrollTrigger.maxScroll = (element, horizontal) => _maxScroll(element, horizontal ? _horizontal : _vertical);\nScrollTrigger.getScrollFunc = (element, horizontal) => _getScrollFunc(_getTarget(element), horizontal ? _horizontal : _vertical);\nScrollTrigger.getById = id => _ids[id];\nScrollTrigger.getAll = () => _triggers.filter(t => t.vars.id !== \"ScrollSmoother\"); // it's common for people to ScrollTrigger.getAll(t => t.kill()) on page routes, for example, and we don't want it to ruin smooth scrolling by killing the main ScrollSmoother one.\nScrollTrigger.isScrolling = () => !!_lastScrollTime;\nScrollTrigger.snapDirectional = _snapDirectional;\nScrollTrigger.addEventListener = (type, callback) => {\n\tlet a = _listeners[type] || (_listeners[type] = []);\n\t~a.indexOf(callback) || a.push(callback);\n};\nScrollTrigger.removeEventListener = (type, callback) => {\n\tlet a = _listeners[type],\n\t\ti = a && a.indexOf(callback);\n\ti >= 0 && a.splice(i, 1);\n};\nScrollTrigger.batch = (targets, vars) => {\n\tlet result = [],\n\t\tvarsCopy = {},\n\t\tinterval = vars.interval || 0.016,\n\t\tbatchMax = vars.batchMax || 1e9,\n\t\tproxyCallback = (type, callback) => {\n\t\t\tlet elements = [],\n\t\t\t\ttriggers = [],\n\t\t\t\tdelay = gsap.delayedCall(interval, () => {callback(elements, triggers); elements = []; triggers = [];}).pause();\n\t\t\treturn self => {\n\t\t\t\telements.length || delay.restart(true);\n\t\t\t\telements.push(self.trigger);\n\t\t\t\ttriggers.push(self);\n\t\t\t\tbatchMax <= elements.length && delay.progress(1);\n\t\t\t};\n\t\t},\n\t\tp;\n\tfor (p in vars) {\n\t\tvarsCopy[p] = (p.substr(0, 2) === \"on\" && _isFunction(vars[p]) && p !== \"onRefreshInit\") ? proxyCallback(p, vars[p]) : vars[p];\n\t}\n\tif (_isFunction(batchMax)) {\n\t\tbatchMax = batchMax();\n\t\t_addListener(ScrollTrigger, \"refresh\", () => batchMax = vars.batchMax());\n\t}\n\t_toArray(targets).forEach(target => {\n\t\tlet config = {};\n\t\tfor (p in varsCopy) {\n\t\t\tconfig[p] = varsCopy[p];\n\t\t}\n\t\tconfig.trigger = target;\n\t\tresult.push(ScrollTrigger.create(config));\n\t});\n\treturn result;\n}\n\n\n// to reduce file size. clamps the scroll and also returns a duration multiplier so that if the scroll gets chopped shorter, the duration gets curtailed as well (otherwise if you're very close to the top of the page, for example, and swipe up really fast, it'll suddenly slow down and take a long time to reach the top).\nlet _clampScrollAndGetDurationMultiplier = (scrollFunc, current, end, max) => {\n\t\tcurrent > max ? scrollFunc(max) : current < 0 && scrollFunc(0);\n\t\treturn end > max ? (max - current) / (end - current) : end < 0 ? current / (current - end) : 1;\n\t},\n\t_allowNativePanning = (target, direction) => {\n\t\tif (direction === true) {\n\t\t\ttarget.style.removeProperty(\"touch-action\");\n\t\t} else {\n\t\t\ttarget.style.touchAction = direction === true ? \"auto\" : direction ? \"pan-\" + direction + (Observer.isTouch ? \" pinch-zoom\" : \"\") : \"none\"; // note: Firefox doesn't support it pinch-zoom properly, at least in addition to a pan-x or pan-y.\n\t\t}\n\t\ttarget === _docEl && _allowNativePanning(_body, direction);\n\t},\n\t_overflow = {auto: 1, scroll: 1},\n\t_nestedScroll = ({event, target, axis}) => {\n\t\tlet node = (event.changedTouches ? event.changedTouches[0] : event).target,\n\t\t\tcache = node._gsap || gsap.core.getCache(node),\n\t\t\ttime = _getTime(), cs;\n\t\tif (!cache._isScrollT || time - cache._isScrollT > 2000) { // cache for 2 seconds to improve performance.\n\t\t\twhile (node && node !== _body && ((node.scrollHeight <= node.clientHeight && node.scrollWidth <= node.clientWidth) || !(_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]))) node = node.parentNode;\n\t\t\tcache._isScroll = node && node !== target && !_isViewport(node) && (_overflow[(cs = _getComputedStyle(node)).overflowY] || _overflow[cs.overflowX]);\n\t\t\tcache._isScrollT = time;\n\t\t}\n\t\tif (cache._isScroll || axis === \"x\") {\n\t\t\tevent.stopPropagation();\n\t\t\tevent._gsapAllow = true;\n\t\t}\n\t},\n\t// capture events on scrollable elements INSIDE the and allow those by calling stopPropagation() when we find a scrollable ancestor\n\t_inputObserver = (target, type, inputs, nested) => Observer.create({\n\t\ttarget: target,\n\t\tcapture: true,\n\t\tdebounce: false,\n\t\tlockAxis: true,\n\t\ttype: type,\n\t\tonWheel: (nested = nested && _nestedScroll),\n\t\tonPress: nested,\n\t\tonDrag: nested,\n\t\tonScroll: nested,\n\t\tonEnable: () => inputs && _addListener(_doc, Observer.eventTypes[0], _captureInputs, false, true),\n\t\tonDisable: () => _removeListener(_doc, Observer.eventTypes[0], _captureInputs, true)\n\t}),\n\t_inputExp = /(input|label|select|textarea)/i,\n\t_inputIsFocused,\n\t_captureInputs = e => {\n\t\tlet isInput = _inputExp.test(e.target.tagName);\n\t\tif (isInput || _inputIsFocused) {\n\t\t\te._gsapAllow = true;\n\t\t\t_inputIsFocused = isInput;\n\t\t}\n\t},\n\t_getScrollNormalizer = vars => {\n\t\t_isObject(vars) || (vars = {});\n\t\tvars.preventDefault = vars.isNormalizer = vars.allowClicks = true;\n\t\tvars.type || (vars.type = \"wheel,touch\");\n\t\tvars.debounce = !!vars.debounce;\n\t\tvars.id = vars.id || \"normalizer\";\n\t\tlet {normalizeScrollX, momentum, allowNestedScroll, onRelease} = vars,\n\t\t\tself, maxY,\n\t\t\ttarget = _getTarget(vars.target) || _docEl,\n\t\t\tsmoother = gsap.core.globals().ScrollSmoother,\n\t\t\tsmootherInstance = smoother && smoother.get(),\n\t\t\tcontent = _fixIOSBug && ((vars.content && _getTarget(vars.content)) || (smootherInstance && vars.content !== false && !smootherInstance.smooth() && smootherInstance.content())),\n\t\t\tscrollFuncY = _getScrollFunc(target, _vertical),\n\t\t\tscrollFuncX = _getScrollFunc(target, _horizontal),\n\t\t\tscale = 1,\n\t\t\tinitialScale = (Observer.isTouch && _win.visualViewport ? _win.visualViewport.scale * _win.visualViewport.width : _win.outerWidth) / _win.innerWidth,\n\t\t\twheelRefresh = 0,\n\t\t\tresolveMomentumDuration = _isFunction(momentum) ? () => momentum(self) : () => momentum || 2.8,\n\t\t\tlastRefreshID, skipTouchMove,\n\t\t\tinputObserver = _inputObserver(target, vars.type, true, allowNestedScroll),\n\t\t\tresumeTouchMove = () => skipTouchMove = false,\n\t\t\tscrollClampX = _passThrough,\n\t\t\tscrollClampY = _passThrough,\n\t\t\tupdateClamps = () => {\n\t\t\t\tmaxY = _maxScroll(target, _vertical);\n\t\t\t\tscrollClampY = _clamp(_fixIOSBug ? 1 : 0, maxY);\n\t\t\t\tnormalizeScrollX && (scrollClampX = _clamp(0, _maxScroll(target, _horizontal)));\n\t\t\t\tlastRefreshID = _refreshID;\n\t\t\t},\n\t\t\tremoveContentOffset = () => {\n\t\t\t\tcontent._gsap.y = _round(parseFloat(content._gsap.y) + scrollFuncY.offset) + \"px\";\n\t\t\t\tcontent.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + parseFloat(content._gsap.y) + \", 0, 1)\";\n\t\t\t\tscrollFuncY.offset = scrollFuncY.cacheID = 0;\n\t\t\t},\n\t\t\tignoreDrag = () => {\n\t\t\t\tif (skipTouchMove) {\n\t\t\t\t\trequestAnimationFrame(resumeTouchMove);\n\t\t\t\t\tlet offset = _round(self.deltaY / 2),\n\t\t\t\t\t\tscroll = scrollClampY(scrollFuncY.v - offset);\n\t\t\t\t\tif (content && scroll !== scrollFuncY.v + scrollFuncY.offset) {\n\t\t\t\t\t\tscrollFuncY.offset = scroll - scrollFuncY.v;\n\t\t\t\t\t\tlet y = _round((parseFloat(content && content._gsap.y) || 0) - scrollFuncY.offset);\n\t\t\t\t\t\tcontent.style.transform = \"matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, \" + y + \", 0, 1)\";\n\t\t\t\t\t\tcontent._gsap.y = y + \"px\";\n\t\t\t\t\t\tscrollFuncY.cacheID = _scrollers.cache;\n\t\t\t\t\t\t_updateAll();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tscrollFuncY.offset && removeContentOffset();\n\t\t\t\tskipTouchMove = true;\n\t\t\t},\n\t\t\ttween, startScrollX, startScrollY, onStopDelayedCall,\n\t\t\tonResize = () => { // if the window resizes, like on an iPhone which Apple FORCES the address bar to show/hide even if we event.preventDefault(), it may be scrolling too far now that the address bar is showing, so we must dynamically adjust the momentum tween.\n\t\t\t\tupdateClamps();\n\t\t\t\tif (tween.isActive() && tween.vars.scrollY > maxY) {\n\t\t\t\t\tscrollFuncY() > maxY ? tween.progress(1) && scrollFuncY(maxY) : tween.resetTo(\"scrollY\", maxY);\n\t\t\t\t}\n\t\t\t};\n\t\tcontent && gsap.set(content, {y: \"+=0\"}); // to ensure there's a cache (element._gsap)\n\t\tvars.ignoreCheck = e => (_fixIOSBug && e.type === \"touchmove\" && ignoreDrag(e)) || (scale > 1.05 && e.type !== \"touchstart\") || self.isGesturing || (e.touches && e.touches.length > 1);\n\t\tvars.onPress = () => {\n\t\t\tskipTouchMove = false;\n\t\t\tlet prevScale = scale;\n\t\t\tscale = _round(((_win.visualViewport && _win.visualViewport.scale) || 1) / initialScale);\n\t\t\ttween.pause();\n\t\t\tprevScale !== scale && _allowNativePanning(target, scale > 1.01 ? true : normalizeScrollX ? false : \"x\");\n\t\t\tstartScrollX = scrollFuncX();\n\t\t\tstartScrollY = scrollFuncY();\n\t\t\tupdateClamps();\n\t\t\tlastRefreshID = _refreshID;\n\t\t}\n\t\tvars.onRelease = vars.onGestureStart = (self, wasDragging) => {\n\t\t\tscrollFuncY.offset && removeContentOffset();\n\t\t\tif (!wasDragging) {\n\t\t\t\tonStopDelayedCall.restart(true);\n\t\t\t} else {\n\t\t\t\t_scrollers.cache++; // make sure we're pulling the non-cached value\n\t\t\t\t// alternate algorithm: durX = Math.min(6, Math.abs(self.velocityX / 800)),\tdur = Math.max(durX, Math.min(6, Math.abs(self.velocityY / 800))); dur = dur * (0.4 + (1 - _power4In(dur / 6)) * 0.6)) * (momentumSpeed || 1)\n\t\t\t\tlet dur = resolveMomentumDuration(),\n\t\t\t\t\tcurrentScroll, endScroll;\n\t\t\t\tif (normalizeScrollX) {\n\t\t\t\t\tcurrentScroll = scrollFuncX();\n\t\t\t\t\tendScroll = currentScroll + (dur * 0.05 * -self.velocityX) / 0.227; // the constant .227 is from power4(0.05). velocity is inverted because scrolling goes in the opposite direction.\n\t\t\t\t\tdur *= _clampScrollAndGetDurationMultiplier(scrollFuncX, currentScroll, endScroll, _maxScroll(target, _horizontal));\n\t\t\t\t\ttween.vars.scrollX = scrollClampX(endScroll);\n\t\t\t\t}\n\t\t\t\tcurrentScroll = scrollFuncY();\n\t\t\t\tendScroll = currentScroll + (dur * 0.05 * -self.velocityY) / 0.227; // the constant .227 is from power4(0.05)\n\t\t\t\tdur *= _clampScrollAndGetDurationMultiplier(scrollFuncY, currentScroll, endScroll, _maxScroll(target, _vertical));\n\t\t\t\ttween.vars.scrollY = scrollClampY(endScroll);\n\t\t\t\ttween.invalidate().duration(dur).play(0.01);\n\t\t\t\tif (_fixIOSBug && tween.vars.scrollY >= maxY || currentScroll >= maxY-1) { // iOS bug: it'll show the address bar but NOT fire the window \"resize\" event until the animation is done but we must protect against overshoot so we leverage an onUpdate to do so.\n\t\t\t\t\tgsap.to({}, {onUpdate: onResize, duration: dur});\n\t\t\t\t}\n\t\t\t}\n\t\t\tonRelease && onRelease(self);\n\t\t};\n\t\tvars.onWheel = () => {\n\t\t\ttween._ts && tween.pause();\n\t\t\tif (_getTime() - wheelRefresh > 1000) { // after 1 second, refresh the clamps otherwise that'll only happen when ScrollTrigger.refresh() is called or for touch-scrolling.\n\t\t\t\tlastRefreshID = 0;\n\t\t\t\twheelRefresh = _getTime();\n\t\t\t}\n\t\t};\n\t\tvars.onChange = (self, dx, dy, xArray, yArray) => {\n\t\t\t_refreshID !== lastRefreshID && updateClamps();\n\t\t\tdx && normalizeScrollX && scrollFuncX(scrollClampX(xArray[2] === dx ? startScrollX + (self.startX - self.x) : scrollFuncX() + dx - xArray[1])); // for more precision, we track pointer/touch movement from the start, otherwise it'll drift.\n\t\t\tif (dy) {\n\t\t\t\tscrollFuncY.offset && removeContentOffset();\n\t\t\t\tlet isTouch = yArray[2] === dy,\n\t\t\t\t\ty = isTouch ? startScrollY + self.startY - self.y : scrollFuncY() + dy - yArray[1],\n\t\t\t\t\tyClamped = scrollClampY(y);\n\t\t\t\tisTouch && y !== yClamped && (startScrollY += yClamped - y);\n\t\t\t\tscrollFuncY(yClamped);\n\t\t\t}\n\t\t\t(dy || dx) && _updateAll();\n\t\t};\n\t\tvars.onEnable = () => {\n\t\t\t_allowNativePanning(target, normalizeScrollX ? false : \"x\");\n\t\t\tScrollTrigger.addEventListener(\"refresh\", onResize);\n\t\t\t_addListener(_win, \"resize\", onResize);\n\t\t\tif (scrollFuncY.smooth) {\n\t\t\t\tscrollFuncY.target.style.scrollBehavior = \"auto\";\n\t\t\t\tscrollFuncY.smooth = scrollFuncX.smooth = false;\n\t\t\t}\n\t\t\tinputObserver.enable();\n\t\t};\n\t\tvars.onDisable = () => {\n\t\t\t_allowNativePanning(target, true);\n\t\t\t_removeListener(_win, \"resize\", onResize);\n\t\t\tScrollTrigger.removeEventListener(\"refresh\", onResize);\n\t\t\tinputObserver.kill();\n\t\t};\n\t\tvars.lockAxis = vars.lockAxis !== false;\n\t\tself = new Observer(vars);\n\t\tself.iOS = _fixIOSBug; // used in the Observer getCachedScroll() function to work around an iOS bug that wreaks havoc with TouchEvent.clientY if we allow scroll to go all the way back to 0.\n\t\t_fixIOSBug && !scrollFuncY() && scrollFuncY(1); // iOS bug causes event.clientY values to freak out (wildly inaccurate) if the scroll position is exactly 0.\n\t\t_fixIOSBug && gsap.ticker.add(_passThrough); // prevent the ticker from sleeping\n\t\tonStopDelayedCall = self._dc;\n\t\ttween = gsap.to(self, {ease: \"power4\", paused: true, scrollX: normalizeScrollX ? \"+=0.1\" : \"+=0\", scrollY: \"+=0.1\", modifiers: {scrollY: _interruptionTracker(scrollFuncY, scrollFuncY(), () => tween.pause())\t}, onUpdate: _updateAll, onComplete: onStopDelayedCall.vars.onComplete}); // we need the modifier to sense if the scroll position is altered outside of the momentum tween (like with a scrollTo tween) so we can pause() it to prevent conflicts.\n\t\treturn self;\n\t};\n\nScrollTrigger.sort = func => _triggers.sort(func || ((a, b) => (a.vars.refreshPriority || 0) * -1e6 + a.start - (b.start + (b.vars.refreshPriority || 0) * -1e6)));\nScrollTrigger.observe = vars => new Observer(vars);\nScrollTrigger.normalizeScroll = vars => {\n\tif (typeof(vars) === \"undefined\") {\n\t\treturn _normalizer;\n\t}\n\tif (vars === true && _normalizer) {\n\t\treturn _normalizer.enable();\n\t}\n\tif (vars === false) {\n\t\treturn _normalizer && _normalizer.kill();\n\t}\n\tlet normalizer = vars instanceof Observer ? vars : _getScrollNormalizer(vars);\n\t_normalizer && _normalizer.target === normalizer.target && _normalizer.kill();\n\t_isViewport(normalizer.target) && (_normalizer = normalizer);\n\treturn normalizer;\n};\n\n\nScrollTrigger.core = { // smaller file size way to leverage in ScrollSmoother and Observer\n\t_getVelocityProp,\n\t_inputObserver,\n\t_scrollers,\n\t_proxies,\n\tbridge: {\n\t\t// when normalizeScroll sets the scroll position (ss = setScroll)\n\t\tss: () => {\n\t\t\t_lastScrollTime || _dispatch(\"scrollStart\");\n\t\t\t_lastScrollTime = _getTime();\n\t\t},\n\t\t// a way to get the _refreshing value in Observer\n\t\tref: () => _refreshing\n\t}\n};\n\n_getGSAP() && gsap.registerPlugin(ScrollTrigger);\n\nexport { ScrollTrigger as default };"],"names":["_getGSAP","gsap","window","registerPlugin","_getProxyProp","element","property","_proxies","indexOf","_isViewport","el","_root","_addListener","type","func","nonPassive","capture","addEventListener","passive","_removeListener","removeEventListener","_onScroll","_normalizer","isPressed","_scrollers","cache","_scrollCacheFunc","f","doNotCache","cachingFunc","value","_startup","_win","history","scrollRestoration","isNormalizing","v","Math","round","iOS","cacheID","_bridge","offset","_getTarget","t","self","_ctx","selector","utils","toArray","config","nullTargetWarn","console","warn","_getScrollFunc","s","sc","_doc","scrollingElement","_docEl","i","_vertical","push","prev","arguments","length","target","smooth","getProperty","_getVelocityProp","minTimeRefresh","useDelta","update","force","_getTime","min","t1","v2","v1","t2","dropToZeroTime","max","reset","getVelocity","latestValue","tOld","vOld","_getEvent","e","preventDefault","_gsapAllow","changedTouches","_getAbsoluteMax","a","abs","_setScrollTrigger","ScrollTrigger","core","globals","_integrate","data","bridge","scrollers","proxies","name","_initCore","document","body","documentElement","_body","clamp","_context","context","_pointerType","_isTouch","Observer","isTouch","matchMedia","matches","navigator","maxTouchPoints","msMaxTouchPoints","_eventTypes","eventTypes","split","setTimeout","_coreInitted","_observers","Date","now","_scrollLeft","_scrollTop","_horizontal","p","p2","os","os2","d","d2","scrollTo","pageXOffset","op","pageYOffset","init","vars","tolerance","dragMinimum","lineHeight","debounce","onStop","onStopDelay","ignore","wheelSpeed","event","onDragStart","onDragEnd","onDrag","onPress","onRelease","onRight","onLeft","onUp","onDown","onChangeX","onChangeY","onChange","onToggleX","onToggleY","onHover","onHoverEnd","onMove","ignoreCheck","isNormalizer","onGestureStart","onGestureEnd","onWheel","onEnable","onDisable","onClick","scrollSpeed","allowClicks","lockAxis","onLockAxis","clickCapture","onClickTime","_ignoreCheck","isPointerOrTouch","limitToTouch","pointerType","dx","deltaX","dy","deltaY","changedX","changedY","prevDeltaX","prevDeltaY","moved","dragged","locked","wheeled","id","onDelta","x","y","index","_vx","_vy","requestAnimationFrame","onTouchOrPointerDelta","axis","_onDrag","clientX","clientY","isDragging","startX","startY","_onGestureStart","touches","isGesturing","_onGestureEnd","onScroll","scrollFuncX","scrollFuncY","scrollX","scrollY","onStopDelayedCall","restart","_onWheel","multiplier","deltaMode","innerHeight","_onMove","_onHover","_onHoverEnd","_onClick","parseFloat","getComputedStyle","this","isViewport","ownerDoc","ownerDocument","_onPress","button","pause","_onRelease","isTrackingDrag","isNaN","wasDragging","eventData","delayedCall","defaultPrevented","click","createEvent","syntheticEvent","initMouseEvent","screenX","screenY","dispatchEvent","_dc","onStopFunc","enable","isEnabled","disable","filter","o","kill","revert","splice","version","create","register","getAll","slice","getById","_parseClamp","_isString","substr","_keepClamp","_pointerDownHandler","_pointerIsDown","_pointerUpHandler","_passThrough","_round","_windowExists","_getBoundsFunc","_winOffsets","width","innerWidth","height","_getBounds","_maxScroll","_iterateAutoRefresh","events","_autoRefresh","_isFunction","_isNumber","_isObject","_endAnimation","animation","reversed","progress","_callback","enabled","result","totalTime","callbackAnimation","_getComputedStyle","_setDefaults","obj","defaults","_getSize","_getLabelRatioArray","timeline","labels","duration","_snapDirectional","snapIncrementOrArray","snap","Array","isArray","sort","b","direction","threshold","snapped","_multiListener","types","callback","forEach","_wheelListener","scrollFunc","wheelHandler","_offsetToPx","size","eqIndex","relative","charAt","_keywords","_createMarker","container","matchWidthEl","containerAnimation","startColor","endColor","fontSize","indent","fontWeight","createElement","useFixedPosition","isScroller","parent","isStart","color","css","_right","_bottom","offsetWidth","_isStart","setAttribute","style","cssText","innerText","children","insertBefore","appendChild","_offset","_positionMarker","_sync","_lastScrollTime","_rafID","_updateAll","clientWidth","_dispatch","_setBaseDimensions","_baseScreenWidth","_baseScreenHeight","_onResize","_refreshing","_ignoreResize","fullscreenElement","webkitFullscreenElement","_ignoreMobileResize","_resizeDelay","_softRefresh","_refreshAll","_revertRecorded","media","_savedStyles","query","getBBox","uncache","_revertAll","trigger","_i","_triggers","_clearScrollMemory","_refreshingAll","rec","_scrollRestoration","_swapPinIn","pin","spacer","cs","spacerState","_gsap","swappedIn","_propNamesToCopy","spacerStyle","pinStyle","position","display","flexBasis","overflow","boxSizing","_width","_px","_height","_padding","_margin","_setState","parentNode","_getState","l","_stateProps","state","_parsePosition","scrollerSize","scroll","marker","markerScroller","scrollerBounds","borderWidth","scrollerMax","clampZeroProp","p1","time","seek","mapRange","scrollTrigger","start","end","bounds","localOffset","globalOffset","offsets","left","top","removeProperty","m","_caScrollDist","_reparent","_stOrig","_prefixExp","test","getCache","_interruptionTracker","getValueFunc","initialValue","onInterrupt","last1","last2","current","_shiftMarker","set","_getTweenCreator","scroller","getTween","change1","change2","tween","onComplete","modifiers","getScroll","checkForInterruption","prop","ratio","onUpdate","call","to","_toArray","_clamp","_time2","_syncInterval","_transformProp","_prevWidth","_prevHeight","_sort","_suppressOverwrites","_fixIOSBug","_limitCallbacks","_queueRefreshID","_primary","_time1","_enabled","_abs","_Right","_Left","_Top","_Bottom","_Width","_Height","withoutTransforms","xPercent","yPercent","rotation","rotationX","rotationY","scale","skewX","skewY","getBoundingClientRect","_markerDefaults","_defaults","toggleActions","anticipatePin","center","bottom","right","flipped","side","oppositeSide","_isFlipped","_ids","_listeners","_emptyArray","map","_refreshID","skipRevert","isRefreshing","refreshInits","scrollBehavior","refresh","_subPinOffset","horizontal","original","adjustPinSpacing","_dir","_endClamp","setPositions","render","onRefresh","_lastScroll","_direction","isUpdating","recordVelocity","concat","_capsExp","replace","toLowerCase","tweenTo","pinCache","snapFunc","scroll1","scroll2","markerStart","markerEnd","markerStartTrigger","markerEndTrigger","markerVars","executingOnRefresh","change","pinOriginalState","pinActiveState","pinState","pinGetter","pinSetter","pinStart","pinChange","spacingStart","markerStartSetter","pinMoves","markerEndSetter","snap1","snap2","scrubTween","scrubSmooth","snapDurClamp","snapDelayedCall","prevScroll","prevAnimProgress","caMarkerSetter","customRevertReturn","nodeType","toggleClass","onToggle","scrub","pinSpacing","invalidateOnRefresh","onScrubComplete","onSnapComplete","once","pinReparent","pinSpacer","fastScrollEnd","preventOverlaps","isToggle","scrollerCache","pinType","callbacks","onEnter","onLeave","onEnterBack","onLeaveBack","markers","onRefreshInit","getScrollerSize","_getSizeFunc","getScrollerOffsets","_getOffsetsFunc","lastSnap","lastRefresh","prevProgress","_startClamp","bind","refreshPriority","tweenScroll","scrubDuration","ease","totalProgress","paused","lazy","_initted","isReverted","immediateRender","snapTo","_getClosestLabel","_getLabelAtDirection","st","directional","delay","refreshedRecently","isActive","velocity","naturalEnd","inertia","endValue","endScroll","onStart","stRevert","targets","className","nativeElement","spacerIsNative","classList","add","force3D","quickSetter","content","_makePositionable","oldOnUpdate","oldParams","onUpdateParams","eventCallback","apply","previous","next","temp","r","prevRefreshing","_swapPinOut","removeChild","soft","pinOffset","invalidate","isVertical","override","curTrigger","curPin","oppositeScroll","initted","revertedPins","forcedOverflow","markerStartOffset","markerEndOffset","isFirstRefresh","otherPinOffset","parsedEnd","parsedEndTrigger","endTrigger","parsedStart","pinnedContainer","triggerIndex","unshift","_pinPush","normalize","toUpperCase","ceil","_copyState","omitOffsets","_pinOffset","endAnimation","labelToScroll","label","getTrailing","reverse","forceFake","toggleState","action","stateChanged","toggled","isAtMax","isTakingAction","clipped","_dp","_time","_start","resetTo","_tTime","_tDur","n","newStart","newEnd","keepClamp","amount","allowAnimation","onKill","updateFunc","_queueRefreshAll","clearInterval","suppressOverwrites","_rafBugFix","userAgent","mm","bodyStyle","border","borderTopStyle","AnimationProto","Animation","prototype","Object","defineProperty","setInterval","checkPrefix","w","h","hidden","limitCallbacks","ms","syncInterval","ignoreMobileResize","autoRefreshEvents","scrollerProxy","clearMatchMedia","isInViewport","positionInViewport","referencePoint","killAll","allowListeners","listeners","saveStyles","getAttribute","safe","clearScrollMemory","maxScroll","getScrollFunc","isScrolling","snapDirectional","batch","proxyCallback","elements","triggers","interval","batchMax","varsCopy","_clampScrollAndGetDurationMultiplier","_allowNativePanning","touchAction","_nestedScroll","node","_isScrollT","scrollHeight","clientHeight","scrollWidth","_overflow","overflowY","overflowX","_isScroll","stopPropagation","_inputObserver","inputs","nested","_captureInputs","_getScrollNormalizer","resumeTouchMove","skipTouchMove","updateClamps","maxY","scrollClampY","normalizeScrollX","scrollClampX","lastRefreshID","removeContentOffset","transform","onResize","startScrollX","startScrollY","momentum","allowNestedScroll","smoother","ScrollSmoother","smootherInstance","get","initialScale","visualViewport","outerWidth","wheelRefresh","resolveMomentumDuration","inputObserver","ignoreDrag","prevScale","currentScroll","dur","velocityX","velocityY","play","_ts","xArray","yArray","yClamped","ticker","_inputIsFocused","auto","_inputExp","isInput","tagName","observe","normalizeScroll","normalizer","ss","ref"],"mappings":"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"} \ No newline at end of file diff --git a/attachments/russia/js/gsap/TextPlugin.min.js b/attachments/russia/js/gsap/TextPlugin.min.js new file mode 100644 index 0000000..7f85559 --- /dev/null +++ b/attachments/russia/js/gsap/TextPlugin.min.js @@ -0,0 +1,11 @@ +/*! + * TextPlugin 3.12.1 + * https://greensock.com + * + * @license Copyright 2023, GreenSock. All rights reserved. + * Subject to the terms at https://greensock.com/standard-license or for Club GreenSock members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(D,u){"object"==typeof exports&&"undefined"!=typeof module?u(exports):"function"==typeof define&&define.amd?define(["exports"],u):u((D=D||self).window=D.window||{})}(this,function(D){"use strict";var i=/(?:^\s+|\s+$)/g,r=/([\uD800-\uDBFF][\uDC00-\uDFFF](?:[\u200D\uFE0F][\uD800-\uDBFF][\uDC00-\uDFFF]){2,}|\uD83D\uDC69(?:\u200D(?:(?:\uD83D\uDC69\u200D)?\uD83D\uDC67|(?:\uD83D\uDC69\u200D)?\uD83D\uDC66)|\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D(?:\uD83D\uDC69\u200D)?\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D(?:\uD83D\uDC69\u200D)?\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]\uFE0F|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC6F\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3C-\uDD3E\uDDD6-\uDDDF])\u200D[\u2640\u2642]\uFE0F|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F\u200D[\u2640\u2642]|(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642])\uFE0F|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\uD83D\uDC69\u200D[\u2695\u2696\u2708]|\uD83D\uDC68(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708]))\uFE0F|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83D\uDC69\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|\uD83D\uDC68(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC66\u200D\uD83D\uDC66|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92])|(?:\uD83C[\uDFFB-\uDFFF])\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]))|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDD1-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\u200D(?:(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC67|(?:(?:\uD83D[\uDC68\uDC69])\u200D)?\uD83D\uDC66)|\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC69\uDC6E\uDC70-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD18-\uDD1C\uDD1E\uDD1F\uDD26\uDD30-\uDD39\uDD3D\uDD3E\uDDD1-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])?|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDEEB\uDEEC\uDEF4-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEF8]|\uD83E[\uDD10-\uDD3A\uDD3C-\uDD3E\uDD40-\uDD45\uDD47-\uDD4C\uDD50-\uDD6B\uDD80-\uDD97\uDDC0\uDDD0-\uDDE6])\uFE0F)/;function splitInnerHTML(D,u,F,C){for(var E,e=D.firstChild,t=[];e;)3===e.nodeType?(E=(e.nodeValue+"").replace(/^\n+/g,""),C||(E=E.replace(/\s+/g," ")),t.push.apply(t,emojiSafeSplit(E,u,F,C))):"br"===(e.nodeName+"").toLowerCase()?t[t.length-1]+="
    ":t.push(e.outerHTML),e=e.nextSibling;for(E=t.length;E--;)"&"===t[E]&&t.splice(E,1,"&");return t}function emojiSafeSplit(D,u,F,C){if(D+="",F&&(D=D.trim?D.trim():D.replace(i,"")),u&&""!==u)return D.replace(/>/g,">").replace(/"===e?">":"<"===e?"<":!C||" "!==e||" "!==D.charAt(B-1)&&" "!==D.charAt(B+1)?e:" ");return t}var u,g,F={version:"3.12.1",name:"text",init:function init(D,u,F){"object"!=typeof u&&(u={value:u});var C,E,e,t,n,B,i,r,A=D.nodeName.toUpperCase(),s=this,l=u.newClass,o=u.oldClass,a=u.preserveSpaces,p=u.rtl,f=s.delimiter=u.delimiter||"",d=s.fillChar=u.fillChar||(u.padSpace?" ":"");if(s.svg=D.getBBox&&("TEXT"===A||"TSPAN"===A),!("innerHTML"in D||s.svg))return!1;if(s.target=D,"value"in u){for(e=splitInnerHTML(D,f,!1,a),(g=g||document.createElement("div")).innerHTML=u.value,E=splitInnerHTML(g,f,!1,a),s.from=F._from,!s.from&&!p||p&&s.from||(A=e,e=E,E=A),s.hasClass=!(!l&&!o),s.newClass=p?o:l,s.oldClass=p?l:o,C=(A=e.length-E.length)<0?e:E,A<0&&(A=-A);-1<--A;)C.push(d);if("diff"===u.type){for(n=[],B=[],i="",A=t=0;A":"")+e.slice(0,a).join(i)+(F?"":"")+(C?"":"")+i+s.slice(a).join(i)+(C?"":"")):e.slice(0,a).join(i)+i+s.slice(a).join(i),u.svg?r.textContent=E:r.innerHTML=" "===A&&~E.indexOf(" ")?E.split(" ").join("  "):E}};F.splitInnerHTML=splitInnerHTML,F.emojiSafeSplit=emojiSafeSplit,F.getText=function getText(D){var u=D.nodeType,F="";if(1===u||9===u||11===u){if("string"==typeof D.textContent)return D.textContent;for(D=D.firstChild;D;D=D.nextSibling)F+=getText(D)}else if(3===u||4===u)return D.nodeValue;return F},function _getGSAP(){return u||"undefined"!=typeof window&&(u=window.gsap)&&u.registerPlugin&&u}()&&u.registerPlugin(F),D.TextPlugin=F,D.default=F;if (typeof(window)==="undefined"||window!==D){Object.defineProperty(D,"__esModule",{value:!0})} else {delete D.default}}); + diff --git a/attachments/russia/js/gsap/TextPlugin.min.js.map b/attachments/russia/js/gsap/TextPlugin.min.js.map new file mode 100644 index 0000000..37a2ec0 --- /dev/null +++ b/attachments/russia/js/gsap/TextPlugin.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TextPlugin.min.js","sources":["../src/utils/strings.js","../src/TextPlugin.js"],"sourcesContent":["/*!\n * strings: 3.12.1\n * https://greensock.com\n *\n * Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nlet _trimExp = /(?:^\\s+|\\s+$)/g;\n\nexport const emojiExp = /([\\uD800-\\uDBFF][\\uDC00-\\uDFFF](?:[\\u200D\\uFE0F][\\uD800-\\uDBFF][\\uDC00-\\uDFFF]){2,}|\\uD83D\\uDC69(?:\\u200D(?:(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC67|(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC66)|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]\\uFE0F|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC6F\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDD6-\\uDDDF])\\u200D[\\u2640\\u2642]\\uFE0F|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642])\\uFE0F|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\uD83D\\uDC69\\u200D[\\u2695\\u2696\\u2708]|\\uD83D\\uDC68(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708]))\\uFE0F|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83D\\uDC69\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69]))|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92])|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]))|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDD1-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\u200D(?:(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC67|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC66)|\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC69\\uDC6E\\uDC70-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3D\\uDD3E\\uDDD1-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])?|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDEEB\\uDEEC\\uDEF4-\\uDEF8]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD4C\\uDD50-\\uDD6B\\uDD80-\\uDD97\\uDDC0\\uDDD0-\\uDDE6])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEF8]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD4C\\uDD50-\\uDD6B\\uDD80-\\uDD97\\uDDC0\\uDDD0-\\uDDE6])\\uFE0F)/;\n\nexport function getText(e) {\n\tlet type = e.nodeType,\n\t\tresult = \"\";\n\tif (type === 1 || type === 9 || type === 11) {\n\t\tif (typeof(e.textContent) === \"string\") {\n\t\t\treturn e.textContent;\n\t\t} else {\n\t\t\tfor (e = e.firstChild; e; e = e.nextSibling ) {\n\t\t\t\tresult += getText(e);\n\t\t\t}\n\t\t}\n\t} else if (type === 3 || type === 4) {\n\t\treturn e.nodeValue;\n\t}\n\treturn result;\n}\n\nexport function splitInnerHTML(element, delimiter, trim, preserveSpaces) {\n\tlet node = element.firstChild,\n\t\tresult = [], s;\n\twhile (node) {\n\t\tif (node.nodeType === 3) {\n\t\t\ts = (node.nodeValue + \"\").replace(/^\\n+/g, \"\");\n\t\t\tif (!preserveSpaces) {\n\t\t\t\ts = s.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t\tresult.push(...emojiSafeSplit(s, delimiter, trim, preserveSpaces));\n\t\t} else if ((node.nodeName + \"\").toLowerCase() === \"br\") {\n\t\t\tresult[result.length-1] += \"
    \";\n\t\t} else {\n\t\t\tresult.push(node.outerHTML);\n\t\t}\n\t\tnode = node.nextSibling;\n\t}\n\ts = result.length;\n\twhile (s--) {\n\t\tresult[s] === \"&\" && result.splice(s, 1, \"&\");\n\t}\n\treturn result;\n}\n\n/*\n//smaller kb version that only handles the simpler emoji's, which is often perfectly adequate.\n\nlet _emoji = \"[\\uE000-\\uF8FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDFFF]|[\\u2694-\\u2697]|\\uD83E[\\uDD10-\\uDD5D]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\",\n\t_emojiExp = new RegExp(_emoji),\n\t_emojiAndCharsExp = new RegExp(_emoji + \"|.\", \"g\"),\n\t_emojiSafeSplit = (text, delimiter, trim) => {\n\t\tif (trim) {\n\t\t\ttext = text.replace(_trimExp, \"\");\n\t\t}\n\t\treturn ((delimiter === \"\" || !delimiter) && _emojiExp.test(text)) ? text.match(_emojiAndCharsExp) : text.split(delimiter || \"\");\n\t};\n */\nexport function emojiSafeSplit(text, delimiter, trim, preserveSpaces) {\n\ttext += \"\"; // make sure it's cast as a string. Someone may pass in a number.\n\ttrim && (text = text.trim ? text.trim() : text.replace(_trimExp, \"\")); // IE9 and earlier compatibility\n\tif (delimiter && delimiter !== \"\") {\n\t\treturn text.replace(/>/g, \">\").replace(/= 0xD800 && character.charCodeAt(0) <= 0xDBFF) || (text.charCodeAt(i+1) >= 0xFE00 && text.charCodeAt(i+1) <= 0xFE0F)) { //special emoji characters use 2 or 4 unicode characters that we must keep together.\n\t\t\tj = ((text.substr(i, 12).split(emojiExp) || [])[1] || \"\").length || 2;\n\t\t\tcharacter = text.substr(i, j);\n\t\t\tresult.emoji = 1;\n\t\t\ti += j - 1;\n\t\t}\n\t\tresult.push(character === \">\" ? \">\" : (character === \"<\") ? \"<\" : preserveSpaces && character === \" \" && (text.charAt(i-1) === \" \" || text.charAt(i+1) === \" \") ? \" \" : character);\n\t}\n\treturn result;\n}","/*!\n * TextPlugin 3.12.1\n * https://greensock.com\n *\n * @license Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nimport { emojiSafeSplit, getText, splitInnerHTML } from \"./utils/strings.js\";\n\nlet gsap, _tempDiv,\n\t_getGSAP = () => gsap || (typeof(window) !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap);\n\n\nexport const TextPlugin = {\n\tversion:\"3.12.1\",\n\tname:\"text\",\n\tinit(target, value, tween) {\n\t\ttypeof(value) !== \"object\" && (value = {value:value});\n\t\tlet i = target.nodeName.toUpperCase(),\n\t\t\tdata = this,\n\t\t\t{ newClass, oldClass, preserveSpaces, rtl } = value,\n\t\t\tdelimiter = data.delimiter = value.delimiter || \"\",\n\t\t\tfillChar = data.fillChar = value.fillChar || (value.padSpace ? \" \" : \"\"),\n\t\t\tshort, text, original, j, condensedText, condensedOriginal, aggregate, s;\n\t\tdata.svg = (target.getBBox && (i === \"TEXT\" || i === \"TSPAN\"));\n\t\tif (!(\"innerHTML\" in target) && !data.svg) {\n\t\t\treturn false;\n\t\t}\n\t\tdata.target = target;\n\t\tif (!(\"value\" in value)) {\n\t\t\tdata.text = data.original = [\"\"];\n\t\t\treturn;\n\t\t}\n\t\toriginal = splitInnerHTML(target, delimiter, false, preserveSpaces);\n\t\t_tempDiv || (_tempDiv = document.createElement(\"div\"));\n\t\t_tempDiv.innerHTML = value.value;\n\t\ttext = splitInnerHTML(_tempDiv, delimiter, false, preserveSpaces);\n\t\tdata.from = tween._from;\n\t\tif ((data.from || rtl) && !(rtl && data.from)) { // right-to-left or \"from()\" tweens should invert things (but if it's BOTH .from() and rtl, inverting twice equals not inverting at all :)\n\t\t\ti = original;\n\t\t\toriginal = text;\n\t\t\ttext = i;\n\t\t}\n\t\tdata.hasClass = !!(newClass || oldClass);\n\t\tdata.newClass = rtl ? oldClass : newClass;\n\t\tdata.oldClass = rtl ? newClass : oldClass;\n\t\ti = original.length - text.length;\n\t\tshort = i < 0 ? original : text;\n\t\tif (i < 0) {\n\t\t\ti = -i;\n\t\t}\n\t\twhile (--i > -1) {\n\t\t\tshort.push(fillChar);\n\t\t}\n\t\tif (value.type === \"diff\") {\n\t\t\tj = 0;\n\t\t\tcondensedText = [];\n\t\t\tcondensedOriginal = [];\n\t\t\taggregate = \"\";\n\t\t\tfor (i = 0; i < text.length; i++) {\n\t\t\t\ts = text[i];\n\t\t\t\tif (s === original[i]) {\n\t\t\t\t\taggregate += s;\n\t\t\t\t} else {\n\t\t\t\t\tcondensedText[j] = aggregate + s;\n\t\t\t\t\tcondensedOriginal[j++] = aggregate + original[i];\n\t\t\t\t\taggregate = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\ttext = condensedText;\n\t\t\toriginal = condensedOriginal;\n\t\t\tif (aggregate) {\n\t\t\t\ttext.push(aggregate);\n\t\t\t\toriginal.push(aggregate);\n\t\t\t}\n\t\t}\n\t\tvalue.speed && tween.duration(Math.min(0.05 / value.speed * short.length, value.maxDuration || 9999));\n\t\tdata.rtl = rtl;\n\t\tdata.original = original;\n\t\tdata.text = text;\n\t\tdata._props.push(\"text\");\n\t},\n\trender(ratio, data) {\n\t\tif (ratio > 1) {\n\t\t\tratio = 1;\n\t\t} else if (ratio < 0) {\n\t\t\tratio = 0;\n\t\t}\n\t\tif (data.from) {\n\t\t\tratio = 1 - ratio;\n\t\t}\n\t\tlet { text, hasClass, newClass, oldClass, delimiter, target, fillChar, original, rtl } = data,\n\t\t\tl = text.length,\n\t\t\ti = ((rtl ? 1 - ratio : ratio) * l + 0.5) | 0,\n\t\t\tapplyNew, applyOld, str;\n\t\tif (hasClass && ratio) {\n\t\t\tapplyNew = (newClass && i);\n\t\t\tapplyOld = (oldClass && i !== l);\n\t\t\tstr = (applyNew ? \"\" : \"\") + text.slice(0, i).join(delimiter) + (applyNew ? \"\" : \"\") + (applyOld ? \"\" : \"\") + delimiter + original.slice(i).join(delimiter) + (applyOld ? \"\" : \"\");\n\t\t} else {\n\t\t\tstr = text.slice(0, i).join(delimiter) + delimiter + original.slice(i).join(delimiter);\n\t\t}\n\t\tif (data.svg) { //SVG text elements don't have an \"innerHTML\" in Microsoft browsers.\n\t\t\ttarget.textContent = str;\n\t\t} else {\n\t\t\ttarget.innerHTML = (fillChar === \" \" && ~str.indexOf(\" \")) ? str.split(\" \").join(\"  \") : str;\n\t\t}\n\t}\n};\n\nTextPlugin.splitInnerHTML = splitInnerHTML;\nTextPlugin.emojiSafeSplit = emojiSafeSplit;\nTextPlugin.getText = getText;\n\n_getGSAP() && gsap.registerPlugin(TextPlugin);\n\nexport { TextPlugin as default };"],"names":["_trimExp","emojiExp","splitInnerHTML","element","delimiter","trim","preserveSpaces","s","node","firstChild","result","nodeType","nodeValue","replace","push","emojiSafeSplit","nodeName","toLowerCase","length","outerHTML","nextSibling","splice","text","split","j","character","l","i","charAt","charCodeAt","substr","emoji","gsap","_tempDiv","TextPlugin","version","name","init","target","value","tween","short","original","condensedText","condensedOriginal","aggregate","toUpperCase","data","this","newClass","oldClass","rtl","fillChar","padSpace","svg","getBBox","document","createElement","innerHTML","from","_from","hasClass","type","speed","duration","Math","min","maxDuration","_props","render","ratio","applyNew","applyOld","str","slice","join","textContent","indexOf","getText","e","_getGSAP","window","registerPlugin"],"mappings":"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"} \ No newline at end of file diff --git a/attachments/russia/js/gsap/gsap.min.js b/attachments/russia/js/gsap/gsap.min.js new file mode 100644 index 0000000..70d9253 --- /dev/null +++ b/attachments/russia/js/gsap/gsap.min.js @@ -0,0 +1,11 @@ +/*! + * GSAP 3.12.1 + * https://greensock.com + * + * @license Copyright 2023, GreenSock. All rights reserved. + * Subject to the terms at https://greensock.com/standard-license or for Club GreenSock members, the agreement issued with that membership. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).window=t.window||{})}(this,function(e){"use strict";function _inheritsLoose(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}function _assertThisInitialized(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t){return"string"==typeof t}function s(t){return"function"==typeof t}function t(t){return"number"==typeof t}function u(t){return void 0===t}function v(t){return"object"==typeof t}function w(t){return!1!==t}function x(){return"undefined"!=typeof window}function y(t){return s(t)||r(t)}function P(t){return(i=yt(t,ot))&&Ee}function Q(t,e){return console.warn("Invalid property",t,"set to",e,"Missing plugin? gsap.registerPlugin()")}function R(t,e){return!e&&console.warn(t)}function S(t,e){return t&&(ot[t]=e)&&i&&(i[t]=e)||ot}function T(){return 0}function ea(t){var e,r,i=t[0];if(v(i)||s(i)||(t=[t]),!(e=(i._gsap||{}).harness)){for(r=gt.length;r--&&!gt[r].targetTest(i););e=gt[r]}for(r=t.length;r--;)t[r]&&(t[r]._gsap||(t[r]._gsap=new Vt(t[r],e)))||t.splice(r,1);return t}function fa(t){return t._gsap||ea(Ot(t))[0]._gsap}function ga(t,e,r){return(r=t[e])&&s(r)?t[e]():u(r)&&t.getAttribute&&t.getAttribute(e)||r}function ha(t,e){return(t=t.split(",")).forEach(e)||t}function ia(t){return Math.round(1e5*t)/1e5||0}function ja(t){return Math.round(1e7*t)/1e7||0}function ka(t,e){var r=e.charAt(0),i=parseFloat(e.substr(2));return t=parseFloat(t),"+"===r?t+i:"-"===r?t-i:"*"===r?t*i:t/i}function la(t,e){for(var r=e.length,i=0;t.indexOf(e[i])<0&&++ia;)s=s._prev;return s?(e._next=s._next,s._next=e):(e._next=t[r],t[r]=e),e._next?e._next._prev=e:t[i]=e,e._prev=s,e.parent=e._dp=t,e}function ya(t,e,r,i){void 0===r&&(r="_first"),void 0===i&&(i="_last");var n=e._prev,a=e._next;n?n._next=a:t[r]===e&&(t[r]=a),a?a._prev=n:t[i]===e&&(t[i]=n),e._next=e._prev=e.parent=null}function za(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Aa(t,e){if(t&&(!e||e._end>t._dur||e._start<0))for(var r=t;r;)r._dirty=1,r=r.parent;return t}function Ca(t,e,r,i){return t._startAt&&(L?t._startAt.revert(ht):t.vars.immediateRender&&!t.vars.autoRevert||t._startAt.render(e,!0,i))}function Ea(t){return t._repeat?Tt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ga(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ha(t){return t._end=ja(t._start+(t._tDur/Math.abs(t._ts||t._rts||X)||0))}function Ia(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=ja(r._time-(0X)&&e.render(r,!0)),Aa(t,e)._dp&&t._initted&&t._time>=t._dur&&t._ts){if(t._dur(n=Math.abs(n))&&(a=i,o=n);return a}function tb(t){return za(t),t.scrollTrigger&&t.scrollTrigger.kill(!!L),t.progress()<1&&At(t,"onInterrupt"),t}function wb(t){if(x()&&t){var e=(t=!t.name&&t.default||t).name,r=s(t),i=e&&!r&&t.init?function(){this._props=[]}:t,n={init:T,render:he,add:Qt,kill:ce,modifier:fe,rawVars:0},a={targetTest:0,get:0,getSetter:ne,aliases:{},register:0};if(Ft(),t!==i){if(pt[e])return;qa(i,qa(ua(t,n),a)),yt(i.prototype,yt(n,ua(t,a))),pt[i.prop=e]=i,t.targetTest&&(gt.push(i),ft[e]=1),e=("css"===e?"CSS":e.charAt(0).toUpperCase()+e.substr(1))+"Plugin"}S(e,i),t.register&&t.register(Ee,i,_e)}else t&&Ct.push(t)}function zb(t,e,r){return(6*(t+=t<0?1:1>16,e>>8&St,e&St]:0:Et.black;if(!p){if(","===e.substr(-1)&&(e=e.substr(0,e.length-1)),Et[e])p=Et[e];else if("#"===e.charAt(0)){if(e.length<6&&(e="#"+(n=e.charAt(1))+n+(a=e.charAt(2))+a+(s=e.charAt(3))+s+(5===e.length?e.charAt(4)+e.charAt(4):"")),9===e.length)return[(p=parseInt(e.substr(1,6),16))>>16,p>>8&St,p&St,parseInt(e.substr(7),16)/255];p=[(e=parseInt(e.substr(1),16))>>16,e>>8&St,e&St]}else if("hsl"===e.substr(0,3))if(p=d=e.match(tt),r){if(~e.indexOf("="))return p=e.match(et),i&&p.length<4&&(p[3]=1),p}else o=+p[0]%360/360,u=p[1]/100,n=2*(h=p[2]/100)-(a=h<=.5?h*(u+1):h+u-h*u),3=U?u.endTime(!1):t._dur;return r(e)&&(isNaN(e)||e in o)?(a=e.charAt(0),s="%"===e.substr(-1),n=e.indexOf("="),"<"===a||">"===a?(0<=n&&(e=e.replace(/=/,"")),("<"===a?u._start:u.endTime(0<=u._repeat))+(parseFloat(e.substr(1))||0)*(s?(n<0?u:i).totalDuration()/100:1)):n<0?(e in o||(o[e]=h),o[e]):(a=parseFloat(e.charAt(n-1)+e.substr(n+1)),s&&i&&(a=a/100*($(i)?i[0]:i).totalDuration()),1=r&&te)return i;i=i._next}else for(i=t._last;i&&i._start>=r;){if("isPause"===i.data&&i._start=n._start)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0=this.totalDuration()||!v&&_)&&(f!==this._start&&Math.abs(l)===Math.abs(this._ts)||this._lock||(!t&&g||!(v===m&&0=i&&(a instanceof Zt?e&&n.push(a):(r&&n.push(a),t&&n.push.apply(n,a.getChildren(!0,e,r)))),a=a._next;return n},e.getById=function getById(t){for(var e=this.getChildren(1,1,1),r=e.length;r--;)if(e[r].vars.id===t)return e[r]},e.remove=function remove(t){return r(t)?this.removeLabel(t):s(t)?this.killTweensOf(t):(ya(this,t),t===this._recent&&(this._recent=this._last),Aa(this))},e.totalTime=function totalTime(t,e){return arguments.length?(this._forcing=1,!this._dp&&this._ts&&(this._start=ja(Rt.time-(0r:!r||s.isActive())&&n.push(s):(i=s.getTweensOf(a,r)).length&&n.push.apply(n,i),s=s._next;return n},e.tweenTo=function tweenTo(t,e){e=e||{};var r,i=this,n=xt(i,t),a=e.startAt,s=e.onStart,o=e.onStartParams,u=e.immediateRender,h=Zt.to(i,qa({ease:e.ease||"none",lazy:!1,immediateRender:!1,time:n,overwrite:"auto",duration:e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale())||X,onStart:function onStart(){if(i.pause(),!r){var t=e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale());h._dur!==t&&Ra(h,t,0,1).render(h._time,!0,!0),r=1}s&&s.apply(h,o||[])}},e));return u?h.render(0):h},e.tweenFromTo=function tweenFromTo(t,e,r){return this.tweenTo(e,qa({startAt:{time:xt(this,t)}},r))},e.recent=function recent(){return this._recent},e.nextLabel=function nextLabel(t){return void 0===t&&(t=this._time),rb(this,xt(this,t))},e.previousLabel=function previousLabel(t){return void 0===t&&(t=this._time),rb(this,xt(this,t),1)},e.currentLabel=function currentLabel(t){return arguments.length?this.seek(t,!0):this.previousLabel(this._time+X)},e.shiftChildren=function shiftChildren(t,e,r){void 0===r&&(r=0);for(var i,n=this._first,a=this.labels;n;)n._start>=r&&(n._start+=t,n._end+=t),n=n._next;if(e)for(i in a)a[i]>=r&&(a[i]+=t);return Aa(this)},e.invalidate=function invalidate(t){var e=this._first;for(this._lock=0;e;)e.invalidate(t),e=e._next;return i.prototype.invalidate.call(this,t)},e.clear=function clear(t){void 0===t&&(t=!0);for(var e,r=this._first;r;)e=r._next,this.remove(r),r=e;return this._dp&&(this._time=this._tTime=this._pTime=0),t&&(this.labels={}),Aa(this)},e.totalDuration=function totalDuration(t){var e,r,i,n=0,a=this,s=a._last,o=U;if(arguments.length)return a.timeScale((a._repeat<0?a.duration():a.totalDuration())/(a.reversed()?-t:t));if(a._dirty){for(i=a.parent;s;)e=s._prev,s._dirty&&s.totalDuration(),o<(r=s._start)&&a._sort&&s._ts&&!a._lock?(a._lock=1,Ka(a,s,r-s._delay,1)._lock=0):o=r,r<0&&s._ts&&(n-=r,(!i&&!a._dp||i&&i.smoothChildTiming)&&(a._start+=r/a._ts,a._time-=r,a._tTime-=r),a.shiftChildren(-r,!1,-Infinity),o=0),s._end>n&&s._ts&&(n=s._end),s=e;Ra(a,a===I&&a._time>n?a._time:n,1,1),a._dirty=0}return a._tDur},Timeline.updateRoot=function updateRoot(t){if(I._ts&&(na(I,Ga(t,I)),f=Rt.frame),Rt.frame>=mt){mt+=q.autoSleep||120;var e=I._first;if((!e||!e._ts)&&q.autoSleep&&Rt._listeners.length<2){for(;e&&!e._ts;)e=e._next;e||Rt.sleep()}}},Timeline}(Ut);qa(Xt.prototype,{_lock:0,_hasPause:0,_forcing:0});function ac(t,e,i,n,a,o){var u,h,l,f;if(pt[t]&&!1!==(u=new pt[t]).init(a,u.rawVars?e[t]:function _processVars(t,e,i,n,a){if(s(t)&&(t=Kt(t,a,e,i,n)),!v(t)||t.style&&t.nodeType||$(t)||Z(t))return r(t)?Kt(t,a,e,i,n):t;var o,u={};for(o in t)u[o]=Kt(t[o],a,e,i,n);return u}(e[t],n,a,o,i),i,n,o)&&(i._pt=h=new _e(i._pt,a,t,0,1,u.render,u,0,u.priority),i!==c))for(l=i._ptLookup[i._targets.indexOf(a)],f=u._props.length;f--;)l[u._props[f]]=h;return u}function gc(t,r,e,i){var n,a,s=r.ease||i||"power1.inOut";if($(r))a=e[t]||(e[t]=[]),r.forEach(function(t,e){return a.push({t:e/(r.length-1)*100,v:t,e:s})});else for(n in r)a=e[n]||(e[n]=[]),"ease"===n||a.push({t:parseFloat(t),v:r[n],e:s})}var Nt,Wt,Qt=function _addPropTween(t,e,i,n,a,o,u,h,l,f){s(n)&&(n=n(a||0,t,o));var c,d=t[e],p="get"!==i?i:s(d)?l?t[e.indexOf("set")||!s(t["get"+e.substr(3)])?e:"get"+e.substr(3)](l):t[e]():d,_=s(d)?l?re:te:$t;if(r(n)&&(~n.indexOf("random(")&&(n=ob(n)),"="===n.charAt(1)&&(!(c=ka(p,n)+(Ya(p)||0))&&0!==c||(n=c))),!f||p!==n||Wt)return isNaN(p*n)||""===n?(d||e in t||Q(e,n),function _addComplexStringPropTween(t,e,r,i,n,a,s){var o,u,h,l,f,c,d,p,_=new _e(this._pt,t,e,0,1,ue,null,n),m=0,g=0;for(_.b=r,_.e=i,r+="",(d=~(i+="").indexOf("random("))&&(i=ob(i)),a&&(a(p=[r,i],t,e),r=p[0],i=p[1]),u=r.match(it)||[];o=it.exec(i);)l=o[0],f=i.substring(m,o.index),h?h=(h+1)%5:"rgba("===f.substr(-5)&&(h=1),l!==u[g++]&&(c=parseFloat(u[g-1])||0,_._pt={_next:_._pt,p:f||1===g?f:",",s:c,c:"="===l.charAt(1)?ka(c,l)-c:parseFloat(l)-c,m:h&&h<4?Math.round:0},m=it.lastIndex);return _.c=m")}),s.duration();else{for(l in u={},x)"ease"===l||"easeEach"===l||gc(l,x[l],u,x.easeEach);for(l in u)for(C=u[l].sort(function(t,e){return t.t-e.t}),o=D=0;o=t._tDur||e<0)&&t.ratio===u&&(u&&za(t,1),r||L||(At(t,u?"onComplete":"onReverseComplete",!0),t._prom&&t._prom()))}else t._zTime||(t._zTime=e)}(this,t,e,r);return this},e.targets=function targets(){return this._targets},e.invalidate=function invalidate(t){return t&&this.vars.runBackwards||(this._startAt=0),this._pt=this._op=this._onUpdate=this._lazy=this.ratio=0,this._ptLookup=[],this.timeline&&this.timeline.invalidate(t),z.prototype.invalidate.call(this,t)},e.resetTo=function resetTo(t,e,r,i){d||Rt.wake(),this._ts||this.play();var n,a=Math.min(this._dur,(this._dp._time-this._start)*this._ts);return this._initted||Gt(this,a),n=this._ease(a/this._dur),function _updatePropTweens(t,e,r,i,n,a,s){var o,u,h,l,f=(t._pt&&t._ptCache||(t._ptCache={}))[e];if(!f)for(f=t._ptCache[e]=[],h=t._ptLookup,l=t._targets.length;l--;){if((o=h[l][e])&&o.d&&o.d._pt)for(o=o.d._pt;o&&o.p!==e&&o.fp!==e;)o=o._next;if(!o)return Wt=1,t.vars[e]="+=0",Gt(t,s),Wt=0,1;f.push(o)}for(l=f.length;l--;)(o=(u=f[l])._pt||u).s=!i&&0!==i||n?o.s+(i||0)+a*o.c:i,o.c=r-o.s,u.e&&(u.e=ia(r)+Ya(u.e)),u.b&&(u.b=o.s+Ya(u.b))}(this,t,e,r,i,n,a)?this.resetTo(t,e,r,i):(Ia(this,0),this.parent||xa(this._dp,this,"_first","_last",this._dp._sort?"_start":0),this.render(0))},e.kill=function kill(t,e){if(void 0===e&&(e="all"),!(t||e&&"all"!==e))return this._lazy=this._pt=0,this.parent?tb(this):this;if(this.timeline){var i=this.timeline.totalDuration();return this.timeline.killTweensOf(t,e,Nt&&!0!==Nt.vars.overwrite)._first||tb(this),this.parent&&i!==this.timeline.totalDuration()&&Ra(this,this._dur*this.timeline._tDur/i,0,1),this}var n,a,s,o,u,h,l,f=this._targets,c=t?Ot(t):f,d=this._ptLookup,p=this._pt;if((!e||"all"===e)&&function _arraysMatch(t,e){for(var r=t.length,i=r===e.length;i&&r--&&t[r]===e[r];);return r<0}(f,c))return"all"===e&&(this._pt=0),tb(this);for(n=this._op=this._op||[],"all"!==e&&(r(e)&&(u={},ha(e,function(t){return u[t]=1}),e=u),e=function _addAliasesToVars(t,e){var r,i,n,a,s=t[0]?fa(t[0]).harness:0,o=s&&s.aliases;if(!o)return e;for(i in r=yt({},e),o)if(i in r)for(n=(a=o[i].split(",")).length;n--;)r[a[n]]=r[i];return r}(f,e)),l=f.length;l--;)if(~c.indexOf(f[l]))for(u in a=d[l],"all"===e?(n[l]=e,o=a,s={}):(s=n[l]=n[l]||{},o=e),o)(h=a&&a[u])&&("kill"in h.d&&!0!==h.d.kill(u)||ya(this,h,"_pt"),delete a[u]),"all"!==s&&(s[u]=1);return this._initted&&!this._pt&&p&&tb(this),this},Tween.to=function to(t,e,r){return new Tween(t,e,r)},Tween.from=function from(t,e){return Va(1,arguments)},Tween.delayedCall=function delayedCall(t,e,r,i){return new Tween(e,0,{immediateRender:!1,lazy:!1,overwrite:!1,delay:t,onComplete:e,onReverseComplete:e,onCompleteParams:r,onReverseCompleteParams:r,callbackScope:i})},Tween.fromTo=function fromTo(t,e,r){return Va(2,arguments)},Tween.set=function set(t,e){return e.duration=0,e.repeatDelay||(e.repeat=0),new Tween(t,e)},Tween.killTweensOf=function killTweensOf(t,e,r){return I.killTweensOf(t,e,r)},Tween}(Ut);qa(Zt.prototype,{_targets:[],_lazy:0,_startAt:0,_op:0,_onInit:0}),ha("staggerTo,staggerFrom,staggerFromTo",function(r){Zt[r]=function(){var t=new Xt,e=Mt.call(arguments,0);return e.splice("staggerFromTo"===r?5:4,0,0),t[r].apply(t,e)}});function oc(t,e,r){return t.setAttribute(e,r)}function wc(t,e,r,i){i.mSet(t,e,i.m.call(i.tween,r,i.mt),i)}var $t=function _setterPlain(t,e,r){return t[e]=r},te=function _setterFunc(t,e,r){return t[e](r)},re=function _setterFuncWithParam(t,e,r,i){return t[e](i.fp,r)},ne=function _getSetter(t,e){return s(t[e])?te:u(t[e])&&t.setAttribute?oc:$t},ae=function _renderPlain(t,e){return e.set(e.t,e.p,Math.round(1e6*(e.s+e.c*t))/1e6,e)},se=function _renderBoolean(t,e){return e.set(e.t,e.p,!!(e.s+e.c*t),e)},ue=function _renderComplexString(t,e){var r=e._pt,i="";if(!t&&e.b)i=e.b;else if(1===t&&e.e)i=e.e;else{for(;r;)i=r.p+(r.m?r.m(r.s+r.c*t):Math.round(1e4*(r.s+r.c*t))/1e4)+i,r=r._next;i+=e.c}e.set(e.t,e.p,i,e)},he=function _renderPropTweens(t,e){for(var r=e._pt;r;)r.r(t,r.d),r=r._next},fe=function _addPluginModifier(t,e,r,i){for(var n,a=this._pt;a;)n=a._next,a.p===i&&a.modifier(t,e,r),a=n},ce=function _killPropTweensOf(t){for(var e,r,i=this._pt;i;)r=i._next,i.p===t&&!i.op||i.op===t?ya(this,i,"_pt"):i.dep||(e=1),i=r;return!e},pe=function _sortPropTweensByPriority(t){for(var e,r,i,n,a=t._pt;a;){for(e=a._next,r=i;r&&r.pr>a.pr;)r=r._next;(a._prev=r?r._prev:n)?a._prev._next=a:i=a,(a._next=r)?r._prev=a:n=a,a=e}t._pt=i},_e=(PropTween.prototype.modifier=function modifier(t,e,r){this.mSet=this.mSet||this.set,this.set=wc,this.m=t,this.mt=r,this.tween=e},PropTween);function PropTween(t,e,r,i,n,a,s,o,u){this.t=e,this.s=i,this.c=n,this.p=r,this.r=a||ae,this.d=s||this,this.set=o||$t,this.pr=u||0,(this._next=t)&&(t._prev=this)}ha(vt+"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger",function(t){return ft[t]=1}),ot.TweenMax=ot.TweenLite=Zt,ot.TimelineLite=ot.TimelineMax=Xt,I=new Xt({sortChildren:!1,defaults:V,autoRemoveChildren:!0,id:"root",smoothChildTiming:!0}),q.stringFilter=Fb;function Ec(t){return(ye[t]||Te).map(function(t){return t()})}function Fc(){var t=Date.now(),o=[];2 typeof(value) === \"string\",\n\t_isFunction = value => typeof(value) === \"function\",\n\t_isNumber = value => typeof(value) === \"number\",\n\t_isUndefined = value => typeof(value) === \"undefined\",\n\t_isObject = value => typeof(value) === \"object\",\n\t_isNotFalse = value => value !== false,\n\t_windowExists = () => typeof(window) !== \"undefined\",\n\t_isFuncOrString = value => _isFunction(value) || _isString(value),\n\t_isTypedArray = (typeof ArrayBuffer === \"function\" && ArrayBuffer.isView) || function() {}, // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().\n\t_isArray = Array.isArray,\n\t_strictNumExp = /(?:-?\\.?\\d|\\.)+/gi, //only numbers (including negatives and decimals) but NOT relative values.\n\t_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g, //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n\t_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\n\t_complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi, //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.\n\t_relExp = /[+-]=-?[.\\d]+/,\n\t_delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi, // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.\n\t_unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\\s*$/i,\n\t_globalTimeline, _win, _coreInitted, _doc,\n\t_globals = {},\n\t_installScope = {},\n\t_coreReady,\n\t_install = scope => (_installScope = _merge(scope, _globals)) && gsap,\n\t_missingPlugin = (property, value) => console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\"),\n\t_warn = (message, suppress) => !suppress && console.warn(message),\n\t_addGlobal = (name, obj) => (name && (_globals[name] = obj) && (_installScope && (_installScope[name] = obj))) || _globals,\n\t_emptyFunc = () => 0,\n\t_startAtRevertConfig = {suppressEvents: true, isStart: true, kill: false},\n\t_revertConfigNoKill = {suppressEvents: true, kill: false},\n\t_revertConfig = {suppressEvents: true},\n\t_reservedProps = {},\n\t_lazyTweens = [],\n\t_lazyLookup = {},\n\t_lastRenderedFrame,\n\t_plugins = {},\n\t_effects = {},\n\t_nextGCFrame = 30,\n\t_harnessPlugins = [],\n\t_callbackNames = \"\",\n\t_harness = targets => {\n\t\tlet target = targets[0],\n\t\t\tharnessPlugin, i;\n\t\t_isObject(target) || _isFunction(target) || (targets = [targets]);\n\t\tif (!(harnessPlugin = (target._gsap || {}).harness)) { // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)\n\t\t\ti = _harnessPlugins.length;\n\t\t\twhile (i-- && !_harnessPlugins[i].targetTest(target)) {\t}\n\t\t\tharnessPlugin = _harnessPlugins[i];\n\t\t}\n\t\ti = targets.length;\n\t\twhile (i--) {\n\t\t\t(targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin)))) || targets.splice(i, 1);\n\t\t}\n\t\treturn targets;\n\t},\n\t_getCache = target => target._gsap || _harness(toArray(target))[0]._gsap,\n\t_getProperty = (target, property, v) => (v = target[property]) && _isFunction(v) ? target[property]() : (_isUndefined(v) && target.getAttribute && target.getAttribute(property)) || v,\n\t_forEachName = (names, func) => ((names = names.split(\",\")).forEach(func)) || names, //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).\n\t_round = value => Math.round(value * 100000) / 100000 || 0,\n\t_roundPrecise = value => Math.round(value * 10000000) / 10000000 || 0, // increased precision mostly for timing values.\n\t_parseRelative = (start, value) => {\n\t\tlet operator = value.charAt(0),\n\t\t\tend = parseFloat(value.substr(2));\n\t\tstart = parseFloat(start);\n\t\treturn operator === \"+\" ? start + end : operator === \"-\" ? start - end : operator === \"*\" ? start * end : start / end;\n\t},\n\t_arrayContainsAny = (toSearch, toFind) => { //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.\n\t\tlet l = toFind.length,\n\t\t\ti = 0;\n\t\tfor (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) { }\n\t\treturn (i < l);\n\t},\n\t_lazyRender = () => {\n\t\tlet l = _lazyTweens.length,\n\t\t\ta = _lazyTweens.slice(0),\n\t\t\ti, tween;\n\t\t_lazyLookup = {};\n\t\t_lazyTweens.length = 0;\n\t\tfor (i = 0; i < l; i++) {\n\t\t\ttween = a[i];\n\t\t\ttween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\n\t\t}\n\t},\n\t_lazySafeRender = (animation, time, suppressEvents, force) => {\n\t\t_lazyTweens.length && !_reverting && _lazyRender();\n\t\tanimation.render(time, suppressEvents, force || (_reverting && time < 0 && (animation._initted || animation._startAt)));\n\t\t_lazyTweens.length && !_reverting && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.\n\t},\n\t_numericIfPossible = value => {\n\t\tlet n = parseFloat(value);\n\t\treturn (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\n\t},\n\t_passThrough = p => p,\n\t_setDefaults = (obj, defaults) => {\n\t\tfor (let p in defaults) {\n\t\t\t(p in obj) || (obj[p] = defaults[p]);\n\t\t}\n\t\treturn obj;\n\t},\n\t_setKeyframeDefaults = excludeDuration => (obj, defaults) => {\n\t\tfor (let p in defaults) {\n\t\t\t(p in obj) || (p === \"duration\" && excludeDuration) || p === \"ease\" || (obj[p] = defaults[p]);\n\t\t}\n\t},\n\t_merge = (base, toMerge) => {\n\t\tfor (let p in toMerge) {\n\t\t\tbase[p] = toMerge[p];\n\t\t}\n\t\treturn base;\n\t},\n\t_mergeDeep = (base, toMerge) => {\n\t\tfor (let p in toMerge) {\n\t\t\tp !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\n\t\t}\n\t\treturn base;\n\t},\n\t_copyExcluding = (obj, excluding) => {\n\t\tlet copy = {},\n\t\t\tp;\n\t\tfor (p in obj) {\n\t\t\t(p in excluding) || (copy[p] = obj[p]);\n\t\t}\n\t\treturn copy;\n\t},\n\t_inheritDefaults = vars => {\n\t\tlet parent = vars.parent || _globalTimeline,\n\t\t\tfunc = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\n\t\tif (_isNotFalse(vars.inherit)) {\n\t\t\twhile (parent) {\n\t\t\t\tfunc(vars, parent.vars.defaults);\n\t\t\t\tparent = parent.parent || parent._dp;\n\t\t\t}\n\t\t}\n\t\treturn vars;\n\t},\n\t_arraysMatch = (a1, a2) => {\n\t\tlet i = a1.length,\n\t\t\tmatch = i === a2.length;\n\t\twhile (match && i-- && a1[i] === a2[i]) { }\n\t\treturn i < 0;\n\t},\n\t_addLinkedListItem = (parent, child, firstProp = \"_first\", lastProp = \"_last\", sortBy) => {\n\t\tlet prev = parent[lastProp],\n\t\t\tt;\n\t\tif (sortBy) {\n\t\t\tt = child[sortBy];\n\t\t\twhile (prev && prev[sortBy] > t) {\n\t\t\t\tprev = prev._prev;\n\t\t\t}\n\t\t}\n\t\tif (prev) {\n\t\t\tchild._next = prev._next;\n\t\t\tprev._next = child;\n\t\t} else {\n\t\t\tchild._next = parent[firstProp];\n\t\t\tparent[firstProp] = child;\n\t\t}\n\t\tif (child._next) {\n\t\t\tchild._next._prev = child;\n\t\t} else {\n\t\t\tparent[lastProp] = child;\n\t\t}\n\t\tchild._prev = prev;\n\t\tchild.parent = child._dp = parent;\n\t\treturn child;\n\t},\n\t_removeLinkedListItem = (parent, child, firstProp = \"_first\", lastProp = \"_last\") => {\n\t\tlet prev = child._prev,\n\t\t\tnext = child._next;\n\t\tif (prev) {\n\t\t\tprev._next = next;\n\t\t} else if (parent[firstProp] === child) {\n\t\t\tparent[firstProp] = next;\n\t\t}\n\t\tif (next) {\n\t\t\tnext._prev = prev;\n\t\t} else if (parent[lastProp] === child) {\n\t\t\tparent[lastProp] = prev;\n\t\t}\n\t\tchild._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.\n\t},\n\t_removeFromParent = (child, onlyIfParentHasAutoRemove) => {\n\t\tchild.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);\n\t\tchild._act = 0;\n\t},\n\t_uncache = (animation, child) => {\n\t\tif (animation && (!child || child._end > animation._dur || child._start < 0)) { // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)\n\t\t\tlet a = animation;\n\t\t\twhile (a) {\n\t\t\t\ta._dirty = 1;\n\t\t\t\ta = a.parent;\n\t\t\t}\n\t\t}\n\t\treturn animation;\n\t},\n\t_recacheAncestors = animation => {\n\t\tlet parent = animation.parent;\n\t\twhile (parent && parent.parent) { //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.\n\t\t\tparent._dirty = 1;\n\t\t\tparent.totalDuration();\n\t\t\tparent = parent.parent;\n\t\t}\n\t\treturn animation;\n\t},\n\t_rewindStartAt = (tween, totalTime, suppressEvents, force) => tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : (tween.vars.immediateRender && !tween.vars.autoRevert) || tween._startAt.render(totalTime, true, force)),\n\t_hasNoPausedAncestors = animation => !animation || (animation._ts && _hasNoPausedAncestors(animation.parent)),\n\t_elapsedCycleDuration = animation => animation._repeat ? _animationCycle(animation._tTime, (animation = animation.duration() + animation._rDelay)) * animation : 0,\n\t// feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.\n\t_animationCycle = (tTime, cycleDuration) => {\n\t\tlet whole = Math.floor(tTime /= cycleDuration);\n\t\treturn tTime && (whole === tTime) ? whole - 1 : whole;\n\t},\n\t_parentToChildTotalTime = (parentTime, child) => (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : (child._dirty ? child.totalDuration() : child._tDur)),\n\t_setEnd = animation => (animation._end = _roundPrecise(animation._start + ((animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum)) || 0))),\n\t_alignPlayhead = (animation, totalTime) => { // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.\n\t\tlet parent = animation._dp;\n\t\tif (parent && parent.smoothChildTiming && animation._ts) {\n\t\t\tanimation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\n\t\t\t_setEnd(animation);\n\t\t\tparent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.\n\t\t}\n\t\treturn animation;\n\t},\n\t/*\n\t_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {\n\t\tlet cycleDuration = duration + repeatDelay,\n\t\t\ttime = _round(clampedTotalTime % cycleDuration);\n\t\tif (time > duration) {\n\t\t\ttime = duration;\n\t\t}\n\t\treturn (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;\n\t},\n\t*/\n\t_postAddChecks = (timeline, child) => {\n\t\tlet t;\n\t\tif (child._time || (child._initted && !child._dur)) { //in case, for example, the _start is moved on a tween that has already rendered. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning.\n\t\t\tt = _parentToChildTotalTime(timeline.rawTime(), child);\n\t\t\tif (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\n\t\t\t\tchild.render(t, true);\n\t\t\t}\n\t\t}\n\t\t//if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.\n\t\tif (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\n\t\t\t//in case any of the ancestors had completed but should now be enabled...\n\t\t\tif (timeline._dur < timeline.duration()) {\n\t\t\t\tt = timeline;\n\t\t\t\twhile (t._dp) {\n\t\t\t\t\t(t.rawTime() >= 0) && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.\n\t\t\t\t\tt = t._dp;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttimeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.\n\t\t}\n\t},\n\t_addToTimeline = (timeline, child, position, skipChecks) => {\n\t\tchild.parent && _removeFromParent(child);\n\t\tchild._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\n\t\tchild._end = _roundPrecise(child._start + ((child.totalDuration() / Math.abs(child.timeScale())) || 0));\n\t\t_addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\n\t\t_isFromOrFromStart(child) || (timeline._recent = child);\n\t\tskipChecks || _postAddChecks(timeline, child);\n\t\ttimeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime); // if the timeline is reversed and the new child makes it longer, we may need to adjust the parent's _start (push it back)\n\t\treturn timeline;\n\t},\n\t_scrollTrigger = (animation, trigger) => (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation),\n\t_attemptInitTween = (tween, time, force, suppressEvents, tTime) => {\n\t\t_initTween(tween, time, tTime);\n\t\tif (!tween._initted) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (!force && tween._pt && !_reverting && ((tween._dur && tween.vars.lazy !== false) || (!tween._dur && tween.vars.lazy)) && _lastRenderedFrame !== _ticker.frame) {\n\t\t\t_lazyTweens.push(tween);\n\t\t\ttween._lazy = [tTime, suppressEvents];\n\t\t\treturn 1;\n\t\t}\n\t},\n\t_parentPlayheadIsBeforeStart = ({parent}) => parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent)), // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0\n\t_isFromOrFromStart = ({data}) => data === \"isFromStart\" || data === \"isStart\",\n\t_renderZeroDurationTween = (tween, totalTime, suppressEvents, force) => {\n\t\tlet prevRatio = tween.ratio,\n\t\t\tratio = totalTime < 0 || (!totalTime && ((!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween))) || ((tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)))) ? 0 : 1, // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the \"startAt\" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any \"from\" and \"fromTo\" startAt tweens are rendered the first time at a ratio of 1.\n\t\t\trepeatDelay = tween._rDelay,\n\t\t\ttTime = 0,\n\t\t\tpt, iteration, prevIteration;\n\t\tif (repeatDelay && tween._repeat) { // in case there's a zero-duration tween that has a repeat with a repeatDelay\n\t\t\ttTime = _clamp(0, tween._tDur, totalTime);\n\t\t\titeration = _animationCycle(tTime, repeatDelay);\n\t\t\ttween._yoyo && (iteration & 1) && (ratio = 1 - ratio);\n\t\t\tif (iteration !== _animationCycle(tween._tTime, repeatDelay)) { // if iteration changed\n\t\t\t\tprevRatio = 1 - ratio;\n\t\t\t\ttween.vars.repeatRefresh && tween._initted && tween.invalidate();\n\t\t\t}\n\t\t}\n\t\tif (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || (!totalTime && tween._zTime)) {\n\t\t\tif (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) { // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprevIteration = tween._zTime;\n\t\t\ttween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\t\t\tsuppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.\n\t\t\ttween.ratio = ratio;\n\t\t\ttween._from && (ratio = 1 - ratio);\n\t\t\ttween._time = 0;\n\t\t\ttween._tTime = tTime;\n\t\t\tpt = tween._pt;\n\t\t\twhile (pt) {\n\t\t\t\tpt.r(ratio, pt.d);\n\t\t\t\tpt = pt._next;\n\t\t\t}\n\t\t\ttotalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);\n\t\t\ttween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\n\t\t\ttTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\n\t\t\tif ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\n\t\t\t\tratio && _removeFromParent(tween, 1);\n\t\t\t\tif (!suppressEvents && !_reverting) {\n\t\t\t\t\t_callback(tween, (ratio ? \"onComplete\" : \"onReverseComplete\"), true);\n\t\t\t\t\ttween._prom && tween._prom();\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!tween._zTime) {\n\t\t\ttween._zTime = totalTime;\n\t\t}\n\t},\n\t_findNextPauseTween = (animation, prevTime, time) => {\n\t\tlet child;\n\t\tif (time > prevTime) {\n\t\t\tchild = animation._first;\n\t\t\twhile (child && child._start <= time) {\n\t\t\t\tif (child.data === \"isPause\" && child._start > prevTime) {\n\t\t\t\t\treturn child;\n\t\t\t\t}\n\t\t\t\tchild = child._next;\n\t\t\t}\n\t\t} else {\n\t\t\tchild = animation._last;\n\t\t\twhile (child && child._start >= time) {\n\t\t\t\tif (child.data === \"isPause\" && child._start < prevTime) {\n\t\t\t\t\treturn child;\n\t\t\t\t}\n\t\t\t\tchild = child._prev;\n\t\t\t}\n\t\t}\n\t},\n\t_setDuration = (animation, duration, skipUncache, leavePlayhead) => {\n\t\tlet repeat = animation._repeat,\n\t\t\tdur = _roundPrecise(duration) || 0,\n\t\t\ttotalProgress = animation._tTime / animation._tDur;\n\t\ttotalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\n\t\tanimation._dur = dur;\n\t\tanimation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + (animation._rDelay * repeat));\n\t\ttotalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, (animation._tTime = animation._tDur * totalProgress));\n\t\tanimation.parent && _setEnd(animation);\n\t\tskipUncache || _uncache(animation.parent, animation);\n\t\treturn animation;\n\t},\n\t_onUpdateTotalDuration = animation => (animation instanceof Timeline) ? _uncache(animation) : _setDuration(animation, animation._dur),\n\t_zeroPosition = {_start:0, endTime:_emptyFunc, totalDuration:_emptyFunc},\n\t_parsePosition = (animation, position, percentAnimation) => {\n\t\tlet labels = animation.labels,\n\t\t\trecent = animation._recent || _zeroPosition,\n\t\t\tclippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur, //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.\n\t\t\ti, offset, isPercent;\n\t\tif (_isString(position) && (isNaN(position) || (position in labels))) { //if the string is a number like \"1\", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).\n\t\t\toffset = position.charAt(0);\n\t\t\tisPercent = position.substr(-1) === \"%\";\n\t\t\ti = position.indexOf(\"=\");\n\t\t\tif (offset === \"<\" || offset === \">\") {\n\t\t\t\ti >= 0 && (position = position.replace(/=/, \"\"));\n\t\t\t\treturn (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\n\t\t\t}\n\t\t\tif (i < 0) {\n\t\t\t\t(position in labels) || (labels[position] = clippedDuration);\n\t\t\t\treturn labels[position];\n\t\t\t}\n\t\t\toffset = parseFloat(position.charAt(i-1) + position.substr(i+1));\n\t\t\tif (isPercent && percentAnimation) {\n\t\t\t\toffset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\n\t\t\t}\n\t\t\treturn (i > 1) ? _parsePosition(animation, position.substr(0, i-1), percentAnimation) + offset : clippedDuration + offset;\n\t\t}\n\t\treturn (position == null) ? clippedDuration : +position;\n\t},\n\t_createTweenType = (type, params, timeline) => {\n\t\tlet isLegacy = _isNumber(params[1]),\n\t\t\tvarsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\n\t\t\tvars = params[varsIndex],\n\t\t\tirVars, parent;\n\t\tisLegacy && (vars.duration = params[1]);\n\t\tvars.parent = timeline;\n\t\tif (type) {\n\t\t\tirVars = vars;\n\t\t\tparent = timeline;\n\t\t\twhile (parent && !(\"immediateRender\" in irVars)) { // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.\n\t\t\t\tirVars = parent.vars.defaults || {};\n\t\t\t\tparent = _isNotFalse(parent.vars.inherit) && parent.parent;\n\t\t\t}\n\t\t\tvars.immediateRender = _isNotFalse(irVars.immediateRender);\n\t\t\ttype < 2 ? (vars.runBackwards = 1) : (vars.startAt = params[varsIndex - 1]); // \"from\" vars\n\t\t}\n\t\treturn new Tween(params[0], vars, params[varsIndex + 1]);\n\t},\n\t_conditionalReturn = (value, func) => value || value === 0 ? func(value) : func,\n\t_clamp = (min, max, value) => value < min ? min : value > max ? max : value,\n\tgetUnit = (value, v) => !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : v[1], // note: protect against padded numbers as strings, like \"100.100\". That shouldn't return \"00\" as the unit. If it's numeric, return no unit.\n\tclamp = (min, max, value) => _conditionalReturn(value, v => _clamp(min, max, v)),\n\t_slice = [].slice,\n\t_isArrayLike = (value, nonEmpty) => value && (_isObject(value) && \"length\" in value && ((!nonEmpty && !value.length) || ((value.length - 1) in value && _isObject(value[0]))) && !value.nodeType && value !== _win),\n\t_flatten = (ar, leaveStrings, accumulator = []) => ar.forEach(value => (_isString(value) && !leaveStrings) || _isArrayLike(value, 1) ? accumulator.push(...toArray(value)) : accumulator.push(value)) || accumulator,\n\t//takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.\n\ttoArray = (value, scope, leaveStrings) => _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [],\n\tselector = value => {\n\t\tvalue = toArray(value)[0] || _warn(\"Invalid scope\") || {};\n\t\treturn v => {\n\t\t\tlet el = value.current || value.nativeElement || value;\n\t\t\treturn toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\n\t\t};\n\t},\n\tshuffle = a => a.sort(() => .5 - Math.random()), // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = Math.floor(Math.random() * i), v = a[--i], a[i] = a[j], a[j] = v); return a;\n\t//for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following\n\tdistribute = v => {\n\t\tif (_isFunction(v)) {\n\t\t\treturn v;\n\t\t}\n\t\tlet vars = _isObject(v) ? v : {each:v}, //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total \"amount\" that's chunked out among them all.\n\t\t\tease = _parseEase(vars.ease),\n\t\t\tfrom = vars.from || 0,\n\t\t\tbase = parseFloat(vars.base) || 0,\n\t\t\tcache = {},\n\t\t\tisDecimal = (from > 0 && from < 1),\n\t\t\tratios = isNaN(from) || isDecimal,\n\t\t\taxis = vars.axis,\n\t\t\tratioX = from,\n\t\t\tratioY = from;\n\t\tif (_isString(from)) {\n\t\t\tratioX = ratioY = {center:.5, edges:.5, end:1}[from] || 0;\n\t\t} else if (!isDecimal && ratios) {\n\t\t\tratioX = from[0];\n\t\t\tratioY = from[1];\n\t\t}\n\t\treturn (i, target, a) => {\n\t\t\tlet l = (a || vars).length,\n\t\t\t\tdistances = cache[l],\n\t\t\t\toriginX, originY, x, y, d, j, max, min, wrapAt;\n\t\t\tif (!distances) {\n\t\t\t\twrapAt = (vars.grid === \"auto\") ? 0 : (vars.grid || [1, _bigNum])[1];\n\t\t\t\tif (!wrapAt) {\n\t\t\t\t\tmax = -_bigNum;\n\t\t\t\t\twhile (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) { }\n\t\t\t\t\twrapAt--;\n\t\t\t\t}\n\t\t\t\tdistances = cache[l] = [];\n\t\t\t\toriginX = ratios ? (Math.min(wrapAt, l) * ratioX) - .5 : from % wrapAt;\n\t\t\t\toriginY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : (from / wrapAt) | 0;\n\t\t\t\tmax = 0;\n\t\t\t\tmin = _bigNum;\n\t\t\t\tfor (j = 0; j < l; j++) {\n\t\t\t\t\tx = (j % wrapAt) - originX;\n\t\t\t\t\ty = originY - ((j / wrapAt) | 0);\n\t\t\t\t\tdistances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs((axis === \"y\") ? y : x);\n\t\t\t\t\t(d > max) && (max = d);\n\t\t\t\t\t(d < min) && (min = d);\n\t\t\t\t}\n\t\t\t\t(from === \"random\") && shuffle(distances);\n\t\t\t\tdistances.max = max - min;\n\t\t\t\tdistances.min = min;\n\t\t\t\tdistances.v = l = (parseFloat(vars.amount) || (parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt)) || 0) * (from === \"edges\" ? -1 : 1);\n\t\t\t\tdistances.b = (l < 0) ? base - l : base;\n\t\t\t\tdistances.u = getUnit(vars.amount || vars.each) || 0; //unit\n\t\t\t\tease = (ease && l < 0) ? _invertEase(ease) : ease;\n\t\t\t}\n\t\t\tl = ((distances[i] - distances.min) / distances.max) || 0;\n\t\t\treturn _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors\n\t\t};\n\t},\n\t_roundModifier = v => { //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.\n\t\tlet p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())\n\t\treturn raw => {\n\t\t\tlet n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);\n\t\t\treturn (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!\n\t\t};\n\t},\n\tsnap = (snapTo, value) => {\n\t\tlet isArray = _isArray(snapTo),\n\t\t\tradius, is2D;\n\t\tif (!isArray && _isObject(snapTo)) {\n\t\t\tradius = isArray = snapTo.radius || _bigNum;\n\t\t\tif (snapTo.values) {\n\t\t\t\tsnapTo = toArray(snapTo.values);\n\t\t\t\tif ((is2D = !_isNumber(snapTo[0]))) {\n\t\t\t\t\tradius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsnapTo = _roundModifier(snapTo.increment);\n\t\t\t}\n\t\t}\n\t\treturn _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? raw => {is2D = snapTo(raw); return Math.abs(is2D - raw) <= radius ? is2D : raw; } : raw => {\n\t\t\tlet x = parseFloat(is2D ? raw.x : raw),\n\t\t\t\ty = parseFloat(is2D ? raw.y : 0),\n\t\t\t\tmin = _bigNum,\n\t\t\t\tclosest = 0,\n\t\t\t\ti = snapTo.length,\n\t\t\t\tdx, dy;\n\t\t\twhile (i--) {\n\t\t\t\tif (is2D) {\n\t\t\t\t\tdx = snapTo[i].x - x;\n\t\t\t\t\tdy = snapTo[i].y - y;\n\t\t\t\t\tdx = dx * dx + dy * dy;\n\t\t\t\t} else {\n\t\t\t\t\tdx = Math.abs(snapTo[i] - x);\n\t\t\t\t}\n\t\t\t\tif (dx < min) {\n\t\t\t\t\tmin = dx;\n\t\t\t\t\tclosest = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tclosest = (!radius || min <= radius) ? snapTo[closest] : raw;\n\t\t\treturn (is2D || closest === raw || _isNumber(raw)) ? closest : closest + getUnit(raw);\n\t\t});\n\t},\n\trandom = (min, max, roundingIncrement, returnFunction) => _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, () => _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? 10 ** ((roundingIncrement + \"\").length - 2) : 1) && (Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction)),\n\tpipe = (...functions) => value => functions.reduce((v, f) => f(v), value),\n\tunitize = (func, unit) => value => func(parseFloat(value)) + (unit || getUnit(value)),\n\tnormalize = (min, max, value) => mapRange(min, max, 0, 1, value),\n\t_wrapArray = (a, wrapper, value) => _conditionalReturn(value, index => a[~~wrapper(index)]),\n\twrap = function(min, max, value) { // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).\n\t\tlet range = max - min;\n\t\treturn _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, value => ((range + (value - min) % range) % range) + min);\n\t},\n\twrapYoyo = (min, max, value) => {\n\t\tlet range = max - min,\n\t\t\ttotal = range * 2;\n\t\treturn _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, value => {\n\t\t\tvalue = (total + (value - min) % total) % total || 0;\n\t\t\treturn min + ((value > range) ? (total - value) : value);\n\t\t});\n\t},\n\t_replaceRandom = value => { //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])\n\t\tlet prev = 0,\n\t\t\ts = \"\",\n\t\t\ti, nums, end, isArray;\n\t\twhile (~(i = value.indexOf(\"random(\", prev))) {\n\t\t\tend = value.indexOf(\")\", i);\n\t\t\tisArray = value.charAt(i + 7) === \"[\";\n\t\t\tnums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp);\n\t\t\ts += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5);\n\t\t\tprev = end + 1;\n\t\t}\n\t\treturn s + value.substr(prev, value.length - prev);\n\t},\n\tmapRange = (inMin, inMax, outMin, outMax, value) => {\n\t\tlet inRange = inMax - inMin,\n\t\t\toutRange = outMax - outMin;\n\t\treturn _conditionalReturn(value, value => outMin + ((((value - inMin) / inRange) * outRange) || 0));\n\t},\n\tinterpolate = (start, end, progress, mutate) => {\n\t\tlet func = isNaN(start + end) ? 0 : p => (1 - p) * start + p * end;\n\t\tif (!func) {\n\t\t\tlet isString = _isString(start),\n\t\t\t\tmaster = {},\n\t\t\t\tp, i, interpolators, l, il;\n\t\t\tprogress === true && (mutate = 1) && (progress = null);\n\t\t\tif (isString) {\n\t\t\t\tstart = {p: start};\n\t\t\t\tend = {p: end};\n\n\t\t\t} else if (_isArray(start) && !_isArray(end)) {\n\t\t\t\tinterpolators = [];\n\t\t\t\tl = start.length;\n\t\t\t\til = l - 2;\n\t\t\t\tfor (i = 1; i < l; i++) {\n\t\t\t\t\tinterpolators.push(interpolate(start[i-1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.\n\t\t\t\t}\n\t\t\t\tl--;\n\t\t\t\tfunc = p => {\n\t\t\t\t\tp *= l;\n\t\t\t\t\tlet i = Math.min(il, ~~p);\n\t\t\t\t\treturn interpolators[i](p - i);\n\t\t\t\t};\n\t\t\t\tprogress = end;\n\t\t\t} else if (!mutate) {\n\t\t\t\tstart = _merge(_isArray(start) ? [] : {}, start);\n\t\t\t}\n\t\t\tif (!interpolators) {\n\t\t\t\tfor (p in end) {\n\t\t\t\t\t_addPropTween.call(master, start, p, \"get\", end[p]);\n\t\t\t\t}\n\t\t\t\tfunc = p => _renderPropTweens(p, master) || (isString ? start.p : start);\n\t\t\t}\n\t\t}\n\t\treturn _conditionalReturn(progress, func);\n\t},\n\t_getLabelInDirection = (timeline, fromTime, backward) => { //used for nextLabel() and previousLabel()\n\t\tlet labels = timeline.labels,\n\t\t\tmin = _bigNum,\n\t\t\tp, distance, label;\n\t\tfor (p in labels) {\n\t\t\tdistance = labels[p] - fromTime;\n\t\t\tif ((distance < 0) === !!backward && distance && min > (distance = Math.abs(distance))) {\n\t\t\t\tlabel = p;\n\t\t\t\tmin = distance;\n\t\t\t}\n\t\t}\n\t\treturn label;\n\t},\n\t_callback = (animation, type, executeLazyFirst) => {\n\t\tlet v = animation.vars,\n\t\t\tcallback = v[type],\n\t\t\tprevContext = _context,\n\t\t\tcontext = animation._ctx,\n\t\t\tparams, scope, result;\n\t\tif (!callback) {\n\t\t\treturn;\n\t\t}\n\t\tparams = v[type + \"Params\"];\n\t\tscope = v.callbackScope || animation;\n\t\texecuteLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.\n\t\tcontext && (_context = context);\n\t\tresult = params ? callback.apply(scope, params) : callback.call(scope);\n\t\t_context = prevContext;\n\t\treturn result;\n\t},\n\t_interrupt = animation => {\n\t\t_removeFromParent(animation);\n\t\tanimation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);\n\t\tanimation.progress() < 1 && _callback(animation, \"onInterrupt\");\n\t\treturn animation;\n\t},\n\t_quickTween,\n\t_registerPluginQueue = [],\n\t_createPlugin = config => {\n\t\tif (_windowExists() && config) { // edge case: some build tools may pass in a null/undefined value\n\t\t\tconfig = !config.name && config.default || config; //UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.\n\t\t\tlet name = config.name,\n\t\t\t\tisFunc = _isFunction(config),\n\t\t\t\tPlugin = (name && !isFunc && config.init) ? function () {\n\t\t\t\t\tthis._props = [];\n\t\t\t\t} : config, //in case someone passes in an object that's not a plugin, like CustomEase\n\t\t\t\tinstanceDefaults = {init: _emptyFunc, render: _renderPropTweens, add: _addPropTween, kill: _killPropTweensOf, modifier: _addPluginModifier, rawVars: 0},\n\t\t\t\tstatics = {targetTest: 0, get: 0, getSetter: _getSetter, aliases: {}, register: 0};\n\t\t\t_wake();\n\t\t\tif (config !== Plugin) {\n\t\t\t\tif (_plugins[name]) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t_setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods\n\t\t\t\t_merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods\n\t\t\t\t_plugins[(Plugin.prop = name)] = Plugin;\n\t\t\t\tif (config.targetTest) {\n\t\t\t\t\t_harnessPlugins.push(Plugin);\n\t\t\t\t\t_reservedProps[name] = 1;\n\t\t\t\t}\n\t\t\t\tname = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\"; //for the global name. \"motionPath\" should become MotionPathPlugin\n\t\t\t}\n\t\t\t_addGlobal(name, Plugin);\n\t\t\tconfig.register && config.register(gsap, Plugin, PropTween);\n\t\t} else {\n\t\t\tconfig && _registerPluginQueue.push(config);\n\t\t}\n\t},\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * COLORS\n * --------------------------------------------------------------------------------------\n */\n\n\t_255 = 255,\n\t_colorLookup = {\n\t\taqua:[0,_255,_255],\n\t\tlime:[0,_255,0],\n\t\tsilver:[192,192,192],\n\t\tblack:[0,0,0],\n\t\tmaroon:[128,0,0],\n\t\tteal:[0,128,128],\n\t\tblue:[0,0,_255],\n\t\tnavy:[0,0,128],\n\t\twhite:[_255,_255,_255],\n\t\tolive:[128,128,0],\n\t\tyellow:[_255,_255,0],\n\t\torange:[_255,165,0],\n\t\tgray:[128,128,128],\n\t\tpurple:[128,0,128],\n\t\tgreen:[0,128,0],\n\t\tred:[_255,0,0],\n\t\tpink:[_255,192,203],\n\t\tcyan:[0,_255,_255],\n\t\ttransparent:[_255,_255,_255,0]\n\t},\n\t// possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:\n\t// let ctx = _doc.createElement(\"canvas\").getContext(\"2d\");\n\t// _forEachName(\"aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan\", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});\n\t_hue = (h, m1, m2) => {\n\t\th += h < 0 ? 1 : h > 1 ? -1 : 0;\n\t\treturn ((((h * 6 < 1) ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : (h * 3 < 2) ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255) + .5) | 0;\n\t},\n\tsplitColor = (v, toHSL, forceAlpha) => {\n\t\tlet a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, (v >> 8) & _255, v & _255] : 0,\n\t\t\tr, g, b, h, s, l, max, min, d, wasHSL;\n\t\tif (!a) {\n\t\t\tif (v.substr(-1) === \",\") { //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:\"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)\" - in this example \"blue,\" has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.\n\t\t\t\tv = v.substr(0, v.length - 1);\n\t\t\t}\n\t\t\tif (_colorLookup[v]) {\n\t\t\t\ta = _colorLookup[v];\n\t\t\t} else if (v.charAt(0) === \"#\") {\n\t\t\t\tif (v.length < 6) { //for shorthand like #9F0 or #9F0F (could have alpha)\n\t\t\t\t\tr = v.charAt(1);\n\t\t\t\t\tg = v.charAt(2);\n\t\t\t\t\tb = v.charAt(3);\n\t\t\t\t\tv = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\n\t\t\t\t}\n\t\t\t\tif (v.length === 9) { // hex with alpha, like #fd5e53ff\n\t\t\t\t\ta = parseInt(v.substr(1, 6), 16);\n\t\t\t\t\treturn [a >> 16, (a >> 8) & _255, a & _255, parseInt(v.substr(7), 16) / 255];\n\t\t\t\t}\n\t\t\t\tv = parseInt(v.substr(1), 16);\n\t\t\t\ta = [v >> 16, (v >> 8) & _255, v & _255];\n\t\t\t} else if (v.substr(0, 3) === \"hsl\") {\n\t\t\t\ta = wasHSL = v.match(_strictNumExp);\n\t\t\t\tif (!toHSL) {\n\t\t\t\t\th = (+a[0] % 360) / 360;\n\t\t\t\t\ts = +a[1] / 100;\n\t\t\t\t\tl = +a[2] / 100;\n\t\t\t\t\tg = (l <= .5) ? l * (s + 1) : l + s - l * s;\n\t\t\t\t\tr = l * 2 - g;\n\t\t\t\t\ta.length > 3 && (a[3] *= 1); //cast as number\n\t\t\t\t\ta[0] = _hue(h + 1 / 3, r, g);\n\t\t\t\t\ta[1] = _hue(h, r, g);\n\t\t\t\t\ta[2] = _hue(h - 1 / 3, r, g);\n\t\t\t\t} else if (~v.indexOf(\"=\")) { //if relative values are found, just return the raw strings with the relative prefixes in place.\n\t\t\t\t\ta = v.match(_numExp);\n\t\t\t\t\tforceAlpha && a.length < 4 && (a[3] = 1);\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ta = v.match(_strictNumExp) || _colorLookup.transparent;\n\t\t\t}\n\t\t\ta = a.map(Number);\n\t\t}\n\t\tif (toHSL && !wasHSL) {\n\t\t\tr = a[0] / _255;\n\t\t\tg = a[1] / _255;\n\t\t\tb = a[2] / _255;\n\t\t\tmax = Math.max(r, g, b);\n\t\t\tmin = Math.min(r, g, b);\n\t\t\tl = (max + min) / 2;\n\t\t\tif (max === min) {\n\t\t\t\th = s = 0;\n\t\t\t} else {\n\t\t\t\td = max - min;\n\t\t\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\t\t\th = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\n\t\t\t\th *= 60;\n\t\t\t}\n\t\t\ta[0] = ~~(h + .5);\n\t\t\ta[1] = ~~(s * 100 + .5);\n\t\t\ta[2] = ~~(l * 100 + .5);\n\t\t}\n\t\tforceAlpha && a.length < 4 && (a[3] = 1);\n\t\treturn a;\n\t},\n\t_colorOrderData = v => { // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a \"c\" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()\n\t\tlet values = [],\n\t\t\tc = [],\n\t\t\ti = -1;\n\t\tv.split(_colorExp).forEach(v => {\n\t\t\tlet a = v.match(_numWithUnitExp) || [];\n\t\t\tvalues.push(...a);\n\t\t\tc.push(i += a.length + 1);\n\t\t});\n\t\tvalues.c = c;\n\t\treturn values;\n\t},\n\t_formatColors = (s, toHSL, orderMatchData) => {\n\t\tlet result = \"\",\n\t\t\tcolors = (s + result).match(_colorExp),\n\t\t\ttype = toHSL ? \"hsla(\" : \"rgba(\",\n\t\t\ti = 0,\n\t\t\tc, shell, d, l;\n\t\tif (!colors) {\n\t\t\treturn s;\n\t\t}\n\t\tcolors = colors.map(color => (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\");\n\t\tif (orderMatchData) {\n\t\t\td = _colorOrderData(s);\n\t\t\tc = orderMatchData.c;\n\t\t\tif (c.join(result) !== d.c.join(result)) {\n\t\t\t\tshell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\n\t\t\t\tl = shell.length - 1;\n\t\t\t\tfor (; i < l; i++) {\n\t\t\t\t\tresult += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!shell) {\n\t\t\tshell = s.split(_colorExp);\n\t\t\tl = shell.length - 1;\n\t\t\tfor (; i < l; i++) {\n\t\t\t\tresult += shell[i] + colors[i];\n\t\t\t}\n\t\t}\n\t\treturn result + shell[l];\n\t},\n\t_colorExp = (function() {\n\t\tlet s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\", //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,\n\t\t\tp;\n\t\tfor (p in _colorLookup) {\n\t\t\ts += \"|\" + p + \"\\\\b\";\n\t\t}\n\t\treturn new RegExp(s + \")\", \"gi\");\n\t})(),\n\t_hslExp = /hsl[a]?\\(/,\n\t_colorStringFilter = a => {\n\t\tlet combined = a.join(\" \"),\n\t\t\ttoHSL;\n\t\t_colorExp.lastIndex = 0;\n\t\tif (_colorExp.test(combined)) {\n\t\t\ttoHSL = _hslExp.test(combined);\n\t\t\ta[1] = _formatColors(a[1], toHSL);\n\t\t\ta[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.\n\t\t\treturn true;\n\t\t}\n\t},\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * TICKER\n * --------------------------------------------------------------------------------------\n */\n\t_tickerActive,\n\t_ticker = (function() {\n\t\tlet _getTime = Date.now,\n\t\t\t_lagThreshold = 500,\n\t\t\t_adjustedLag = 33,\n\t\t\t_startTime = _getTime(),\n\t\t\t_lastUpdate = _startTime,\n\t\t\t_gap = 1000 / 240,\n\t\t\t_nextTime = _gap,\n\t\t\t_listeners = [],\n\t\t\t_id, _req, _raf, _self, _delta, _i,\n\t\t\t_tick = v => {\n\t\t\t\tlet elapsed = _getTime() - _lastUpdate,\n\t\t\t\t\tmanual = v === true,\n\t\t\t\t\toverlap, dispatch, time, frame;\n\t\t\t\telapsed > _lagThreshold && (_startTime += elapsed - _adjustedLag);\n\t\t\t\t_lastUpdate += elapsed;\n\t\t\t\ttime = _lastUpdate - _startTime;\n\t\t\t\toverlap = time - _nextTime;\n\t\t\t\tif (overlap > 0 || manual) {\n\t\t\t\t\tframe = ++_self.frame;\n\t\t\t\t\t_delta = time - _self.time * 1000;\n\t\t\t\t\t_self.time = time = time / 1000;\n\t\t\t\t\t_nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\n\t\t\t\t\tdispatch = 1;\n\t\t\t\t}\n\t\t\t\tmanual || (_id = _req(_tick)); //make sure the request is made before we dispatch the \"tick\" event so that timing is maintained. Otherwise, if processing the \"tick\" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.\n\t\t\t\tif (dispatch) {\n\t\t\t\t\tfor (_i = 0; _i < _listeners.length; _i++) { // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.\n\t\t\t\t\t\t_listeners[_i](time, _delta, frame, v);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t_self = {\n\t\t\ttime:0,\n\t\t\tframe:0,\n\t\t\ttick() {\n\t\t\t\t_tick(true);\n\t\t\t},\n\t\t\tdeltaRatio(fps) {\n\t\t\t\treturn _delta / (1000 / (fps || 60));\n\t\t\t},\n\t\t\twake() {\n\t\t\t\tif (_coreReady) {\n\t\t\t\t\tif (!_coreInitted && _windowExists()) {\n\t\t\t\t\t\t_win = _coreInitted = window;\n\t\t\t\t\t\t_doc = _win.document || {};\n\t\t\t\t\t\t_globals.gsap = gsap;\n\t\t\t\t\t\t(_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\n\t\t\t\t\t\t_install(_installScope || _win.GreenSockGlobals || (!_win.gsap && _win) || {});\n\t\t\t\t\t\t_raf = _win.requestAnimationFrame;\n\t\t\t\t\t\t_registerPluginQueue.forEach(_createPlugin);\n\t\t\t\t\t}\n\t\t\t\t\t_id && _self.sleep();\n\t\t\t\t\t_req = _raf || (f => setTimeout(f, (_nextTime - _self.time * 1000 + 1) | 0));\n\t\t\t\t\t_tickerActive = 1;\n\t\t\t\t\t_tick(2);\n\t\t\t\t}\n\t\t\t},\n\t\t\tsleep() {\n\t\t\t\t(_raf ? _win.cancelAnimationFrame : clearTimeout)(_id);\n\t\t\t\t_tickerActive = 0;\n\t\t\t\t_req = _emptyFunc;\n\t\t\t},\n\t\t\tlagSmoothing(threshold, adjustedLag) {\n\t\t\t\t_lagThreshold = threshold || Infinity; // zero should be interpreted as basically unlimited\n\t\t\t\t_adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);\n\t\t\t},\n\t\t\tfps(fps) {\n\t\t\t\t_gap = 1000 / (fps || 240);\n\t\t\t\t_nextTime = _self.time * 1000 + _gap;\n\t\t\t},\n\t\t\tadd(callback, once, prioritize) {\n\t\t\t\tlet func = once ? (t, d, f, v) => {callback(t, d, f, v); _self.remove(func);} : callback;\n\t\t\t\t_self.remove(callback);\n\t\t\t\t_listeners[prioritize ? \"unshift\" : \"push\"](func);\n\t\t\t\t_wake();\n\t\t\t\treturn func;\n\t\t\t},\n\t\t\tremove(callback, i) {\n\t\t\t\t~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\n\t\t\t},\n\t\t\t_listeners:_listeners\n\t\t};\n\t\treturn _self;\n\t})(),\n\t_wake = () => !_tickerActive && _ticker.wake(), //also ensures the core classes are initialized.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n* -------------------------------------------------\n* EASING\n* -------------------------------------------------\n*/\n\t_easeMap = {},\n\t_customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\n\t_quotesExp = /[\"']/g,\n\t_parseObjectInString = value => { //takes a string like \"{wiggles:10, type:anticipate})\" and turns it into a real object. Notice it ends in \")\" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.\n\t\tlet obj = {},\n\t\t\tsplit = value.substr(1, value.length-3).split(\":\"),\n\t\t\tkey = split[0],\n\t\t\ti = 1,\n\t\t\tl = split.length,\n\t\t\tindex, val, parsedVal;\n\t\tfor (; i < l; i++) {\n\t\t\tval = split[i];\n\t\t\tindex = i !== l-1 ? val.lastIndexOf(\",\") : val.length;\n\t\t\tparsedVal = val.substr(0, index);\n\t\t\tobj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\n\t\t\tkey = val.substr(index+1).trim();\n\t\t}\n\t\treturn obj;\n\t},\n\t_valueInParentheses = value => {\n\t\tlet open = value.indexOf(\"(\") + 1,\n\t\t\tclose = value.indexOf(\")\"),\n\t\t\tnested = value.indexOf(\"(\", open);\n\t\treturn value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\n\t},\n\t_configEaseFromString = name => { //name can be a string like \"elastic.out(1,0.5)\", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).\n\t\tlet split = (name + \"\").split(\"(\"),\n\t\t\tease = _easeMap[split[0]];\n\t\treturn (ease && split.length > 1 && ease.config) ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : (_easeMap._CE && _customEaseExp.test(name)) ? _easeMap._CE(\"\", name) : ease;\n\t},\n\t_invertEase = ease => p => 1 - ease(1 - p),\n\t// allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.\n\t_propagateYoyoEase = (timeline, isYoyo) => {\n\t\tlet child = timeline._first, ease;\n\t\twhile (child) {\n\t\t\tif (child instanceof Timeline) {\n\t\t\t\t_propagateYoyoEase(child, isYoyo);\n\t\t\t} else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {\n\t\t\t\tif (child.timeline) {\n\t\t\t\t\t_propagateYoyoEase(child.timeline, isYoyo);\n\t\t\t\t} else {\n\t\t\t\t\tease = child._ease;\n\t\t\t\t\tchild._ease = child._yEase;\n\t\t\t\t\tchild._yEase = ease;\n\t\t\t\t\tchild._yoyo = isYoyo;\n\t\t\t\t}\n\t\t\t}\n\t\t\tchild = child._next;\n\t\t}\n\t},\n\t_parseEase = (ease, defaultEase) => !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase,\n\t_insertEase = (names, easeIn, easeOut = p => 1 - easeIn(1 - p), easeInOut = (p => p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2)) => {\n\t\tlet ease = {easeIn, easeOut, easeInOut},\n\t\t\tlowercaseName;\n\t\t_forEachName(names, name => {\n\t\t\t_easeMap[name] = _globals[name] = ease;\n\t\t\t_easeMap[(lowercaseName = name.toLowerCase())] = easeOut;\n\t\t\tfor (let p in ease) {\n\t\t\t\t_easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\n\t\t\t}\n\t\t});\n\t\treturn ease;\n\t},\n\t_easeInOutFromOut = easeOut => (p => p < .5 ? (1 - easeOut(1 - (p * 2))) / 2 : .5 + easeOut((p - .5) * 2) / 2),\n\t_configElastic = (type, amplitude, period) => {\n\t\tlet p1 = (amplitude >= 1) ? amplitude : 1, //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.\n\t\t\tp2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\n\t\t\tp3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\n\t\t\teaseOut = p => p === 1 ? 1 : p1 * (2 ** (-10 * p)) * _sin((p - p3) * p2) + 1,\n\t\t\tease = (type === \"out\") ? easeOut : (type === \"in\") ? p => 1 - easeOut(1 - p) : _easeInOutFromOut(easeOut);\n\t\tp2 = _2PI / p2; //precalculate to optimize\n\t\tease.config = (amplitude, period) => _configElastic(type, amplitude, period);\n\t\treturn ease;\n\t},\n\t_configBack = (type, overshoot = 1.70158) => {\n\t\tlet easeOut = p => p ? ((--p) * p * ((overshoot + 1) * p + overshoot) + 1) : 0,\n\t\t\tease = type === \"out\" ? easeOut : type === \"in\" ? p => 1 - easeOut(1 - p) : _easeInOutFromOut(easeOut);\n\t\tease.config = overshoot => _configBack(type, overshoot);\n\t\treturn ease;\n\t};\n\t// a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n\t// _weightedEase = ratio => {\n\t// \tlet y = 0.5 + ratio / 2;\n\t// \treturn p => (2 * (1 - p) * p * y + p * p);\n\t// },\n\t// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n\t// _weightedEaseStrong = ratio => {\n\t// \tratio = .5 + ratio / 2;\n\t// \tlet o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),\n\t// \t\tb = ratio - o,\n\t// \t\tc = ratio + o;\n\t// \treturn p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;\n\t// };\n\n_forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", (name, i) => {\n\tlet power = i < 5 ? i + 1 : i;\n\t_insertEase(name + \",Power\" + (power - 1), i ? p => p ** power : p => p, p => 1 - (1 - p) ** power, p => p < .5 ? (p * 2) ** power / 2 : 1 - ((1 - p) * 2) ** power / 2);\n});\n_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\n_insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\n((n, c) => {\n\tlet n1 = 1 / c,\n\t\tn2 = 2 * n1,\n\t\tn3 = 2.5 * n1,\n\t\teaseOut = p => (p < n1) ? n * p * p : (p < n2) ? n * (p - 1.5 / c) ** 2 + .75 : (p < n3) ? n * (p -= 2.25 / c) * p + .9375 : n * (p - 2.625 / c) ** 2 + .984375;\n\t_insertEase(\"Bounce\", p => 1 - easeOut(1 - p), easeOut);\n})(7.5625, 2.75);\n_insertEase(\"Expo\", p => p ? 2 ** (10 * (p - 1)) : 0);\n_insertEase(\"Circ\", p => -(_sqrt(1 - (p * p)) - 1));\n_insertEase(\"Sine\", p => p === 1 ? 1 : -_cos(p * _HALF_PI) + 1);\n_insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\n_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\n\tconfig(steps = 1, immediateStart) {\n\t\tlet p1 = 1 / steps,\n\t\t\tp2 = steps + (immediateStart ? 0 : 1),\n\t\t\tp3 = immediateStart ? 1 : 0,\n\t\t\tmax = 1 - _tinyNum;\n\t\treturn p => (((p2 * _clamp(0, max, p)) | 0) + p3) * p1;\n\t}\n};\n_defaults.ease = _easeMap[\"quad.out\"];\n\n\n_forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", name => _callbackNames += name + \",\" + name + \"Params,\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * CACHE\n * --------------------------------------------------------------------------------------\n */\nexport class GSCache {\n\n\tconstructor(target, harness) {\n\t\tthis.id = _gsID++;\n\t\ttarget._gsap = this;\n\t\tthis.target = target;\n\t\tthis.harness = harness;\n\t\tthis.get = harness ? harness.get : _getProperty;\n\t\tthis.set = harness ? harness.getSetter : _getSetter;\n\t}\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * ANIMATION\n * --------------------------------------------------------------------------------------\n */\n\nexport class Animation {\n\n\tconstructor(vars) {\n\t\tthis.vars = vars;\n\t\tthis._delay = +vars.delay || 0;\n\t\tif ((this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0)) { // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.\n\t\t\tthis._rDelay = vars.repeatDelay || 0;\n\t\t\tthis._yoyo = !!vars.yoyo || !!vars.yoyoEase;\n\t\t}\n\t\tthis._ts = 1;\n\t\t_setDuration(this, +vars.duration, 1, 1);\n\t\tthis.data = vars.data;\n\t\tif (_context) {\n\t\t\tthis._ctx = _context;\n\t\t\t_context.data.push(this);\n\t\t}\n\t\t_tickerActive || _ticker.wake();\n\t}\n\n\tdelay(value) {\n\t\tif (value || value === 0) {\n\t\t\tthis.parent && this.parent.smoothChildTiming && (this.startTime(this._start + value - this._delay));\n\t\t\tthis._delay = value;\n\t\t\treturn this;\n\t\t}\n\t\treturn this._delay;\n\t}\n\n\tduration(value) {\n\t\treturn arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\n\t}\n\n\ttotalDuration(value) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._tDur;\n\t\t}\n\t\tthis._dirty = 0;\n\t\treturn _setDuration(this, this._repeat < 0 ? value : (value - (this._repeat * this._rDelay)) / (this._repeat + 1));\n\t}\n\n\ttotalTime(totalTime, suppressEvents) {\n\t\t_wake();\n\t\tif (!arguments.length) {\n\t\t\treturn this._tTime;\n\t\t}\n\t\tlet parent = this._dp;\n\t\tif (parent && parent.smoothChildTiming && this._ts) {\n\t\t\t_alignPlayhead(this, totalTime);\n\t\t\t!parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.\n\t\t\t//in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.\n\t\t\twhile (parent && parent.parent) {\n\t\t\t\tif (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\n\t\t\t\t\tparent.totalTime(parent._tTime, true);\n\t\t\t\t}\n\t\t\t\tparent = parent.parent;\n\t\t\t}\n\t\t\tif (!this.parent && this._dp.autoRemoveChildren && ((this._ts > 0 && totalTime < this._tDur) || (this._ts < 0 && totalTime > 0) || (!this._tDur && !totalTime) )) { //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.\n\t\t\t\t_addToTimeline(this._dp, this, this._start - this._delay);\n\t\t\t}\n\t\t}\n if (this._tTime !== totalTime || (!this._dur && !suppressEvents) || (this._initted && Math.abs(this._zTime) === _tinyNum) || (!totalTime && !this._initted && (this.add || this._ptLookup))) { // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)\n \tthis._ts || (this._pTime = totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause\n\t //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)\n\t\t // this._lock = 1;\n\t\t _lazySafeRender(this, totalTime, suppressEvents);\n\t\t // this._lock = 0;\n\t //}\n\t\t}\n\t\treturn this;\n\t}\n\n\ttime(value, suppressEvents) {\n\t\treturn arguments.length ? this.totalTime((Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay)) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!\n\t}\n\n\ttotalProgress(value, suppressEvents) {\n\t\treturn arguments.length ? this.totalTime( this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.ratio;\n\t}\n\n\tprogress(value, suppressEvents) {\n\t\treturn arguments.length ? this.totalTime( this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : (this.duration() ? Math.min(1, this._time / this._dur) : this.ratio);\n\t}\n\n\titeration(value, suppressEvents) {\n\t\tlet cycleDuration = this.duration() + this._rDelay;\n\t\treturn arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\n\t}\n\n\t// potential future addition:\n\t// isPlayingBackwards() {\n\t// \tlet animation = this,\n\t// \t\torientation = 1; // 1 = forward, -1 = backward\n\t// \twhile (animation) {\n\t// \t\torientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;\n\t// \t\tanimation = animation.parent;\n\t// \t}\n\t// \treturn orientation < 0;\n\t// }\n\n\ttimeScale(value) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.\n\t\t}\n\t\tif (this._rts === value) {\n\t\t\treturn this;\n\t\t}\n\t\tlet tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.\n\n\t\t// future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.\n\t\t//(+value < 0 && this._rts >= 0) && _callback(this, \"onReverse\", true);\n\n\t\t// prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.\n\t\tthis._rts = +value || 0;\n\t\tthis._ts = (this._ps || value === -_tinyNum) ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.\n\t\tthis.totalTime(_clamp(-Math.abs(this._delay), this._tDur, tTime), true);\n\t\t_setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.\n\t\treturn _recacheAncestors(this);\n\t}\n\n\tpaused(value) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._ps;\n\t\t}\n\t\tif (this._ps !== value) {\n\t\t\tthis._ps = value;\n\t\t\tif (value) {\n\t\t\t\tthis._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.\n\t\t\t\tthis._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the \"real\" timeScale as _rts (recorded time scale)\n\t\t\t} else {\n\t\t\t\t_wake();\n\t\t\t\tthis._ts = this._rts;\n\t\t\t\t//only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.\n\t\t\t\tthis.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, (this.progress() === 1) && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tstartTime(value) {\n\t\tif (arguments.length) {\n\t\t\tthis._start = value;\n\t\t\tlet parent = this.parent || this._dp;\n\t\t\tparent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay);\n\t\t\treturn this;\n\t\t}\n\t\treturn this._start;\n\t}\n\n\tendTime(includeRepeats) {\n\t\treturn this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\n\t}\n\n\trawTime(wrapRepeats) {\n\t\tlet parent = this.parent || this._dp; // _dp = detached parent\n\t\treturn !parent ? this._tTime : (wrapRepeats && (!this._ts || (this._repeat && this._time && this.totalProgress() < 1))) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\n\t}\n\n\trevert(config= _revertConfig) {\n\t\tlet prevIsReverting = _reverting;\n\t\t_reverting = config;\n\t\tif (this._initted || this._startAt) {\n\t\t\tthis.timeline && this.timeline.revert(config);\n\t\t\tthis.totalTime(-0.01, config.suppressEvents);\n\t\t}\n\t\tthis.data !== \"nested\" && config.kill !== false && this.kill();\n\t\t_reverting = prevIsReverting;\n\t\treturn this;\n\t}\n\n\tglobalTime(rawTime) {\n\t\tlet animation = this,\n\t\t\ttime = arguments.length ? rawTime : animation.rawTime();\n\t\twhile (animation) {\n\t\t\ttime = animation._start + time / (animation._ts || 1);\n\t\t\tanimation = animation._dp;\n\t\t}\n\t\treturn !this.parent && this._sat ? (this._sat.vars.immediateRender ? -1 : this._sat.globalTime(rawTime)) : time; // the _startAt tweens for .fromTo() and .from() that have immediateRender should always be FIRST in the timeline (important for context.revert()). \"_sat\" stands for _startAtTween, referring to the parent tween that created the _startAt. We must discern if that tween had immediateRender so that we can know whether or not to prioritize it in revert().\n\t}\n\n\trepeat(value) {\n\t\tif (arguments.length) {\n\t\t\tthis._repeat = value === Infinity ? -2 : value;\n\t\t\treturn _onUpdateTotalDuration(this);\n\t\t}\n\t\treturn this._repeat === -2 ? Infinity : this._repeat;\n\t}\n\n\trepeatDelay(value) {\n\t\tif (arguments.length) {\n\t\t\tlet time = this._time;\n\t\t\tthis._rDelay = value;\n\t\t\t_onUpdateTotalDuration(this);\n\t\t\treturn time ? this.time(time) : this;\n\t\t}\n\t\treturn this._rDelay;\n\t}\n\n\tyoyo(value) {\n\t\tif (arguments.length) {\n\t\t\tthis._yoyo = value;\n\t\t\treturn this;\n\t\t}\n\t\treturn this._yoyo;\n\t}\n\n\tseek(position, suppressEvents) {\n\t\treturn this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\n\t}\n\n\trestart(includeDelay, suppressEvents) {\n\t\treturn this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\n\t}\n\n\tplay(from, suppressEvents) {\n\t\tfrom != null && this.seek(from, suppressEvents);\n\t\treturn this.reversed(false).paused(false);\n\t}\n\n\treverse(from, suppressEvents) {\n\t\tfrom != null && this.seek(from || this.totalDuration(), suppressEvents);\n\t\treturn this.reversed(true).paused(false);\n\t}\n\n\tpause(atTime, suppressEvents) {\n\t\tatTime != null && this.seek(atTime, suppressEvents);\n\t\treturn this.paused(true);\n\t}\n\n\tresume() {\n\t\treturn this.paused(false);\n\t}\n\n\treversed(value) {\n\t\tif (arguments.length) {\n\t\t\t!!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.\n\t\t\treturn this;\n\t\t}\n\t\treturn this._rts < 0;\n\t}\n\n\tinvalidate() {\n\t\tthis._initted = this._act = 0;\n\t\tthis._zTime = -_tinyNum;\n\t\treturn this;\n\t}\n\n\tisActive() {\n\t\tlet parent = this.parent || this._dp,\n\t\t\tstart = this._start,\n\t\t\trawTime;\n\t\treturn !!(!parent || (this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum));\n\t}\n\n\teventCallback(type, callback, params) {\n\t\tlet vars = this.vars;\n\t\tif (arguments.length > 1) {\n\t\t\tif (!callback) {\n\t\t\t\tdelete vars[type];\n\t\t\t} else {\n\t\t\t\tvars[type] = callback;\n\t\t\t\tparams && (vars[type + \"Params\"] = params);\n\t\t\t\ttype === \"onUpdate\" && (this._onUpdate = callback);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\treturn vars[type];\n\t}\n\n\tthen(onFulfilled) {\n\t\tlet self = this;\n\t\treturn new Promise(resolve => {\n\t\t\tlet f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\n\t\t\t\t_resolve = () => {\n\t\t\t\t\tlet _then = self.then;\n\t\t\t\t\tself.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)\n\t\t\t\t\t_isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\n\t\t\t\t\tresolve(f);\n\t\t\t\t\tself.then = _then;\n\t\t\t\t};\n\t\t\tif (self._initted && (self.totalProgress() === 1 && self._ts >= 0) || (!self._tTime && self._ts < 0)) {\n\t\t\t\t_resolve();\n\t\t\t} else {\n\t\t\t\tself._prom = _resolve;\n\t\t\t}\n\t\t});\n\t}\n\n\tkill() {\n\t\t_interrupt(this);\n\t}\n\n}\n\n_setDefaults(Animation.prototype, {_time:0, _start:0, _end:0, _tTime:0, _tDur:0, _dirty:0, _repeat:0, _yoyo:false, parent:null, _initted:false, _rDelay:0, _ts:1, _dp:0, ratio:0, _zTime:-_tinyNum, _prom:0, _ps:false, _rts:1});\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * -------------------------------------------------\n * TIMELINE\n * -------------------------------------------------\n */\n\nexport class Timeline extends Animation {\n\n\tconstructor(vars = {}, position) {\n\t\tsuper(vars);\n\t\tthis.labels = {};\n\t\tthis.smoothChildTiming = !!vars.smoothChildTiming;\n\t\tthis.autoRemoveChildren = !!vars.autoRemoveChildren;\n\t\tthis._sort = _isNotFalse(vars.sortChildren);\n\t\t_globalTimeline && _addToTimeline(vars.parent || _globalTimeline, this, position);\n\t\tvars.reversed && this.reverse();\n\t\tvars.paused && this.paused(true);\n\t\tvars.scrollTrigger && _scrollTrigger(this, vars.scrollTrigger);\n\t}\n\n\tto(targets, vars, position) {\n\t\t_createTweenType(0, arguments, this);\n\t\treturn this;\n\t}\n\n\tfrom(targets, vars, position) {\n\t\t_createTweenType(1, arguments, this);\n\t\treturn this;\n\t}\n\n\tfromTo(targets, fromVars, toVars, position) {\n\t\t_createTweenType(2, arguments, this);\n\t\treturn this;\n\t}\n\n\tset(targets, vars, position) {\n\t\tvars.duration = 0;\n\t\tvars.parent = this;\n\t\t_inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\n\t\tvars.immediateRender = !!vars.immediateRender;\n\t\tnew Tween(targets, vars, _parsePosition(this, position), 1);\n\t\treturn this;\n\t}\n\n\tcall(callback, params, position) {\n\t\treturn _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\n\t}\n\n\t//ONLY for backward compatibility! Maybe delete?\n\tstaggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n\t\tvars.duration = duration;\n\t\tvars.stagger = vars.stagger || stagger;\n\t\tvars.onComplete = onCompleteAll;\n\t\tvars.onCompleteParams = onCompleteAllParams;\n\t\tvars.parent = this;\n\t\tnew Tween(targets, vars, _parsePosition(this, position));\n\t\treturn this;\n\t}\n\n\tstaggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n\t\tvars.runBackwards = 1;\n\t\t_inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\n\t\treturn this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\n\t}\n\n\tstaggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\n\t\ttoVars.startAt = fromVars;\n\t\t_inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\n\t\treturn this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\n\t}\n\n\trender(totalTime, suppressEvents, force) {\n\t\tlet prevTime = this._time,\n\t\t\ttDur = this._dirty ? this.totalDuration() : this._tDur,\n\t\t\tdur = this._dur,\n\t\t\ttTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime), // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.\n\t\t\tcrossingStart = (this._zTime < 0) !== (totalTime < 0) && (this._initted || !dur),\n\t\t\ttime, child, next, iteration, cycleDuration, prevPaused, pauseTween, timeScale, prevStart, prevIteration, yoyo, isYoyo;\n\t\tthis !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\n\t\tif (tTime !== this._tTime || force || crossingStart) {\n\t\t\tif (prevTime !== this._time && dur) { //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).\n\t\t\t\ttTime += this._time - prevTime;\n\t\t\t\ttotalTime += this._time - prevTime;\n\t\t\t}\n\t\t\ttime = tTime;\n\t\t\tprevStart = this._start;\n\t\t\ttimeScale = this._ts;\n\t\t\tprevPaused = !timeScale;\n\t\t\tif (crossingStart) {\n\t\t\t\tdur || (prevTime = this._zTime);\n\t\t\t\t //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\t\t\t\t(totalTime || !suppressEvents) && (this._zTime = totalTime);\n\t\t\t}\n\t\t\tif (this._repeat) { //adjust the time for repeats and yoyos\n\t\t\t\tyoyo = this._yoyo;\n\t\t\t\tcycleDuration = dur + this._rDelay;\n\t\t\t\tif (this._repeat < -1 && totalTime < 0) {\n\t\t\t\t\treturn this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n\t\t\t\t}\n\t\t\t\ttime = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\t\t\t\tif (tTime === tDur) { // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n\t\t\t\t\titeration = this._repeat;\n\t\t\t\t\ttime = dur;\n\t\t\t\t} else {\n\t\t\t\t\titeration = ~~(tTime / cycleDuration);\n\t\t\t\t\tif (iteration && iteration === tTime / cycleDuration) {\n\t\t\t\t\t\ttime = dur;\n\t\t\t\t\t\titeration--;\n\t\t\t\t\t}\n\t\t\t\t\ttime > dur && (time = dur);\n\t\t\t\t}\n\t\t\t\tprevIteration = _animationCycle(this._tTime, cycleDuration);\n\t\t\t\t!prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://greensock.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005 also, this._tTime - prevIteration * cycleDuration - this._dur <= 0 just checks to make sure it wasn't previously in the \"repeatDelay\" portion\n\t\t\t\tif (yoyo && (iteration & 1)) {\n\t\t\t\t\ttime = dur - time;\n\t\t\t\t\tisYoyo = 1;\n\t\t\t\t}\n\t\t\t\t/*\n\t\t\t\tmake sure children at the end/beginning of the timeline are rendered properly. If, for example,\n\t\t\t\ta 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which\n\t\t\t\twould get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there\n\t\t\t\tcould be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So\n\t\t\t\twe need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must\n\t\t\t\tensure that zero-duration tweens at the very beginning or end of the Timeline work.\n\t\t\t\t*/\n\t\t\t\tif (iteration !== prevIteration && !this._lock) {\n\t\t\t\t\tlet rewinding = (yoyo && (prevIteration & 1)),\n\t\t\t\t\t\tdoesWrap = (rewinding === (yoyo && (iteration & 1)));\n\t\t\t\t\titeration < prevIteration && (rewinding = !rewinding);\n\t\t\t\t\tprevTime = rewinding ? 0 : dur;\n\t\t\t\t\tthis._lock = 1;\n\t\t\t\t\tthis.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\n\t\t\t\t\tthis._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.\n\t\t\t\t\t!suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\t\t\t\t\tthis.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1);\n\t\t\t\t\tif ((prevTime && prevTime !== this._time) || prevPaused !== !this._ts || (this.vars.onRepeat && !this.parent && !this._act)) { // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\t\t\t\t\tdur = this._dur; // in case the duration changed in the onRepeat\n\t\t\t\t\ttDur = this._tDur;\n\t\t\t\t\tif (doesWrap) {\n\t\t\t\t\t\tthis._lock = 2;\n\t\t\t\t\t\tprevTime = rewinding ? dur : -0.0001;\n\t\t\t\t\t\tthis.render(prevTime, true);\n\t\t\t\t\t\tthis.vars.repeatRefresh && !isYoyo && this.invalidate();\n\t\t\t\t\t}\n\t\t\t\t\tthis._lock = 0;\n\t\t\t\t\tif (!this._ts && !prevPaused) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\t\t\t\t\t//in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.\n\t\t\t\t\t_propagateYoyoEase(this, isYoyo);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._hasPause && !this._forcing && this._lock < 2) {\n\t\t\t\tpauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\n\t\t\t\tif (pauseTween) {\n\t\t\t\t\ttTime -= time - (time = pauseTween._start);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._tTime = tTime;\n\t\t\tthis._time = time;\n\t\t\tthis._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n\t\t\tif (!this._initted) {\n\t\t\t\tthis._onUpdate = this.vars.onUpdate;\n\t\t\t\tthis._initted = 1;\n\t\t\t\tthis._zTime = totalTime;\n\t\t\t\tprevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).\n\t\t\t}\n\t\t\tif (!prevTime && time && !suppressEvents && !iteration) {\n\t\t\t\t_callback(this, \"onStart\");\n\t\t\t\tif (this._tTime !== tTime) { // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (time >= prevTime && totalTime >= 0) {\n\t\t\t\tchild = this._first;\n\t\t\t\twhile (child) {\n\t\t\t\t\tnext = child._next;\n\t\t\t\t\tif ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\n\t\t\t\t\t\tif (child.parent !== this) { // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n\t\t\t\t\t\t\treturn this.render(totalTime, suppressEvents, force);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchild.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\n\t\t\t\t\t\tif (time !== this._time || (!this._ts && !prevPaused)) { //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n\t\t\t\t\t\t\tpauseTween = 0;\n\t\t\t\t\t\t\tnext && (tTime += (this._zTime = -_tinyNum)); // it didn't finish rendering, so flag zTime as negative so that so that the next time render() is called it'll be forced (to render any remaining children)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchild = next;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchild = this._last;\n\t\t\t\tlet adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.\n\t\t\t\twhile (child) {\n\t\t\t\t\tnext = child._prev;\n\t\t\t\t\tif ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\n\t\t\t\t\t\tif (child.parent !== this) { // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n\t\t\t\t\t\t\treturn this.render(totalTime, suppressEvents, force);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchild.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || (_reverting && (child._initted || child._startAt))); // if reverting, we should always force renders of initted tweens (but remember that .fromTo() or .from() may have a _startAt but not _initted yet). If, for example, a .fromTo() tween with a stagger (which creates an internal timeline) gets reverted BEFORE some of its child tweens render for the first time, it may not properly trigger them to revert.\n\t\t\t\t\t\tif (time !== this._time || (!this._ts && !prevPaused)) { //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n\t\t\t\t\t\t\tpauseTween = 0;\n\t\t\t\t\t\t\tnext && (tTime += (this._zTime = adjustedTime ? -_tinyNum : _tinyNum)); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchild = next;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pauseTween && !suppressEvents) {\n\t\t\t\tthis.pause();\n\t\t\t\tpauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\n\t\t\t\tif (this._ts) { //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).\n\t\t\t\t\tthis._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.\n\t\t\t\t\t_setEnd(this);\n\t\t\t\t\treturn this.render(totalTime, suppressEvents, force);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\n\t\t\tif ((tTime === tDur && this._tTime >= this.totalDuration()) || (!tTime && prevTime)) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) { // remember, a child's callback may alter this timeline's playhead or timeScale which is why we need to add some of these checks.\n\t\t\t\t(totalTime || !dur) && ((tTime === tDur && this._ts > 0) || (!tTime && this._ts < 0)) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\t\t\t\tif (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\n\t\t\t\t\t_callback(this, (tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\"), true);\n\t\t\t\t\tthis._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tadd(child, position) {\n\t\t_isNumber(position) || (position = _parsePosition(this, position, child));\n\t\tif (!(child instanceof Animation)) {\n\t\t\tif (_isArray(child)) {\n\t\t\t\tchild.forEach(obj => this.add(obj, position));\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif (_isString(child)) {\n\t\t\t\treturn this.addLabel(child, position);\n\t\t\t}\n\t\t\tif (_isFunction(child)) {\n\t\t\t\tchild = Tween.delayedCall(0, child);\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\treturn this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!\n\t}\n\n\tgetChildren(nested = true, tweens = true, timelines = true, ignoreBeforeTime = -_bigNum) {\n\t\tlet a = [],\n\t\t\tchild = this._first;\n\t\twhile (child) {\n\t\t\tif (child._start >= ignoreBeforeTime) {\n\t\t\t\tif (child instanceof Tween) {\n\t\t\t\t\ttweens && a.push(child);\n\t\t\t\t} else {\n\t\t\t\t\ttimelines && a.push(child);\n\t\t\t\t\tnested && a.push(...child.getChildren(true, tweens, timelines));\n\t\t\t\t}\n\t\t\t}\n\t\t\tchild = child._next;\n\t\t}\n\t\treturn a;\n\t}\n\n\tgetById(id) {\n\t\tlet animations = this.getChildren(1, 1, 1),\n\t\t\ti = animations.length;\n\t\twhile(i--) {\n\t\t\tif (animations[i].vars.id === id) {\n\t\t\t\treturn animations[i];\n\t\t\t}\n\t\t}\n\t}\n\n\tremove(child) {\n\t\tif (_isString(child)) {\n\t\t\treturn this.removeLabel(child);\n\t\t}\n\t\tif (_isFunction(child)) {\n\t\t\treturn this.killTweensOf(child);\n\t\t}\n\t\t_removeLinkedListItem(this, child);\n\t\tif (child === this._recent) {\n\t\t\tthis._recent = this._last;\n\t\t}\n\t\treturn _uncache(this);\n\t}\n\n\ttotalTime(totalTime, suppressEvents) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._tTime;\n\t\t}\n\t\tthis._forcing = 1;\n\t\tif (!this._dp && this._ts) { //special case for the global timeline (or any other that has no parent or detached parent).\n\t\t\tthis._start = _roundPrecise(_ticker.time - (this._ts > 0 ? totalTime / this._ts : (this.totalDuration() - totalTime) / -this._ts));\n\t\t}\n\t\tsuper.totalTime(totalTime, suppressEvents);\n\t\tthis._forcing = 0;\n\t\treturn this;\n\t}\n\n\taddLabel(label, position) {\n\t\tthis.labels[label] = _parsePosition(this, position);\n\t\treturn this;\n\t}\n\n\tremoveLabel(label) {\n\t\tdelete this.labels[label];\n\t\treturn this;\n\t}\n\n\taddPause(position, callback, params) {\n\t\tlet t = Tween.delayedCall(0, callback || _emptyFunc, params);\n\t\tt.data = \"isPause\";\n\t\tthis._hasPause = 1;\n\t\treturn _addToTimeline(this, t, _parsePosition(this, position));\n\t}\n\n\tremovePause(position) {\n\t\tlet child = this._first;\n\t\tposition = _parsePosition(this, position);\n\t\twhile (child) {\n\t\t\tif (child._start === position && child.data === \"isPause\") {\n\t\t\t\t_removeFromParent(child);\n\t\t\t}\n\t\t\tchild = child._next;\n\t\t}\n\t}\n\n\tkillTweensOf(targets, props, onlyActive) {\n\t\tlet tweens = this.getTweensOf(targets, onlyActive),\n\t\t\ti = tweens.length;\n\t\twhile (i--) {\n\t\t\t(_overwritingTween !== tweens[i]) && tweens[i].kill(targets, props);\n\t\t}\n\t\treturn this;\n\t}\n\n\tgetTweensOf(targets, onlyActive) {\n\t\tlet a = [],\n\t\t\tparsedTargets = toArray(targets),\n\t\t\tchild = this._first,\n\t\t\tisGlobalTime = _isNumber(onlyActive), // a number is interpreted as a global time. If the animation spans\n\t\t\tchildren;\n\t\twhile (child) {\n\t\t\tif (child instanceof Tween) {\n\t\t\t\tif (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || (child._initted && child._ts)) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) { // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.\n\t\t\t\t\ta.push(child);\n\t\t\t\t}\n\t\t\t} else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\n\t\t\t\ta.push(...children);\n\t\t\t}\n\t\t\tchild = child._next;\n\t\t}\n\t\treturn a;\n\t}\n\n\t// potential future feature - targets() on timelines\n\t// targets() {\n\t// \tlet result = [];\n\t// \tthis.getChildren(true, true, false).forEach(t => result.push(...t.targets()));\n\t// \treturn result.filter((v, i) => result.indexOf(v) === i);\n\t// }\n\n\ttweenTo(position, vars) {\n\t\tvars = vars || {};\n\t\tlet tl = this,\n\t\t\tendTime = _parsePosition(tl, position),\n\t\t\t{ startAt, onStart, onStartParams, immediateRender } = vars,\n\t\t\tinitted,\n\t\t\ttween = Tween.to(tl, _setDefaults({\n\t\t\t\tease: vars.ease || \"none\",\n\t\t\t\tlazy: false,\n\t\t\t\timmediateRender: false,\n\t\t\t\ttime: endTime,\n\t\t\t\toverwrite: \"auto\",\n\t\t\t\tduration: vars.duration || (Math.abs((endTime - ((startAt && \"time\" in startAt) ? startAt.time : tl._time)) / tl.timeScale())) || _tinyNum,\n\t\t\t\tonStart: () => {\n\t\t\t\t\ttl.pause();\n\t\t\t\t\tif (!initted) {\n\t\t\t\t\t\tlet duration = vars.duration || Math.abs((endTime - ((startAt && \"time\" in startAt) ? startAt.time : tl._time)) / tl.timeScale());\n\t\t\t\t\t\t(tween._dur !== duration) && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\n\t\t\t\t\t\tinitted = 1;\n\t\t\t\t\t}\n\t\t\t\t\tonStart && onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.\n\t\t\t\t}\n\t\t\t}, vars));\n\t\treturn immediateRender ? tween.render(0) : tween;\n\t}\n\n\ttweenFromTo(fromPosition, toPosition, vars) {\n\t\treturn this.tweenTo(toPosition, _setDefaults({startAt:{time:_parsePosition(this, fromPosition)}}, vars));\n\t}\n\n\trecent() {\n\t\treturn this._recent;\n\t}\n\n\tnextLabel(afterTime = this._time) {\n\t\treturn _getLabelInDirection(this, _parsePosition(this, afterTime));\n\t}\n\n\tpreviousLabel(beforeTime = this._time) {\n\t\treturn _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\n\t}\n\n\tcurrentLabel(value) {\n\t\treturn arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\n\t}\n\n\tshiftChildren(amount, adjustLabels, ignoreBeforeTime = 0) {\n\t\tlet child = this._first,\n\t\t\tlabels = this.labels,\n\t\t\tp;\n\t\twhile (child) {\n\t\t\tif (child._start >= ignoreBeforeTime) {\n\t\t\t\tchild._start += amount;\n\t\t\t\tchild._end += amount;\n\t\t\t}\n\t\t\tchild = child._next;\n\t\t}\n\t\tif (adjustLabels) {\n\t\t\tfor (p in labels) {\n\t\t\t\tif (labels[p] >= ignoreBeforeTime) {\n\t\t\t\t\tlabels[p] += amount;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn _uncache(this);\n\t}\n\n\tinvalidate(soft) {\n\t\tlet child = this._first;\n\t\tthis._lock = 0;\n\t\twhile (child) {\n\t\t\tchild.invalidate(soft);\n\t\t\tchild = child._next;\n\t\t}\n\t\treturn super.invalidate(soft);\n\t}\n\n\tclear(includeLabels = true) {\n\t\tlet child = this._first,\n\t\t\tnext;\n\t\twhile (child) {\n\t\t\tnext = child._next;\n\t\t\tthis.remove(child);\n\t\t\tchild = next;\n\t\t}\n\t\tthis._dp && (this._time = this._tTime = this._pTime = 0);\n\t\tincludeLabels && (this.labels = {});\n\t\treturn _uncache(this);\n\t}\n\n\ttotalDuration(value) {\n\t\tlet max = 0,\n\t\t\tself = this,\n\t\t\tchild = self._last,\n\t\t\tprevStart = _bigNum,\n\t\t\tprev, start, parent;\n\t\tif (arguments.length) {\n\t\t\treturn self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\n\t\t}\n\t\tif (self._dirty) {\n\t\t\tparent = self.parent;\n\t\t\twhile (child) {\n\t\t\t\tprev = child._prev; //record it here in case the tween changes position in the sequence...\n\t\t\t\tchild._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.\n\t\t\t\tstart = child._start;\n\t\t\t\tif (start > prevStart && self._sort && child._ts && !self._lock) { //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence\n\t\t\t\t\tself._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().\n\t\t\t\t\t_addToTimeline(self, child, start - child._delay, 1)._lock = 0;\n\t\t\t\t} else {\n\t\t\t\t\tprevStart = start;\n\t\t\t\t}\n\t\t\t\tif (start < 0 && child._ts) { //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.\n\t\t\t\t\tmax -= start;\n\t\t\t\t\tif ((!parent && !self._dp) || (parent && parent.smoothChildTiming)) {\n\t\t\t\t\t\tself._start += start / self._ts;\n\t\t\t\t\t\tself._time -= start;\n\t\t\t\t\t\tself._tTime -= start;\n\t\t\t\t\t}\n\t\t\t\t\tself.shiftChildren(-start, false, -1e999);\n\t\t\t\t\tprevStart = 0;\n\t\t\t\t}\n\t\t\t\tchild._end > max && child._ts && (max = child._end);\n\t\t\t\tchild = prev;\n\t\t\t}\n\t\t\t_setDuration(self, (self === _globalTimeline && self._time > max) ? self._time : max, 1, 1);\n\t\t\tself._dirty = 0;\n\t\t}\n\t\treturn self._tDur;\n\t}\n\n\tstatic updateRoot(time) {\n\t\tif (_globalTimeline._ts) {\n\t\t\t_lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\n\t\t\t_lastRenderedFrame = _ticker.frame;\n\t\t}\n\t\tif (_ticker.frame >= _nextGCFrame) {\n\t\t\t_nextGCFrame += _config.autoSleep || 120;\n\t\t\tlet child = _globalTimeline._first;\n\t\t\tif (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\n\t\t\t\twhile (child && !child._ts) {\n\t\t\t\t\tchild = child._next;\n\t\t\t\t}\n\t\t\t\tchild || _ticker.sleep();\n\t\t\t}\n\t\t}\n\t}\n\n}\n\n_setDefaults(Timeline.prototype, {_lock:0, _hasPause:0, _forcing:0});\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet _addComplexStringPropTween = function(target, prop, start, end, setter, stringFilter, funcParam) { //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\t\tlet pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\n\t\t\tindex = 0,\n\t\t\tmatchIndex = 0,\n\t\t\tresult,\tstartNums, color, endNum, chunk, startNum, hasRandom, a;\n\t\tpt.b = start;\n\t\tpt.e = end;\n\t\tstart += \"\"; //ensure values are strings\n\t\tend += \"\";\n\t\tif ((hasRandom = ~end.indexOf(\"random(\"))) {\n\t\t\tend = _replaceRandom(end);\n\t\t}\n\t\tif (stringFilter) {\n\t\t\ta = [start, end];\n\t\t\tstringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.\n\t\t\tstart = a[0];\n\t\t\tend = a[1];\n\t\t}\n\t\tstartNums = start.match(_complexStringNumExp) || [];\n\t\twhile ((result = _complexStringNumExp.exec(end))) {\n\t\t\tendNum = result[0];\n\t\t\tchunk = end.substring(index, result.index);\n\t\t\tif (color) {\n\t\t\t\tcolor = (color + 1) % 5;\n\t\t\t} else if (chunk.substr(-5) === \"rgba(\") {\n\t\t\t\tcolor = 1;\n\t\t\t}\n\t\t\tif (endNum !== startNums[matchIndex++]) {\n\t\t\t\tstartNum = parseFloat(startNums[matchIndex-1]) || 0;\n\t\t\t\t//these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\t\t\t\tpt._pt = {\n\t\t\t\t\t_next: pt._pt,\n\t\t\t\t\tp: (chunk || matchIndex === 1) ? chunk : \",\", //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n\t\t\t\t\ts: startNum,\n\t\t\t\t\tc: endNum.charAt(1) === \"=\" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,\n\t\t\t\t\tm: (color && color < 4) ? Math.round : 0\n\t\t\t\t};\n\t\t\t\tindex = _complexStringNumExp.lastIndex;\n\t\t\t}\n\t\t}\n\t\tpt.c = (index < end.length) ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\t\tpt.fp = funcParam;\n\t\tif (_relExp.test(end) || hasRandom) {\n\t\t\tpt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\t\t}\n\t\tthis._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\t\treturn pt;\n\t},\n\t_addPropTween = function(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {\n\t\t_isFunction(end) && (end = end(index || 0, target, targets));\n\t\tlet currentValue = target[prop],\n\t\t\tparsedStart = (start !== \"get\") ? start : !_isFunction(currentValue) ? currentValue : (funcParam ? target[(prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)])) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop]()),\n\t\t\tsetter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\n\t\t\tpt;\n\t\tif (_isString(end)) {\n\t\t\tif (~end.indexOf(\"random(\")) {\n\t\t\t\tend = _replaceRandom(end);\n\t\t\t}\n\t\t\tif (end.charAt(1) === \"=\") {\n\t\t\t\tpt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);\n\t\t\t\tif (pt || pt === 0) { // to avoid isNaN, like if someone passes in a value like \"!= whatever\"\n\t\t\t\t\tend = pt;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!optional || parsedStart !== end || _forceAllPropTweens) {\n\t\t\tif (!isNaN(parsedStart * end) && end !== \"\") { // fun fact: any number multiplied by \"\" is evaluated as the number 0!\n\t\t\t\tpt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof(currentValue) === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\n\t\t\t\tfuncParam && (pt.fp = funcParam);\n\t\t\t\tmodifier && pt.modifier(modifier, this, target);\n\t\t\t\treturn (this._pt = pt);\n\t\t\t}\n\t\t\t!currentValue && !(prop in target) && _missingPlugin(prop, end);\n\t\t\treturn _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\n\t\t}\n\t},\n\t//creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with \"random()\" in them. It does NOT process relative values.\n\t_processVars = (vars, index, target, targets, tween) => {\n\t\t_isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\n\t\tif (!_isObject(vars) || (vars.style && vars.nodeType) || _isArray(vars) || _isTypedArray(vars)) {\n\t\t\treturn _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\n\t\t}\n\t\tlet copy = {},\n\t\t\tp;\n\t\tfor (p in vars) {\n\t\t\tcopy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\n\t\t}\n\t\treturn copy;\n\t},\n\t_checkPlugin = (property, vars, tween, index, target, targets) => {\n\t\tlet plugin, pt, ptLookup, i;\n\t\tif (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\n\t\t\ttween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\t\t\tif (tween !== _quickTween) {\n\t\t\t\tptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.\n\t\t\t\ti = plugin._props.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tptLookup[plugin._props[i]] = pt;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn plugin;\n\t},\n\t_overwritingTween, //store a reference temporarily so we can avoid overwriting itself.\n\t_forceAllPropTweens,\n\t_initTween = (tween, time, tTime) => {\n\t\tlet vars = tween.vars,\n\t\t\t{ ease, startAt, immediateRender, lazy, onUpdate, onUpdateParams, callbackScope, runBackwards, yoyoEase, keyframes, autoRevert } = vars,\n\t\t\tdur = tween._dur,\n\t\t\tprevStartAt = tween._startAt,\n\t\t\ttargets = tween._targets,\n\t\t\tparent = tween.parent,\n\t\t\t//when a stagger (or function-based duration/delay) is on a Tween instance, we create a nested timeline which means that the \"targets\" of that tween don't reflect the parent. This function allows us to discern when it's a nested tween and in that case, return the full targets array so that function-based values get calculated properly. Also remember that if the tween has a stagger AND keyframes, it could be multiple levels deep which is why we store the targets Array in the vars of the timeline.\n\t\t\tfullTargets = (parent && parent.data === \"nested\") ? parent.vars.targets : targets,\n\t\t\tautoOverwrite = (tween._overwrite === \"auto\") && !_suppressOverwrites,\n\t\t\ttl = tween.timeline,\n\t\t\tcleanVars, i, p, pt, target, hasPriority, gsData, harness, plugin, ptLookup, index, harnessVars, overwritten;\n\t\ttl && (!keyframes || !ease) && (ease = \"none\");\n\t\ttween._ease = _parseEase(ease, _defaults.ease);\n\t\ttween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;\n\t\tif (yoyoEase && tween._yoyo && !tween._repeat) { //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.\n\t\t\tyoyoEase = tween._yEase;\n\t\t\ttween._yEase = tween._ease;\n\t\t\ttween._ease = yoyoEase;\n\t\t}\n\t\ttween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.\n\t\tif (!tl || (keyframes && !vars.stagger)) { //if there's an internal timeline, skip all the parsing because we passed that task down the chain.\n\t\t\tharness = targets[0] ? _getCache(targets[0]).harness : 0;\n\t\t\tharnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an \"x\" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.\n\t\t\tcleanVars = _copyExcluding(vars, _reservedProps);\n\t\t\tif (prevStartAt) {\n\t\t\t\tprevStartAt._zTime < 0 && prevStartAt.progress(1); // in case it's a lazy startAt that hasn't rendered yet.\n\t\t\t\t(time < 0 && runBackwards && immediateRender && !autoRevert) ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig); // if it's a \"startAt\" (not \"from()\" or runBackwards: true), we only need to do a shallow revert (keep transforms cached in CSSPlugin)\n\t\t\t\t// don't just _removeFromParent(prevStartAt.render(-1, true)) because that'll leave inline styles. We're creating a new _startAt for \"startAt\" tweens that re-capture things to ensure that if the pre-tween values changed since the tween was created, they're recorded.\n\t\t\t\tprevStartAt._lazy = 0;\n\t\t\t}\n\t\t\tif (startAt) {\n\t\t\t\t_removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({data: \"isStart\", overwrite: false, parent: parent, immediateRender: true, lazy: !prevStartAt && _isNotFalse(lazy), startAt: null, delay: 0, onUpdate: onUpdate, onUpdateParams: onUpdateParams, callbackScope: callbackScope, stagger: 0}, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);\n\t\t\t\ttween._startAt._dp = 0; // don't allow it to get put back into root timeline! Like when revert() is called and totalTime() gets set.\n\t\t\t\ttween._startAt._sat = tween; // used in globalTime(). _sat stands for _startAtTween\n\t\t\t\t(time < 0 && (_reverting || (!immediateRender && !autoRevert))) && tween._startAt.revert(_revertConfigNoKill); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.\n\t\t\t\tif (immediateRender) {\n\t\t\t\t\tif (dur && time <= 0 && tTime <= 0) { // check tTime here because in the case of a yoyo tween whose playhead gets pushed to the end like tween.progress(1), we should allow it through so that the onComplete gets fired properly.\n\t\t\t\t\t\ttime && (tween._zTime = time);\n\t\t\t\t\t\treturn; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (runBackwards && dur) {\n\t\t\t\t//from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)\n\t\t\t\tif (!prevStartAt) {\n\t\t\t\t\ttime && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0\n\t\t\t\t\tp = _setDefaults({\n\t\t\t\t\t\toverwrite: false,\n\t\t\t\t\t\tdata: \"isFromStart\", //we tag the tween with as \"isFromStart\" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a \"from()\" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:\"height\", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.\n\t\t\t\t\t\tlazy: immediateRender && !prevStartAt && _isNotFalse(lazy),\n\t\t\t\t\t\timmediateRender: immediateRender, //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)\n\t\t\t\t\t\tstagger: 0,\n\t\t\t\t\t\tparent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(\".class\", {y:gsap.utils.wrap([-100,100])})\n\t\t\t\t\t}, cleanVars);\n\t\t\t\t\tharnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})\n\t\t\t\t\t_removeFromParent(tween._startAt = Tween.set(targets, p));\n\t\t\t\t\ttween._startAt._dp = 0; // don't allow it to get put back into root timeline!\n\t\t\t\t\ttween._startAt._sat = tween; // used in globalTime()\n\t\t\t\t\t(time < 0) && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));\n\t\t\t\t\ttween._zTime = time;\n\t\t\t\t\tif (!immediateRender) {\n\t\t\t\t\t\t_initTween(tween._startAt, _tinyNum, _tinyNum); //ensures that the initial values are recorded\n\t\t\t\t\t} else if (!time) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttween._pt = tween._ptCache = 0;\n\t\t\tlazy = (dur && _isNotFalse(lazy)) || (lazy && !dur);\n\t\t\tfor (i = 0; i < targets.length; i++) {\n\t\t\t\ttarget = targets[i];\n\t\t\t\tgsData = target._gsap || _harness(targets)[i]._gsap;\n\t\t\t\ttween._ptLookup[i] = ptLookup = {};\n\t\t\t\t_lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)\n\t\t\t\tindex = fullTargets === targets ? i : fullTargets.indexOf(target);\n\t\t\t\tif (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\n\t\t\t\t\ttween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\t\t\t\t\tplugin._props.forEach(name => {ptLookup[name] = pt;});\n\t\t\t\t\tplugin.priority && (hasPriority = 1);\n\t\t\t\t}\n\t\t\t\tif (!harness || harnessVars) {\n\t\t\t\t\tfor (p in cleanVars) {\n\t\t\t\t\t\tif (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\n\t\t\t\t\t\t\tplugin.priority && (hasPriority = 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttween._op && tween._op[i] && tween.kill(target, tween._op[i]);\n\t\t\t\tif (autoOverwrite && tween._pt) {\n\t\t\t\t\t_overwritingTween = tween;\n\t\t\t\t\t_globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!\n\t\t\t\t\toverwritten = !tween.parent;\n\t\t\t\t\t_overwritingTween = 0;\n\t\t\t\t}\n\t\t\t\ttween._pt && lazy && (_lazyLookup[gsData.id] = 1);\n\t\t\t}\n\t\t\thasPriority && _sortPropTweensByPriority(tween);\n\t\t\ttween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.\n\t\t}\n\t\ttween._onUpdate = onUpdate;\n\t\ttween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.\n\t\t(keyframes && time <= 0) && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the \"before\" state for any staggered/delayed animations thus when the following tween initializes, it'll use the \"before\" state instead of the \"after\" state as the initial values.\n\t},\n\t_updatePropTweens = (tween, property, value, start, startIsRelative, ratio, time) => {\n\t\tlet ptCache = ((tween._pt && tween._ptCache) || (tween._ptCache = {}))[property],\n\t\t\tpt, rootPT, lookup, i;\n\t\tif (!ptCache) {\n\t\t\tptCache = tween._ptCache[property] = [];\n\t\t\tlookup = tween._ptLookup;\n\t\t\ti = tween._targets.length;\n\t\t\twhile (i--) {\n\t\t\t\tpt = lookup[i][property];\n\t\t\t\tif (pt && pt.d && pt.d._pt) { // it's a plugin, so find the nested PropTween\n\t\t\t\t\tpt = pt.d._pt;\n\t\t\t\t\twhile (pt && pt.p !== property && pt.fp !== property) { // \"fp\" is functionParam for things like setting CSS variables which require .setProperty(\"--var-name\", value)\n\t\t\t\t\t\tpt = pt._next;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!pt) { // there is no PropTween associated with that property, so we must FORCE one to be created and ditch out of this\n\t\t\t\t\t// if the tween has other properties that already rendered at new positions, we'd normally have to rewind to put them back like tween.render(0, true) before forcing an _initTween(), but that can create another edge case like tweening a timeline's progress would trigger onUpdates to fire which could move other things around. It's better to just inform users that .resetTo() should ONLY be used for tweens that already have that property. For example, you can't gsap.to(...{ y: 0 }) and then tween.restTo(\"x\", 200) for example.\n\t\t\t\t\t_forceAllPropTweens = 1; // otherwise, when we _addPropTween() and it finds no change between the start and end values, it skips creating a PropTween (for efficiency...why tween when there's no difference?) but in this case we NEED that PropTween created so we can edit it.\n\t\t\t\t\ttween.vars[property] = \"+=0\";\n\t\t\t\t\t_initTween(tween, time);\n\t\t\t\t\t_forceAllPropTweens = 0;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\tptCache.push(pt);\n\t\t\t}\n\t\t}\n\t\ti = ptCache.length;\n\t\twhile (i--) {\n\t\t\trootPT = ptCache[i];\n\t\t\tpt = rootPT._pt || rootPT; // complex values may have nested PropTweens. We only accommodate the FIRST value.\n\t\t\tpt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;\n\t\t\tpt.c = value - pt.s;\n\t\t\trootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e)); // mainly for CSSPlugin (end value)\n\t\t\trootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b)); // (beginning value)\n\t\t}\n\t},\n\t_addAliasesToVars = (targets, vars) => {\n\t\tlet harness = targets[0] ? _getCache(targets[0]).harness : 0,\n\t\t\tpropertyAliases = (harness && harness.aliases),\n\t\t\tcopy, p, i, aliases;\n\t\tif (!propertyAliases) {\n\t\t\treturn vars;\n\t\t}\n\t\tcopy = _merge({}, vars);\n\t\tfor (p in propertyAliases) {\n\t\t\tif (p in copy) {\n\t\t\t\taliases = propertyAliases[p].split(\",\");\n\t\t\t\ti = aliases.length;\n\t\t\t\twhile(i--) {\n\t\t\t\t\tcopy[aliases[i]] = copy[p];\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn copy;\n\t},\n\t// parses multiple formats, like {\"0%\": {x: 100}, {\"50%\": {x: -20}} and { x: {\"0%\": 100, \"50%\": -20} }, and an \"ease\" can be set on any object. We populate an \"allProps\" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a \"t\" (time), \"v\", (value), and \"e\" (ease) property. This allows us to piece together a timeline later.\n\t_parseKeyframe = (prop, obj, allProps, easeEach) => {\n\t\tlet ease = obj.ease || easeEach || \"power1.inOut\",\n\t\t\tp, a;\n\t\tif (_isArray(obj)) {\n\t\t\ta = allProps[prop] || (allProps[prop] = []);\n\t\t\t// t = time (out of 100), v = value, e = ease\n\t\t\tobj.forEach((value, i) => a.push({t: i / (obj.length - 1) * 100, v: value, e: ease}));\n\t\t} else {\n\t\t\tfor (p in obj) {\n\t\t\t\ta = allProps[p] || (allProps[p] = []);\n\t\t\t\tp === \"ease\" || a.push({t: parseFloat(prop), v: obj[p], e: ease});\n\t\t\t}\n\t\t}\n\t},\n\t_parseFuncOrString = (value, tween, i, target, targets) => (_isFunction(value) ? value.call(tween, i, target, targets) : (_isString(value) && ~value.indexOf(\"random(\")) ? _replaceRandom(value) : value),\n\t_staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert\",\n\t_staggerPropsToSkip = {};\n_forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", name => _staggerPropsToSkip[name] = 1);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * TWEEN\n * --------------------------------------------------------------------------------------\n */\n\nexport class Tween extends Animation {\n\n\tconstructor(targets, vars, position, skipInherit) {\n\t\tif (typeof(vars) === \"number\") {\n\t\t\tposition.duration = vars;\n\t\t\tvars = position;\n\t\t\tposition = null;\n\t\t}\n\t\tsuper(skipInherit ? vars : _inheritDefaults(vars));\n\t\tlet { duration, delay, immediateRender, stagger, overwrite, keyframes, defaults, scrollTrigger, yoyoEase } = this.vars,\n\t\t\tparent = vars.parent || _globalTimeline,\n\t\t\tparsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : (\"length\" in vars)) ? [targets] : toArray(targets), // edge case: someone might try animating the \"length\" of an object with a \"length\" property that's initially set to 0 so don't interpret that as an empty Array-like object.\n\t\t\ttl, i, copy, l, p, curTarget, staggerFunc, staggerVarsToMerge;\n\t\tthis._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://greensock.com\", !_config.nullTargetWarn) || [];\n\t\tthis._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property\n\t\tthis._overwrite = overwrite;\n\t\tif (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n\t\t\tvars = this.vars;\n\t\t\ttl = this.timeline = new Timeline({data: \"nested\", defaults: defaults || {}, targets: parent && parent.data === \"nested\" ? parent.vars.targets : parsedTargets}); // we need to store the targets because for staggers and keyframes, we end up creating an individual tween for each but function-based values need to know the index and the whole Array of targets.\n\t\t\ttl.kill();\n\t\t\ttl.parent = tl._dp = this;\n\t\t\ttl._start = 0;\n\t\t\tif (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n\t\t\t\tl = parsedTargets.length;\n\t\t\t\tstaggerFunc = stagger && distribute(stagger);\n\t\t\t\tif (_isObject(stagger)) { //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.\n\t\t\t\t\tfor (p in stagger) {\n\t\t\t\t\t\tif (~_staggerTweenProps.indexOf(p)) {\n\t\t\t\t\t\t\tstaggerVarsToMerge || (staggerVarsToMerge = {});\n\t\t\t\t\t\t\tstaggerVarsToMerge[p] = stagger[p];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\tcopy = _copyExcluding(vars, _staggerPropsToSkip);\n\t\t\t\t\tcopy.stagger = 0;\n\t\t\t\t\tyoyoEase && (copy.yoyoEase = yoyoEase);\n\t\t\t\t\tstaggerVarsToMerge && _merge(copy, staggerVarsToMerge);\n\t\t\t\t\tcurTarget = parsedTargets[i];\n\t\t\t\t\t//don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.\n\t\t\t\t\tcopy.duration = +_parseFuncOrString(duration, this, i, curTarget, parsedTargets);\n\t\t\t\t\tcopy.delay = (+_parseFuncOrString(delay, this, i, curTarget, parsedTargets) || 0) - this._delay;\n\t\t\t\t\tif (!stagger && l === 1 && copy.delay) { // if someone does delay:\"random(1, 5)\", repeat:-1, for example, the delay shouldn't be inside the repeat.\n\t\t\t\t\t\tthis._delay = delay = copy.delay;\n\t\t\t\t\t\tthis._start += delay;\n\t\t\t\t\t\tcopy.delay = 0;\n\t\t\t\t\t}\n\t\t\t\t\ttl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\n\t\t\t\t\ttl._ease = _easeMap.none;\n\t\t\t\t}\n\t\t\t\ttl.duration() ? (duration = delay = 0) : (this.timeline = 0); // if the timeline's duration is 0, we don't need a timeline internally!\n\t\t\t} else if (keyframes) {\n\t\t\t\t_inheritDefaults(_setDefaults(tl.vars.defaults, {ease:\"none\"}));\n\t\t\t\ttl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\n\t\t\t\tlet time = 0,\n\t\t\t\t\ta, kf, v;\n\t\t\t\tif (_isArray(keyframes)) {\n\t\t\t\t\tkeyframes.forEach(frame => tl.to(parsedTargets, frame, \">\"));\n\t\t\t\t\ttl.duration(); // to ensure tl._dur is cached because we tap into it for performance purposes in the render() method.\n\t\t\t\t} else {\n\t\t\t\t\tcopy = {};\n\t\t\t\t\tfor (p in keyframes) {\n\t\t\t\t\t\tp === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\n\t\t\t\t\t}\n\t\t\t\t\tfor (p in copy) {\n\t\t\t\t\t\ta = copy[p].sort((a, b) => a.t - b.t);\n\t\t\t\t\t\ttime = 0;\n\t\t\t\t\t\tfor (i = 0; i < a.length; i++) {\n\t\t\t\t\t\t\tkf = a[i];\n\t\t\t\t\t\t\tv = {ease: kf.e, duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration};\n\t\t\t\t\t\t\tv[p] = kf.v;\n\t\t\t\t\t\t\ttl.to(parsedTargets, v, time);\n\t\t\t\t\t\t\ttime += v.duration;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttl.duration() < duration && tl.to({}, {duration: duration - tl.duration()}); // in case keyframes didn't go to 100%\n\t\t\t\t}\n\t\t\t}\n\t\t\tduration || this.duration((duration = tl.duration()));\n\n\t\t} else {\n\t\t\tthis.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)\n\t\t}\n\n\t\tif (overwrite === true && !_suppressOverwrites) {\n\t\t\t_overwritingTween = this;\n\t\t\t_globalTimeline.killTweensOf(parsedTargets);\n\t\t\t_overwritingTween = 0;\n\t\t}\n\t\t_addToTimeline(parent, this, position);\n\t\tvars.reversed && this.reverse();\n\t\tvars.paused && this.paused(true);\n\t\tif (immediateRender || (!duration && !keyframes && this._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(this) && parent.data !== \"nested\")) {\n\t\t\tthis._tTime = -_tinyNum; //forces a render without having to set the render() \"force\" parameter to true because we want to allow lazying by default (using the \"force\" parameter always forces an immediate full render)\n\t\t\tthis.render(Math.max(0, -delay) || 0); //in case delay is negative\n\t\t}\n\t\tscrollTrigger && _scrollTrigger(this, scrollTrigger);\n\t}\n\n\trender(totalTime, suppressEvents, force) {\n\t\tlet prevTime = this._time,\n\t\t\ttDur = this._tDur,\n\t\t\tdur = this._dur,\n\t\t\tisNegative = totalTime < 0,\n\t\t\ttTime = (totalTime > tDur - _tinyNum && !isNegative) ? tDur : (totalTime < _tinyNum) ? 0 : totalTime,\n\t\t\ttime, pt, iteration, cycleDuration, prevIteration, isYoyo, ratio, timeline, yoyoEase;\n\t\tif (!dur) {\n\t\t\t_renderZeroDurationTween(this, totalTime, suppressEvents, force);\n\t\t} else if (tTime !== this._tTime || !totalTime || force || (!this._initted && this._tTime) || (this._startAt && (this._zTime < 0) !== isNegative)) { //this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)\n\t\t\ttime = tTime;\n\t\t\ttimeline = this.timeline;\n\t\t\tif (this._repeat) { //adjust the time for repeats and yoyos\n\t\t\t\tcycleDuration = dur + this._rDelay;\n\t\t\t\tif (this._repeat < -1 && isNegative) {\n\t\t\t\t\treturn this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n\t\t\t\t}\n\t\t\t\ttime = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\t\t\t\tif (tTime === tDur) { // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n\t\t\t\t\titeration = this._repeat;\n\t\t\t\t\ttime = dur;\n\t\t\t\t} else {\n\t\t\t\t\titeration = ~~(tTime / cycleDuration);\n\t\t\t\t\tif (iteration && iteration === tTime / cycleDuration) {\n\t\t\t\t\t\ttime = dur;\n\t\t\t\t\t\titeration--;\n\t\t\t\t\t}\n\t\t\t\t\ttime > dur && (time = dur);\n\t\t\t\t}\n\t\t\t\tisYoyo = this._yoyo && (iteration & 1);\n\t\t\t\tif (isYoyo) {\n\t\t\t\t\tyoyoEase = this._yEase;\n\t\t\t\t\ttime = dur - time;\n\t\t\t\t}\n\t\t\t\tprevIteration = _animationCycle(this._tTime, cycleDuration);\n\t\t\t\tif (time === prevTime && !force && this._initted) {\n\t\t\t\t\t//could be during the repeatDelay part. No need to render and fire callbacks.\n\t\t\t\t\tthis._tTime = tTime;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tif (iteration !== prevIteration) {\n\t\t\t\t\ttimeline && this._yEase && _propagateYoyoEase(timeline, isYoyo);\n\t\t\t\t\t//repeatRefresh functionality\n\t\t\t\t\tif (this.vars.repeatRefresh && !isYoyo && !this._lock) {\n\t\t\t\t\t\tthis._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.\n\t\t\t\t\t\tthis.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!this._initted) {\n\t\t\t\tif (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {\n\t\t\t\t\tthis._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tif (prevTime !== this._time) { // rare edge case - during initialization, an onUpdate in the _startAt (.fromTo()) might force this tween to render at a different spot in which case we should ditch this render() call so that it doesn't revert the values.\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tif (dur !== this._dur) { // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.\n\t\t\t\t\treturn this.render(totalTime, suppressEvents, force);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._tTime = tTime;\n\t\t\tthis._time = time;\n\n\t\t\tif (!this._act && this._ts) {\n\t\t\t\tthis._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\t\t\t\tthis._lazy = 0;\n\t\t\t}\n\n\t\t\tthis.ratio = ratio = (yoyoEase || this._ease)(time / dur);\n\t\t\tif (this._from) {\n\t\t\t\tthis.ratio = ratio = 1 - ratio;\n\t\t\t}\n\n\t\t\tif (time && !prevTime && !suppressEvents && !iteration) {\n\t\t\t\t_callback(this, \"onStart\");\n\t\t\t\tif (this._tTime !== tTime) { // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpt = this._pt;\n\t\t\twhile (pt) {\n\t\t\t\tpt.r(ratio, pt.d);\n\t\t\t\tpt = pt._next;\n\t\t\t}\n\t\t\t(timeline && timeline.render(totalTime < 0 ? totalTime : !time && isYoyo ? -_tinyNum : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force)) || (this._startAt && (this._zTime = totalTime));\n\n\t\t\tif (this._onUpdate && !suppressEvents) {\n\t\t\t\tisNegative && _rewindStartAt(this, totalTime, suppressEvents, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.\n\t\t\t\t_callback(this, \"onUpdate\");\n\t\t\t}\n\n\t\t\tthis._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n\t\t\tif ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\n\t\t\t\tisNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);\n\t\t\t\t(totalTime || !dur) && ((tTime === this._tDur && this._ts > 0) || (!tTime && this._ts < 0)) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\t\t\t if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) { // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();\n\t\t\t\t\t_callback(this, (tTime === tDur ? \"onComplete\" : \"onReverseComplete\"), true);\n\t\t\t\t\tthis._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn this;\n\t}\n\n\ttargets() {\n\t\treturn this._targets;\n\t}\n\n\tinvalidate(soft) { // \"soft\" gives us a way to clear out everything EXCEPT the recorded pre-\"from\" portion of from() tweens. Otherwise, for example, if you tween.progress(1).render(0, true true).invalidate(), the \"from\" values would persist and then on the next render, the from() tweens would initialize and the current value would match the \"from\" values, thus animate from the same value to the same value (no animation). We tap into this in ScrollTrigger's refresh() where we must push a tween to completion and then back again but honor its init state in case the tween is dependent on another tween further up on the page.\n\t\t(!soft || !this.vars.runBackwards) && (this._startAt = 0)\n\t\tthis._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;\n\t\tthis._ptLookup = [];\n\t\tthis.timeline && this.timeline.invalidate(soft);\n\t\treturn super.invalidate(soft);\n\t}\n\n\tresetTo(property, value, start, startIsRelative) {\n\t\t_tickerActive || _ticker.wake();\n\t\tthis._ts || this.play();\n\t\tlet time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),\n\t\t\tratio;\n\t\tthis._initted || _initTween(this, time);\n\t\tratio = this._ease(time / this._dur); // don't just get tween.ratio because it may not have rendered yet.\n\t\t// possible future addition to allow an object with multiple values to update, like tween.resetTo({x: 100, y: 200}); At this point, it doesn't seem worth the added kb given the fact that most users will likely opt for the convenient gsap.quickTo() way of interacting with this method.\n\t\t// if (_isObject(property)) { // performance optimization\n\t\t// \tfor (p in property) {\n\t\t// \t\tif (_updatePropTweens(this, p, property[p], value ? value[p] : null, start, ratio, time)) {\n\t\t// \t\t\treturn this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n\t\t// \t\t}\n\t\t// \t}\n\t\t// } else {\n\t\t\tif (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time)) {\n\t\t\t\treturn this.resetTo(property, value, start, startIsRelative); // if a PropTween wasn't found for the property, it'll get forced with a re-initialization so we need to jump out and start over again.\n\t\t\t}\n\t\t//}\n\t\t_alignPlayhead(this, 0);\n\t\tthis.parent || _addLinkedListItem(this._dp, this, \"_first\", \"_last\", this._dp._sort ? \"_start\" : 0);\n\t\treturn this.render(0);\n\t}\n\n\tkill(targets, vars = \"all\") {\n\t\tif (!targets && (!vars || vars === \"all\")) {\n\t\t\tthis._lazy = this._pt = 0;\n\t\t\treturn this.parent ? _interrupt(this) : this;\n\t\t}\n\t\tif (this.timeline) {\n\t\t\tlet tDur = this.timeline.totalDuration();\n\t\t\tthis.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.\n\t\t\tthis.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.\n\t\t\treturn this;\n\t\t}\n\t\tlet parsedTargets = this._targets,\n\t\t\tkillingTargets = targets ? toArray(targets) : parsedTargets,\n\t\t\tpropTweenLookup = this._ptLookup,\n\t\t\tfirstPT = this._pt,\n\t\t\toverwrittenProps, curLookup, curOverwriteProps, props, p, pt, i;\n\t\tif ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\n\t\t\tvars === \"all\" && (this._pt = 0);\n\t\t\treturn _interrupt(this);\n\t\t}\n\t\toverwrittenProps = this._op = this._op || [];\n\t\tif (vars !== \"all\") { //so people can pass in a comma-delimited list of property names\n\t\t\tif (_isString(vars)) {\n\t\t\t\tp = {};\n\t\t\t\t_forEachName(vars, name => p[name] = 1);\n\t\t\t\tvars = p;\n\t\t\t}\n\t\t\tvars = _addAliasesToVars(parsedTargets, vars);\n\t\t}\n\t\ti = parsedTargets.length;\n\t\twhile (i--) {\n\t\t\tif (~killingTargets.indexOf(parsedTargets[i])) {\n\t\t\t\tcurLookup = propTweenLookup[i];\n\t\t\t\tif (vars === \"all\") {\n\t\t\t\t\toverwrittenProps[i] = vars;\n\t\t\t\t\tprops = curLookup;\n\t\t\t\t\tcurOverwriteProps = {};\n\t\t\t\t} else {\n\t\t\t\t\tcurOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\n\t\t\t\t\tprops = vars;\n\t\t\t\t}\n\t\t\t\tfor (p in props) {\n\t\t\t\t\tpt = curLookup && curLookup[p];\n\t\t\t\t\tif (pt) {\n\t\t\t\t\t\tif (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\n\t\t\t\t\t\t\t_removeLinkedListItem(this, pt, \"_pt\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdelete curLookup[p];\n\t\t\t\t\t}\n\t\t\t\t\tif (curOverwriteProps !== \"all\") {\n\t\t\t\t\t\tcurOverwriteProps[p] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.\n\t\treturn this;\n\t}\n\n\n\tstatic to(targets, vars) {\n\t\treturn new Tween(targets, vars, arguments[2]);\n\t}\n\n\tstatic from(targets, vars) {\n\t\treturn _createTweenType(1, arguments);\n\t}\n\n\tstatic delayedCall(delay, callback, params, scope) {\n\t\treturn new Tween(callback, 0, {immediateRender:false, lazy:false, overwrite:false, delay:delay, onComplete:callback, onReverseComplete:callback, onCompleteParams:params, onReverseCompleteParams:params, callbackScope:scope}); // we must use onReverseComplete too for things like timeline.add(() => {...}) which should be triggered in BOTH directions (forward and reverse)\n\t}\n\n\tstatic fromTo(targets, fromVars, toVars) {\n\t\treturn _createTweenType(2, arguments);\n\t}\n\n\tstatic set(targets, vars) {\n\t\tvars.duration = 0;\n\t\tvars.repeatDelay || (vars.repeat = 0);\n\t\treturn new Tween(targets, vars);\n\t}\n\n\tstatic killTweensOf(targets, props, onlyActive) {\n\t\treturn _globalTimeline.killTweensOf(targets, props, onlyActive);\n\t}\n}\n\n_setDefaults(Tween.prototype, {_targets:[], _lazy:0, _startAt:0, _op:0, _onInit:0});\n\n//add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)\n// _forEachName(\"to,from,fromTo,set,call,add,addLabel,addPause\", name => {\n// \tTween.prototype[name] = function() {\n// \t\tlet tl = new Timeline();\n// \t\treturn _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));\n// \t}\n// });\n\n//for backward compatibility. Leverage the timeline calls.\n_forEachName(\"staggerTo,staggerFrom,staggerFromTo\", name => {\n\tTween[name] = function() {\n\t\tlet tl = new Timeline(),\n\t\t\tparams = _slice.call(arguments, 0);\n\t\tparams.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\n\t\treturn tl[name].apply(tl, params);\n\t}\n});\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * PROPTWEEN\n * --------------------------------------------------------------------------------------\n */\nlet _setterPlain = (target, property, value) => target[property] = value,\n\t_setterFunc = (target, property, value) => target[property](value),\n\t_setterFuncWithParam = (target, property, value, data) => target[property](data.fp, value),\n\t_setterAttribute = (target, property, value) => target.setAttribute(property, value),\n\t_getSetter = (target, property) => _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain,\n\t_renderPlain = (ratio, data) => data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data),\n\t_renderBoolean = (ratio, data) => data.set(data.t, data.p, !!(data.s + data.c * ratio), data),\n\t_renderComplexString = function(ratio, data) {\n\t\tlet pt = data._pt,\n\t\t\ts = \"\";\n\t\tif (!ratio && data.b) { //b = beginning string\n\t\t\ts = data.b;\n\t\t} else if (ratio === 1 && data.e) { //e = ending string\n\t\t\ts = data.e;\n\t\t} else {\n\t\t\twhile (pt) {\n\t\t\t\ts = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : (Math.round((pt.s + pt.c * ratio) * 10000) / 10000)) + s; //we use the \"p\" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.\n\t\t\t\tpt = pt._next;\n\t\t\t}\n\t\t\ts += data.c; //we use the \"c\" of the PropTween to store the final chunk of non-numeric text.\n\t\t}\n\t\tdata.set(data.t, data.p, s, data);\n\t},\n\t_renderPropTweens = function(ratio, data) {\n\t\tlet pt = data._pt;\n\t\twhile (pt) {\n\t\t\tpt.r(ratio, pt.d);\n\t\t\tpt = pt._next;\n\t\t}\n\t},\n\t_addPluginModifier = function(modifier, tween, target, property) {\n\t\tlet pt = this._pt,\n\t\t\tnext;\n\t\twhile (pt) {\n\t\t\tnext = pt._next;\n\t\t\tpt.p === property && pt.modifier(modifier, tween, target);\n\t\t\tpt = next;\n\t\t}\n\t},\n\t_killPropTweensOf = function(property) {\n\t\tlet pt = this._pt,\n\t\t\thasNonDependentRemaining, next;\n\t\twhile (pt) {\n\t\t\tnext = pt._next;\n\t\t\tif ((pt.p === property && !pt.op) || pt.op === property) {\n\t\t\t\t_removeLinkedListItem(this, pt, \"_pt\");\n\t\t\t} else if (!pt.dep) {\n\t\t\t\thasNonDependentRemaining = 1;\n\t\t\t}\n\t\t\tpt = next;\n\t\t}\n\t\treturn !hasNonDependentRemaining;\n\t},\n\t_setterWithModifier = (target, property, value, data) => {\n\t\tdata.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\n\t},\n\t_sortPropTweensByPriority = parent => {\n\t\tlet pt = parent._pt,\n\t\t\tnext, pt2, first, last;\n\t\t//sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)\n\t\twhile (pt) {\n\t\t\tnext = pt._next;\n\t\t\tpt2 = first;\n\t\t\twhile (pt2 && pt2.pr > pt.pr) {\n\t\t\t\tpt2 = pt2._next;\n\t\t\t}\n\t\t\tif ((pt._prev = pt2 ? pt2._prev : last)) {\n\t\t\t\tpt._prev._next = pt;\n\t\t\t} else {\n\t\t\t\tfirst = pt;\n\t\t\t}\n\t\t\tif ((pt._next = pt2)) {\n\t\t\t\tpt2._prev = pt;\n\t\t\t} else {\n\t\t\t\tlast = pt;\n\t\t\t}\n\t\t\tpt = next;\n\t\t}\n\t\tparent._pt = first;\n\t};\n\n//PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)\nexport class PropTween {\n\n\tconstructor(next, target, prop, start, change, renderer, data, setter, priority) {\n\t\tthis.t = target;\n\t\tthis.s = start;\n\t\tthis.c = change;\n\t\tthis.p = prop;\n\t\tthis.r = renderer || _renderPlain;\n\t\tthis.d = data || this;\n\t\tthis.set = setter || _setterPlain;\n\t\tthis.pr = priority || 0;\n\t\tthis._next = next;\n\t\tif (next) {\n\t\t\tnext._prev = this;\n\t\t}\n\t}\n\n\tmodifier(func, tween, target) {\n\t\tthis.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)\n\t\tthis.set = _setterWithModifier;\n\t\tthis.m = func;\n\t\tthis.mt = target; //modifier target\n\t\tthis.tween = tween;\n\t}\n}\n\n\n\n//Initialization tasks\n_forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger\", name => _reservedProps[name] = 1);\n_globals.TweenMax = _globals.TweenLite = Tween;\n_globals.TimelineLite = _globals.TimelineMax = Timeline;\n_globalTimeline = new Timeline({sortChildren: false, defaults: _defaults, autoRemoveChildren: true, id:\"root\", smoothChildTiming: true});\n_config.stringFilter = _colorStringFilter;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet _media = [],\n\t_listeners = {},\n\t_emptyArray = [],\n\t_lastMediaTime = 0,\n\t_contextID = 0,\n\t_dispatch = type => (_listeners[type] || _emptyArray).map(f => f()),\n\t_onMediaChange = () => {\n\t\tlet time = Date.now(),\n\t\t\tmatches = [];\n\t\tif (time - _lastMediaTime > 2) {\n\t\t\t_dispatch(\"matchMediaInit\");\n\t\t\t_media.forEach(c => {\n\t\t\t\tlet queries = c.queries,\n\t\t\t\t\tconditions = c.conditions,\n\t\t\t\t\tmatch, p, anyMatch, toggled;\n\t\t\t\tfor (p in queries) {\n\t\t\t\t\tmatch = _win.matchMedia(queries[p]).matches; // Firefox doesn't update the \"matches\" property of the MediaQueryList object correctly - it only does so as it calls its change handler - so we must re-create a media query here to ensure it's accurate.\n\t\t\t\t\tmatch && (anyMatch = 1);\n\t\t\t\t\tif (match !== conditions[p]) {\n\t\t\t\t\t\tconditions[p] = match;\n\t\t\t\t\t\ttoggled = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (toggled) {\n\t\t\t\t\tc.revert();\n\t\t\t\t\tanyMatch && matches.push(c);\n\t\t\t\t}\n\t\t\t});\n\t\t\t_dispatch(\"matchMediaRevert\");\n\t\t\tmatches.forEach(c => c.onMatch(c));\n\t\t\t_lastMediaTime = time;\n\t\t\t_dispatch(\"matchMedia\");\n\t\t}\n\t};\n\nclass Context {\n\tconstructor(func, scope) {\n\t\tthis.selector = scope && selector(scope);\n\t\tthis.data = [];\n\t\tthis._r = []; // returned/cleanup functions\n\t\tthis.isReverted = false;\n\t\tthis.id = _contextID++; // to work around issues that frameworks like Vue cause by making things into Proxies which make it impossible to do something like _media.indexOf(this) because \"this\" would no longer refer to the Context instance itself - it'd refer to a Proxy! We needed a way to identify the context uniquely\n\t\tfunc && this.add(func);\n\t}\n\tadd(name, func, scope) {\n\t\t// possible future addition if we need the ability to add() an animation to a context and for whatever reason cannot create that animation inside of a context.add(() => {...}) function.\n\t\t// if (name && _isFunction(name.revert)) {\n\t\t// \tthis.data.push(name);\n\t\t// \treturn (name._ctx = this);\n\t\t// }\n\t\tif (_isFunction(name)) {\n\t\t\tscope = func;\n\t\t\tfunc = name;\n\t\t\tname = _isFunction;\n\t\t}\n\t\tlet self = this,\n\t\t\tf = function() {\n\t\t\t\tlet prev = _context,\n\t\t\t\t\tprevSelector = self.selector,\n\t\t\t\t\tresult;\n\t\t\t\tprev && prev !== self && prev.data.push(self);\n\t\t\t\tscope && (self.selector = selector(scope));\n\t\t\t\t_context = self;\n\t\t\t\tresult = func.apply(self, arguments);\n\t\t\t\t_isFunction(result) && self._r.push(result);\n\t\t\t\t_context = prev;\n\t\t\t\tself.selector = prevSelector;\n\t\t\t\tself.isReverted = false;\n\t\t\t\treturn result;\n\t\t\t};\n\t\tself.last = f;\n\t\treturn name === _isFunction ? f(self) : name ? (self[name] = f) : f;\n\t}\n\tignore(func) {\n\t\tlet prev = _context;\n\t\t_context = null;\n\t\tfunc(this);\n\t\t_context = prev;\n\t}\n\tgetTweens() {\n\t\tlet a = [];\n\t\tthis.data.forEach(e => (e instanceof Context) ? a.push(...e.getTweens()) : (e instanceof Tween) && !(e.parent && e.parent.data === \"nested\") && a.push(e));\n\t\treturn a;\n\t}\n\tclear() {\n\t\tthis._r.length = this.data.length = 0;\n\t}\n\tkill(revert, matchMedia) {\n\t\tif (revert) {\n\t\t\tlet tweens = this.getTweens();\n\t\t\tthis.data.forEach(t => { // Flip plugin tweens are very different in that they should actually be pushed to their end. The plugin replaces the timeline's .revert() method to do exactly that. But we also need to remove any of those nested tweens inside the flip timeline so that they don't get individually reverted.\n\t\t\t\tif (t.data === \"isFlip\") {\n\t\t\t\t\tt.revert();\n\t\t\t\t\tt.getChildren(true, true, false).forEach(tween => tweens.splice(tweens.indexOf(tween), 1));\n\t\t\t\t}\n\t\t\t});\n\t\t\t// save as an object so that we can cache the globalTime for each tween to optimize performance during the sort\n\t\t\ttweens.map(t => { return {g: t.globalTime(0), t}}).sort((a, b) => b.g - a.g || -1).forEach(o => o.t.revert(revert)); // note: all of the _startAt tweens should be reverted in reverse order that they were created, and they'll all have the same globalTime (-1) so the \" || -1\" in the sort keeps the order properly.\n\t\t\tthis.data.forEach(e => e instanceof Timeline ? (e.data !== \"nested\") && e.kill() : !(e instanceof Tween) && e.revert && e.revert(revert));\n\t\t\tthis._r.forEach(f => f(revert, this));\n\t\t\tthis.isReverted = true;\n\t\t} else {\n\t\t\tthis.data.forEach(e => e.kill && e.kill());\n\t\t}\n\t\tthis.clear();\n\t\tif (matchMedia) {\n\t\t\tlet i = _media.length;\n\t\t\twhile (i--) { // previously, we checked _media.indexOf(this), but some frameworks like Vue enforce Proxy objects that make it impossible to get the proper result that way, so we must use a unique ID number instead.\n\t\t\t\t_media[i].id === this.id && _media.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\trevert(config) {\n\t\tthis.kill(config || {});\n\t}\n}\n\n\n\n\nclass MatchMedia {\n\tconstructor(scope) {\n\t\tthis.contexts = [];\n\t\tthis.scope = scope;\n\t}\n\tadd(conditions, func, scope) {\n\t\t_isObject(conditions) || (conditions = {matches: conditions});\n\t\tlet context = new Context(0, scope || this.scope),\n\t\t\tcond = context.conditions = {},\n\t\t\tmq, p, active;\n\t\t_context && !context.selector && (context.selector = _context.selector); // in case a context is created inside a context. Like a gsap.matchMedia() that's inside a scoped gsap.context()\n\t\tthis.contexts.push(context);\n\t\tfunc = context.add(\"onMatch\", func);\n\t\tcontext.queries = conditions;\n\t\tfor (p in conditions) {\n\t\t\tif (p === \"all\") {\n\t\t\t\tactive = 1;\n\t\t\t} else {\n\t\t\t\tmq = _win.matchMedia(conditions[p]);\n\t\t\t\tif (mq) {\n\t\t\t\t\t_media.indexOf(context) < 0 && _media.push(context);\n\t\t\t\t\t(cond[p] = mq.matches) && (active = 1);\n\t\t\t\t\tmq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener(\"change\", _onMediaChange);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tactive && func(context);\n\t\treturn this;\n\t}\n\t// refresh() {\n\t// \tlet time = _lastMediaTime,\n\t// \t\tmedia = _media;\n\t// \t_lastMediaTime = -1;\n\t// \t_media = this.contexts;\n\t// \t_onMediaChange();\n\t// \t_lastMediaTime = time;\n\t// \t_media = media;\n\t// }\n\trevert(config) {\n\t\tthis.kill(config || {});\n\t}\n\tkill(revert) {\n\t\tthis.contexts.forEach(c => c.kill(revert, true));\n\t}\n}\n\n\n\n/*\n * --------------------------------------------------------------------------------------\n * GSAP\n * --------------------------------------------------------------------------------------\n */\nconst _gsap = {\n\tregisterPlugin(...args) {\n\t\targs.forEach(config => _createPlugin(config));\n\t},\n\ttimeline(vars) {\n\t\treturn new Timeline(vars);\n\t},\n\tgetTweensOf(targets, onlyActive) {\n\t\treturn _globalTimeline.getTweensOf(targets, onlyActive);\n\t},\n\tgetProperty(target, property, unit, uncache) {\n\t\t_isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in\n\t\tlet getter = _getCache(target || {}).get,\n\t\t\tformat = unit ? _passThrough : _numericIfPossible;\n\t\tunit === \"native\" && (unit = \"\");\n\t\treturn !target ? target : !property ? (property, unit, uncache) => format(((_plugins[property] && _plugins[property].get) || getter)(target, property, unit, uncache)) : format(((_plugins[property] && _plugins[property].get) || getter)(target, property, unit, uncache));\n\t},\n\tquickSetter(target, property, unit) {\n\t\ttarget = toArray(target);\n\t\tif (target.length > 1) {\n\t\t\tlet setters = target.map(t => gsap.quickSetter(t, property, unit)),\n\t\t\t\tl = setters.length;\n\t\t\treturn value => {\n\t\t\t\tlet i = l;\n\t\t\t\twhile(i--) {\n\t\t\t\t\tsetters[i](value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttarget = target[0] || {};\n\t\tlet Plugin = _plugins[property],\n\t\t\tcache = _getCache(target),\n\t\t\tp = (cache.harness && (cache.harness.aliases || {})[property]) || property, // in case it's an alias, like \"rotate\" for \"rotation\".\n\t\t\tsetter = Plugin ? value => {\n\t\t\t\tlet p = new Plugin();\n\t\t\t\t_quickTween._pt = 0;\n\t\t\t\tp.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\n\t\t\t\tp.render(1, p);\n\t\t\t\t_quickTween._pt && _renderPropTweens(1, _quickTween);\n\t\t\t} : cache.set(target, p);\n\t\treturn Plugin ? setter : value => setter(target, p, unit ? value + unit : value, cache, 1);\n\t},\n\tquickTo(target, property, vars) {\n\t\tlet tween = gsap.to(target, _merge({[property]: \"+=0.1\", paused: true}, vars || {})),\n\t\t\tfunc = (value, start, startIsRelative) => tween.resetTo(property, value, start, startIsRelative);\n\t\tfunc.tween = tween;\n\t\treturn func;\n\t},\n\tisTweening(targets) {\n\t\treturn _globalTimeline.getTweensOf(targets, true).length > 0;\n\t},\n\tdefaults(value) {\n\t\tvalue && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\n\t\treturn _mergeDeep(_defaults, value || {});\n\t},\n\tconfig(value) {\n\t\treturn _mergeDeep(_config, value || {});\n\t},\n\tregisterEffect({name, effect, plugins, defaults, extendTimeline}) {\n\t\t(plugins || \"\").split(\",\").forEach(pluginName => pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\"));\n\t\t_effects[name] = (targets, vars, tl) => effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\n\t\tif (extendTimeline) {\n\t\t\tTimeline.prototype[name] = function(targets, vars, position) {\n\t\t\t\treturn this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\n\t\t\t};\n\t\t}\n\t},\n\tregisterEase(name, ease) {\n\t\t_easeMap[name] = _parseEase(ease);\n\t},\n\tparseEase(ease, defaultEase) {\n\t\treturn arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\n\t},\n\tgetById(id) {\n\t\treturn _globalTimeline.getById(id);\n\t},\n\texportRoot(vars = {}, includeDelayedCalls) {\n\t\tlet tl = new Timeline(vars),\n\t\t\tchild, next;\n\t\ttl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\n\t\t_globalTimeline.remove(tl);\n\t\ttl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).\n\t\ttl._time = tl._tTime = _globalTimeline._time;\n\t\tchild = _globalTimeline._first;\n\t\twhile (child) {\n\t\t\tnext = child._next;\n\t\t\tif (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\n\t\t\t\t_addToTimeline(tl, child, child._start - child._delay);\n\t\t\t}\n\t\t\tchild = next;\n\t\t}\n\t\t_addToTimeline(_globalTimeline, tl, 0);\n\t\treturn tl;\n\t},\n\tcontext: (func, scope) => func ? new Context(func, scope) : _context,\n\tmatchMedia: scope => new MatchMedia(scope),\n\tmatchMediaRefresh: () => _media.forEach(c => {\n\t\tlet cond = c.conditions,\n\t\t\tfound, p;\n\t\tfor (p in cond) {\n\t\t\tif (cond[p]) {\n\t\t\t\tcond[p] = false;\n\t\t\t\tfound = 1;\n\t\t\t}\n\t\t}\n\t\tfound && c.revert();\n\t}) || _onMediaChange(),\n\taddEventListener(type, callback) {\n\t\tlet a = _listeners[type] || (_listeners[type] = []);\n\t\t~a.indexOf(callback) || a.push(callback);\n\t},\n\tremoveEventListener(type, callback) {\n\t\tlet a = _listeners[type],\n\t\t\ti = a && a.indexOf(callback);\n\t\ti >= 0 && a.splice(i, 1);\n\t},\n\tutils: { wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle },\n\tinstall: _install,\n\teffects: _effects,\n\tticker: _ticker,\n\tupdateRoot: Timeline.updateRoot,\n\tplugins: _plugins,\n\tglobalTimeline: _globalTimeline,\n\tcore: {PropTween, globals: _addGlobal, Tween, Timeline, Animation, getCache: _getCache, _removeLinkedListItem, reverting: () => _reverting, context: toAdd => {if (toAdd && _context) { _context.data.push(toAdd); toAdd._ctx = _context} return _context; }, suppressOverwrites: value => _suppressOverwrites = value}\n};\n\n_forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", name => _gsap[name] = Tween[name]);\n_ticker.add(Timeline.updateRoot);\n_quickTween = _gsap.to({}, {duration:0});\n\n\n\n\n// ---- EXTRA PLUGINS --------------------------------------------------------\n\n\nlet _getPluginPropTween = (plugin, prop) => {\n\t\tlet pt = plugin._pt;\n\t\twhile (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\n\t\t\tpt = pt._next;\n\t\t}\n\t\treturn pt;\n\t},\n\t_addModifiers = (tween, modifiers) => {\n\t\t\tlet\ttargets = tween._targets,\n\t\t\t\tp, i, pt;\n\t\t\tfor (p in modifiers) {\n\t\t\t\ti = targets.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tpt = tween._ptLookup[i][p];\n\t\t\t\t\tif (pt && (pt = pt.d)) {\n\t\t\t\t\t\tif (pt._pt) { // is a plugin\n\t\t\t\t\t\t\tpt = _getPluginPropTween(pt, p);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t},\n\t_buildModifierPlugin = (name, modifier) => {\n\t\treturn {\n\t\t\tname: name,\n\t\t\trawVars: 1, //don't pre-process function-based values or \"random()\" strings.\n\t\t\tinit(target, vars, tween) {\n\t\t\t\ttween._onInit = tween => {\n\t\t\t\t\tlet temp, p;\n\t\t\t\t\tif (_isString(vars)) {\n\t\t\t\t\t\ttemp = {};\n\t\t\t\t\t\t_forEachName(vars, name => temp[name] = 1); //if the user passes in a comma-delimited list of property names to roundProps, like \"x,y\", we round to whole numbers.\n\t\t\t\t\t\tvars = temp;\n\t\t\t\t\t}\n\t\t\t\t\tif (modifier) {\n\t\t\t\t\t\ttemp = {};\n\t\t\t\t\t\tfor (p in vars) {\n\t\t\t\t\t\t\ttemp[p] = modifier(vars[p]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvars = temp;\n\t\t\t\t\t}\n\t\t\t\t\t_addModifiers(tween, vars);\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t};\n\n//register core plugins\nexport const gsap = _gsap.registerPlugin({\n\t\tname:\"attr\",\n\t\tinit(target, vars, tween, index, targets) {\n\t\t\tlet p, pt, v;\n\t\t\tthis.tween = tween;\n\t\t\tfor (p in vars) {\n\t\t\t\tv = target.getAttribute(p) || \"\";\n\t\t\t\tpt = this.add(target, \"setAttribute\", (v || 0) + \"\", vars[p], index, targets, 0, 0, p);\n\t\t\t\tpt.op = p;\n\t\t\t\tpt.b = v; // record the beginning value so we can revert()\n\t\t\t\tthis._props.push(p);\n\t\t\t}\n\t\t},\n\t\trender(ratio, data) {\n\t\t\tlet pt = data._pt;\n\t\t\twhile (pt) {\n\t\t\t\t_reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d); // if reverting, go back to the original (pt.b)\n\t\t\t\tpt = pt._next;\n\t\t\t}\n\t\t}\n\t}, {\n\t\tname:\"endArray\",\n\t\tinit(target, value) {\n\t\t\tlet i = value.length;\n\t\t\twhile (i--) {\n\t\t\t\tthis.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);\n\t\t\t}\n\t\t}\n\t},\n\t_buildModifierPlugin(\"roundProps\", _roundModifier),\n\t_buildModifierPlugin(\"modifiers\"),\n\t_buildModifierPlugin(\"snap\", snap)\n) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.\n\nTween.version = Timeline.version = gsap.version = \"3.12.1\";\n_coreReady = 1;\n_windowExists() && _wake();\n\nexport const { Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ } = _easeMap;\nexport { Tween as TweenMax, Tween as TweenLite, Timeline as TimelineMax, Timeline as TimelineLite, gsap as default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle };\n//export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.\nexport { _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative }","/*!\n * CSSPlugin 3.12.1\n * https://greensock.com\n *\n * Copyright 2008-2023, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n/* eslint-disable */\n\nimport {gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _parseRelative,\n\t_setDefaults, _removeLinkedListItem //for the commented-out className feature.\n} from \"./gsap-core.js\";\n\nlet _win, _doc, _docElement, _pluginInitted, _tempDiv, _tempDivStyler, _recentSetterPlugin, _reverting,\n\t_windowExists = () => typeof(window) !== \"undefined\",\n\t_transformProps = {},\n\t_RAD2DEG = 180 / Math.PI,\n\t_DEG2RAD = Math.PI / 180,\n\t_atan2 = Math.atan2,\n\t_bigNum = 1e8,\n\t_capsExp = /([A-Z])/g,\n\t_horizontalExp = /(left|right|width|margin|padding|x)/i,\n\t_complexExp = /[\\s,\\(]\\S/,\n\t_propertyAliases = {autoAlpha:\"opacity,visibility\", scale:\"scaleX,scaleY\", alpha:\"opacity\"},\n\t_renderCSSProp = (ratio, data) => data.set(data.t, data.p, (Math.round((data.s + data.c * ratio) * 10000) / 10000) + data.u, data),\n\t_renderPropWithEnd = (ratio, data) => data.set(data.t, data.p, ratio === 1 ? data.e : (Math.round((data.s + data.c * ratio) * 10000) / 10000) + data.u, data),\n\t_renderCSSPropWithBeginning = (ratio, data) => data.set(data.t, data.p, ratio ? (Math.round((data.s + data.c * ratio) * 10000) / 10000) + data.u : data.b, data), //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n\t_renderRoundedCSSProp = (ratio, data) => {\n\t\tlet value = data.s + data.c * ratio;\n\t\tdata.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\n\t},\n\t_renderNonTweeningValue = (ratio, data) => data.set(data.t, data.p, ratio ? data.e : data.b, data),\n\t_renderNonTweeningValueOnlyAtEnd = (ratio, data) => data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data),\n\t_setterCSSStyle = (target, property, value) => target.style[property] = value,\n\t_setterCSSProp = (target, property, value) => target.style.setProperty(property, value),\n\t_setterTransform = (target, property, value) => target._gsap[property] = value,\n\t_setterScale = (target, property, value) => target._gsap.scaleX = target._gsap.scaleY = value,\n\t_setterScaleWithRender = (target, property, value, data, ratio) => {\n\t\tlet cache = target._gsap;\n\t\tcache.scaleX = cache.scaleY = value;\n\t\tcache.renderTransform(ratio, cache);\n\t},\n\t_setterTransformWithRender = (target, property, value, data, ratio) => {\n\t\tlet cache = target._gsap;\n\t\tcache[property] = value;\n\t\tcache.renderTransform(ratio, cache);\n\t},\n\t_transformProp = \"transform\",\n\t_transformOriginProp = _transformProp + \"Origin\",\n\t_saveStyle = function(property, isNotCSS) {\n\t\tlet target = this.target,\n\t\t\tstyle = target.style;\n\t\tif ((property in _transformProps) && style) {\n\t\t\tthis.tfm = this.tfm || {};\n\t\t\tif (property !== \"transform\") {\n\t\t\t\tproperty = _propertyAliases[property] || property;\n\t\t\t\t~property.indexOf(\",\") ? property.split(\",\").forEach(a => this.tfm[a] = _get(target, a)) : (this.tfm[property] = target._gsap.x ? target._gsap[property] : _get(target, property)); // note: scale would map to \"scaleX,scaleY\", thus we loop and apply them both.\n\t\t\t} else {\n\t\t\t\treturn _propertyAliases.transform.split(\",\").forEach(p => _saveStyle.call(this, p, isNotCSS));\n\t\t\t}\n\t\t\tif (this.props.indexOf(_transformProp) >= 0) { return; }\n\t\t\tif (target._gsap.svg) {\n\t\t\t\tthis.svgo = target.getAttribute(\"data-svg-origin\");\n\t\t\t\tthis.props.push(_transformOriginProp, isNotCSS, \"\");\n\t\t\t}\n\t\t\tproperty = _transformProp;\n\t\t}\n\t\t(style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);\n\t},\n\t_removeIndependentTransforms = style => {\n\t\tif (style.translate) {\n\t\t\tstyle.removeProperty(\"translate\");\n\t\t\tstyle.removeProperty(\"scale\");\n\t\t\tstyle.removeProperty(\"rotate\");\n\t\t}\n\t},\n\t_revertStyle = function() {\n\t\tlet props = this.props,\n\t\t\ttarget = this.target,\n\t\t\tstyle = target.style,\n\t\t\tcache = target._gsap,\n\t\t\ti, p;\n\t\tfor (i = 0; i < props.length; i+=3) { // stored like this: property, isNotCSS, value\n\t\t\tprops[i+1] ? target[props[i]] = props[i+2] : props[i+2] ? (style[props[i]] = props[i+2]) : style.removeProperty(props[i].substr(0,2) === \"--\" ? props[i] : props[i].replace(_capsExp, \"-$1\").toLowerCase());\n\t\t}\n\t\tif (this.tfm) {\n\t\t\tfor (p in this.tfm) {\n\t\t\t\tcache[p] = this.tfm[p];\n\t\t\t}\n\t\t\tif (cache.svg) {\n\t\t\t\tcache.renderTransform();\n\t\t\t\ttarget.setAttribute(\"data-svg-origin\", this.svgo || \"\");\n\t\t\t}\n\t\t\ti = _reverting();\n\t\t\tif ((!i || !i.isStart) && !style[_transformProp]) {\n\t\t\t\t_removeIndependentTransforms(style);\n\t\t\t\tcache.uncache = 1; // if it's a startAt that's being reverted in the _initTween() of the core, we don't need to uncache transforms. This is purely a performance optimization.\n\t\t\t}\n\t\t}\n\t},\n\t_getStyleSaver = (target, properties) => {\n\t\tlet saver = {\n\t\t\ttarget,\n\t\t\tprops: [],\n\t\t\trevert: _revertStyle,\n\t\t\tsave: _saveStyle\n\t\t};\n\t\ttarget._gsap || gsap.core.getCache(target); // just make sure there's a _gsap cache defined because we read from it in _saveStyle() and it's more efficient to just check it here once.\n\t\tproperties && properties.split(\",\").forEach(p => saver.save(p));\n\t\treturn saver;\n\t},\n\t_supports3D,\n\t_createElement = (type, ns) => {\n\t\tlet e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\t\treturn e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n\t},\n\t_getComputedProperty = (target, property, skipPrefixFallback) => {\n\t\tlet cs = getComputedStyle(target);\n\t\treturn cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || (!skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1)) || \"\"; //css variables may not need caps swapped out for dashes and lowercase.\n\t},\n\t_prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\n\t_checkPropPrefix = (property, element, preferPrefix) => {\n\t\tlet e = element || _tempDiv,\n\t\t\ts = e.style,\n\t\t\ti = 5;\n\t\tif (property in s && !preferPrefix) {\n\t\t\treturn property;\n\t\t}\n\t\tproperty = property.charAt(0).toUpperCase() + property.substr(1);\n\t\twhile (i-- && !((_prefixes[i]+property) in s)) { }\n\t\treturn (i < 0) ? null : ((i === 3) ? \"ms\" : (i >= 0) ? _prefixes[i] : \"\") + property;\n\t},\n\t_initCore = () => {\n\t\tif (_windowExists() && window.document) {\n\t\t\t_win = window;\n\t\t\t_doc = _win.document;\n\t\t\t_docElement = _doc.documentElement;\n\t\t\t_tempDiv = _createElement(\"div\") || {style:{}};\n\t\t\t_tempDivStyler = _createElement(\"div\");\n\t\t\t_transformProp = _checkPropPrefix(_transformProp);\n\t\t\t_transformOriginProp = _transformProp + \"Origin\";\n\t\t\t_tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.\n\t\t\t_supports3D = !!_checkPropPrefix(\"perspective\");\n\t\t\t_reverting = gsap.core.reverting;\n\t\t\t_pluginInitted = 1;\n\t\t}\n\t},\n\t_getBBoxHack = function(swapIfPossible) { //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a element and/or . We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).\n\t\tlet svg = _createElement(\"svg\", (this.ownerSVGElement && this.ownerSVGElement.getAttribute(\"xmlns\")) || \"http://www.w3.org/2000/svg\"),\n\t\t\toldParent = this.parentNode,\n\t\t\toldSibling = this.nextSibling,\n\t\t\toldCSS = this.style.cssText,\n\t\t\tbbox;\n\t\t_docElement.appendChild(svg);\n\t\tsvg.appendChild(this);\n\t\tthis.style.display = \"block\";\n\t\tif (swapIfPossible) {\n\t\t\ttry {\n\t\t\t\tbbox = this.getBBox();\n\t\t\t\tthis._gsapBBox = this.getBBox; //store the original\n\t\t\t\tthis.getBBox = _getBBoxHack;\n\t\t\t} catch (e) { }\n\t\t} else if (this._gsapBBox) {\n\t\t\tbbox = this._gsapBBox();\n\t\t}\n\t\tif (oldParent) {\n\t\t\tif (oldSibling) {\n\t\t\t\toldParent.insertBefore(this, oldSibling);\n\t\t\t} else {\n\t\t\t\toldParent.appendChild(this);\n\t\t\t}\n\t\t}\n\t\t_docElement.removeChild(svg);\n\t\tthis.style.cssText = oldCSS;\n\t\treturn bbox;\n\t},\n\t_getAttributeFallbacks = (target, attributesArray) => {\n\t\tlet i = attributesArray.length;\n\t\twhile (i--) {\n\t\t\tif (target.hasAttribute(attributesArray[i])) {\n\t\t\t\treturn target.getAttribute(attributesArray[i]);\n\t\t\t}\n\t\t}\n\t},\n\t_getBBox = target => {\n\t\tlet bounds;\n\t\ttry {\n\t\t\tbounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a or ). https://bugzilla.mozilla.org/show_bug.cgi?id=612118\n\t\t} catch (error) {\n\t\t\tbounds = _getBBoxHack.call(target, true);\n\t\t}\n\t\t(bounds && (bounds.width || bounds.height)) || target.getBBox === _getBBoxHack || (bounds = _getBBoxHack.call(target, true));\n\t\t//some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.\n\t\treturn (bounds && !bounds.width && !bounds.x && !bounds.y) ? {x: +_getAttributeFallbacks(target, [\"x\",\"cx\",\"x1\"]) || 0, y:+_getAttributeFallbacks(target, [\"y\",\"cy\",\"y1\"]) || 0, width:0, height:0} : bounds;\n\t},\n\t_isSVG = e => !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e)), //reports if the element is an SVG on which getBBox() actually works\n\t_removeProperty = (target, property) => {\n\t\tif (property) {\n\t\t\tlet style = target.style;\n\t\t\tif (property in _transformProps && property !== _transformOriginProp) {\n\t\t\t\tproperty = _transformProp;\n\t\t\t}\n\t\t\tif (style.removeProperty) {\n\t\t\t\tif (property.substr(0,2) === \"ms\" || property.substr(0,6) === \"webkit\") { //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be \"ms-transform\" instead of \"-ms-transform\" for IE9, for example)\n\t\t\t\t\tproperty = \"-\" + property;\n\t\t\t\t}\n\t\t\t\tstyle.removeProperty(property.replace(_capsExp, \"-$1\").toLowerCase());\n\t\t\t} else { //note: old versions of IE use \"removeAttribute()\" instead of \"removeProperty()\"\n\t\t\t\tstyle.removeAttribute(property);\n\t\t\t}\n\t\t}\n\t},\n\t_addNonTweeningPT = (plugin, target, property, beginning, end, onlySetAtEnd) => {\n\t\tlet pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\n\t\tplugin._pt = pt;\n\t\tpt.b = beginning;\n\t\tpt.e = end;\n\t\tplugin._props.push(property);\n\t\treturn pt;\n\t},\n\t_nonConvertibleUnits = {deg:1, rad:1, turn:1},\n\t_nonStandardLayouts = {grid:1, flex:1},\n\t//takes a single value like 20px and converts it to the unit specified, like \"%\", returning only the numeric amount.\n\t_convertToUnit = (target, property, value, unit) => {\n\t\tlet curValue = parseFloat(value) || 0,\n\t\t\tcurUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\", // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()\n\t\t\tstyle = _tempDiv.style,\n\t\t\thorizontal = _horizontalExp.test(property),\n\t\t\tisRootSVG = target.tagName.toLowerCase() === \"svg\",\n\t\t\tmeasureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\n\t\t\tamount = 100,\n\t\t\ttoPixels = unit === \"px\",\n\t\t\ttoPercent = unit === \"%\",\n\t\t\tpx, parent, cache, isSVG;\n\t\tif (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\n\t\t\treturn curValue;\n\t\t}\n\t\t(curUnit !== \"px\" && !toPixels) && (curValue = _convertToUnit(target, property, value, \"px\"));\n\t\tisSVG = target.getCTM && _isSVG(target);\n\t\tif ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\n\t\t\tpx = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\n\t\t\treturn _round(toPercent ? curValue / px * amount : curValue / 100 * px);\n\t\t}\n\t\tstyle[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\n\t\tparent = (~property.indexOf(\"adius\") || (unit === \"em\" && target.appendChild && !isRootSVG)) ? target : target.parentNode;\n\t\tif (isSVG) {\n\t\t\tparent = (target.ownerSVGElement || {}).parentNode;\n\t\t}\n\t\tif (!parent || parent === _doc || !parent.appendChild) {\n\t\t\tparent = _doc.body;\n\t\t}\n\t\tcache = parent._gsap;\n\t\tif (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) {\n\t\t\treturn _round(curValue / cache.width * amount);\n\t\t} else {\n\t\t\t(toPercent || curUnit === \"%\") && !_nonStandardLayouts[_getComputedProperty(parent, \"display\")] && (style.position = _getComputedProperty(target, \"position\"));\n\t\t\t(parent === target) && (style.position = \"static\"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.\n\t\t\tparent.appendChild(_tempDiv);\n\t\t\tpx = _tempDiv[measureProperty];\n\t\t\tparent.removeChild(_tempDiv);\n\t\t\tstyle.position = \"absolute\";\n\t\t\tif (horizontal && toPercent) {\n\t\t\t\tcache = _getCache(parent);\n\t\t\t\tcache.time = _ticker.time;\n\t\t\t\tcache.width = parent[measureProperty];\n\t\t\t}\n\t\t}\n\t\treturn _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\n\t},\n\t_get = (target, property, unit, uncache) => {\n\t\tlet value;\n\t\t_pluginInitted || _initCore();\n\t\tif ((property in _propertyAliases) && property !== \"transform\") {\n\t\t\tproperty = _propertyAliases[property];\n\t\t\tif (~property.indexOf(\",\")) {\n\t\t\t\tproperty = property.split(\",\")[0];\n\t\t\t}\n\t\t}\n\t\tif (_transformProps[property] && property !== \"transform\") {\n\t\t\tvalue = _parseTransform(target, uncache);\n\t\t\tvalue = (property !== \"transformOrigin\") ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\n\t\t} else {\n\t\t\tvalue = target.style[property];\n\t\t\tif (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\n\t\t\t\tvalue = (_specialProps[property] && _specialProps[property](target, property, unit)) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius\n\t\t\t}\n\t\t}\n\t\treturn unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\n\n\t},\n\t_tweenComplexCSSString = function(target, prop, start, end) { // note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\t\tif (!start || start === \"none\") { // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style (\"clipPath\" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as \"none\" whereas WebkitClipPath reports accurately like \"ellipse(100% 0% at 50% 0%)\", so in this case we must SWITCH to using the prefixed property instead. See https://greensock.com/forums/topic/18310-clippath-doesnt-work-on-ios/\n\t\t\tlet p = _checkPropPrefix(prop, target, 1),\n\t\t\t\ts = p && _getComputedProperty(target, p, 1);\n\t\t\tif (s && s !== start) {\n\t\t\t\tprop = p;\n\t\t\t\tstart = s;\n\t\t\t} else if (prop === \"borderColor\") {\n\t\t\t\tstart = _getComputedProperty(target, \"borderTopColor\"); // Firefox bug: always reports \"borderColor\" as \"\", so we must fall back to borderTopColor. See https://greensock.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/\n\t\t\t}\n\t\t}\n\t\tlet pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\n\t\t\tindex = 0,\n\t\t\tmatchIndex = 0,\n\t\t\ta, result,\tstartValues, startNum, color, startValue, endValue, endNum, chunk, endUnit, startUnit, endValues;\n\t\tpt.b = start;\n\t\tpt.e = end;\n\t\tstart += \"\"; // ensure values are strings\n\t\tend += \"\";\n\t\tif (end === \"auto\") {\n\t\t\ttarget.style[prop] = end;\n\t\t\tend = _getComputedProperty(target, prop) || end;\n\t\t\ttarget.style[prop] = start;\n\t\t}\n\t\ta = [start, end];\n\t\t_colorStringFilter(a); // pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().\n\t\tstart = a[0];\n\t\tend = a[1];\n\t\tstartValues = start.match(_numWithUnitExp) || [];\n\t\tendValues = end.match(_numWithUnitExp) || [];\n\t\tif (endValues.length) {\n\t\t\twhile ((result = _numWithUnitExp.exec(end))) {\n\t\t\t\tendValue = result[0];\n\t\t\t\tchunk = end.substring(index, result.index);\n\t\t\t\tif (color) {\n\t\t\t\t\tcolor = (color + 1) % 5;\n\t\t\t\t} else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\n\t\t\t\t\tcolor = 1;\n\t\t\t\t}\n\t\t\t\tif (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\n\t\t\t\t\tstartNum = parseFloat(startValue) || 0;\n\t\t\t\t\tstartUnit = startValue.substr((startNum + \"\").length);\n\t\t\t\t\t(endValue.charAt(1) === \"=\") && (endValue = _parseRelative(startNum, endValue) + startUnit);\n\t\t\t\t\tendNum = parseFloat(endValue);\n\t\t\t\t\tendUnit = endValue.substr((endNum + \"\").length);\n\t\t\t\t\tindex = _numWithUnitExp.lastIndex - endUnit.length;\n\t\t\t\t\tif (!endUnit) { //if something like \"perspective:300\" is passed in and we must add a unit to the end\n\t\t\t\t\t\tendUnit = endUnit || _config.units[prop] || startUnit;\n\t\t\t\t\t\tif (index === end.length) {\n\t\t\t\t\t\t\tend += endUnit;\n\t\t\t\t\t\t\tpt.e += endUnit;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (startUnit !== endUnit) {\n\t\t\t\t\t\tstartNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\n\t\t\t\t\t}\n\t\t\t\t\t// these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\t\t\t\t\tpt._pt = {\n\t\t\t\t\t\t_next: pt._pt,\n\t\t\t\t\t\tp: (chunk || (matchIndex === 1)) ? chunk : \",\", //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n\t\t\t\t\t\ts: startNum,\n\t\t\t\t\t\tc: endNum - startNum,\n\t\t\t\t\t\tm: (color && color < 4) || prop === \"zIndex\" ? Math.round : 0\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tpt.c = (index < end.length) ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\t\t} else {\n\t\t\tpt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\n\t\t}\n\t\t_relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\t\tthis._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus \"this\" would refer to the plugin.\n\t\treturn pt;\n\t},\n\t_keywordToPercent = {top:\"0%\", bottom:\"100%\", left:\"0%\", right:\"100%\", center:\"50%\"},\n\t_convertKeywordsToPercentages = value => {\n\t\tlet split = value.split(\" \"),\n\t\t\tx = split[0],\n\t\t\ty = split[1] || \"50%\";\n\t\tif (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") { //the user provided them in the wrong order, so flip them\n\t\t\tvalue = x;\n\t\t\tx = y;\n\t\t\ty = value;\n\t\t}\n\t\tsplit[0] = _keywordToPercent[x] || x;\n\t\tsplit[1] = _keywordToPercent[y] || y;\n\t\treturn split.join(\" \");\n\t},\n\t_renderClearProps = (ratio, data) => {\n\t\tif (data.tween && data.tween._time === data.tween._dur) {\n\t\t\tlet target = data.t,\n\t\t\t\tstyle = target.style,\n\t\t\t\tprops = data.u,\n\t\t\t\tcache = target._gsap,\n\t\t\t\tprop, clearTransforms, i;\n\t\t\tif (props === \"all\" || props === true) {\n\t\t\t\tstyle.cssText = \"\";\n\t\t\t\tclearTransforms = 1;\n\t\t\t} else {\n\t\t\t\tprops = props.split(\",\");\n\t\t\t\ti = props.length;\n\t\t\t\twhile (--i > -1) {\n\t\t\t\t\tprop = props[i];\n\t\t\t\t\tif (_transformProps[prop]) {\n\t\t\t\t\t\tclearTransforms = 1;\n\t\t\t\t\t\tprop = (prop === \"transformOrigin\") ? _transformOriginProp : _transformProp;\n\t\t\t\t\t}\n\t\t\t\t\t_removeProperty(target, prop);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (clearTransforms) {\n\t\t\t\t_removeProperty(target, _transformProp);\n\t\t\t\tif (cache) {\n\t\t\t\t\tcache.svg && target.removeAttribute(\"transform\");\n\t\t\t\t\t_parseTransform(target, 1); // force all the cached values back to \"normal\"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.\n\t\t\t\t\tcache.uncache = 1;\n\t\t\t\t\t_removeIndependentTransforms(style);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t// note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.\n\t_specialProps = {\n\t\tclearProps(plugin, target, property, endValue, tween) {\n\t\t\tif (tween.data !== \"isFromStart\") {\n\t\t\t\tlet pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\n\t\t\t\tpt.u = endValue;\n\t\t\t\tpt.pr = -10;\n\t\t\t\tpt.tween = tween;\n\t\t\t\tplugin._props.push(property);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\t/* className feature (about 0.4kb gzipped).\n\t\t, className(plugin, target, property, endValue, tween) {\n\t\t\tlet _renderClassName = (ratio, data) => {\n\t\t\t\t\tdata.css.render(ratio, data.css);\n\t\t\t\t\tif (!ratio || ratio === 1) {\n\t\t\t\t\t\tlet inline = data.rmv,\n\t\t\t\t\t\t\ttarget = data.t,\n\t\t\t\t\t\t\tp;\n\t\t\t\t\t\ttarget.setAttribute(\"class\", ratio ? data.e : data.b);\n\t\t\t\t\t\tfor (p in inline) {\n\t\t\t\t\t\t\t_removeProperty(target, p);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t_getAllStyles = (target) => {\n\t\t\t\t\tlet styles = {},\n\t\t\t\t\t\tcomputed = getComputedStyle(target),\n\t\t\t\t\t\tp;\n\t\t\t\t\tfor (p in computed) {\n\t\t\t\t\t\tif (isNaN(p) && p !== \"cssText\" && p !== \"length\") {\n\t\t\t\t\t\t\tstyles[p] = computed[p];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_setDefaults(styles, _parseTransform(target, 1));\n\t\t\t\t\treturn styles;\n\t\t\t\t},\n\t\t\t\tstartClassList = target.getAttribute(\"class\"),\n\t\t\t\tstyle = target.style,\n\t\t\t\tcssText = style.cssText,\n\t\t\t\tcache = target._gsap,\n\t\t\t\tclassPT = cache.classPT,\n\t\t\t\tinlineToRemoveAtEnd = {},\n\t\t\t\tdata = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== \"=\") ? endValue : startClassList.replace(new RegExp(\"(?:\\\\s|^)\" + endValue.substr(2) + \"(?![\\\\w-])\"), \"\") + ((endValue.charAt(0) === \"+\") ? \" \" + endValue.substr(2) : \"\")},\n\t\t\t\tchangingVars = {},\n\t\t\t\tstartVars = _getAllStyles(target),\n\t\t\t\ttransformRelated = /(transform|perspective)/i,\n\t\t\t\tendVars, p;\n\t\t\tif (classPT) {\n\t\t\t\tclassPT.r(1, classPT.d);\n\t\t\t\t_removeLinkedListItem(classPT.d.plugin, classPT, \"_pt\");\n\t\t\t}\n\t\t\ttarget.setAttribute(\"class\", data.e);\n\t\t\tendVars = _getAllStyles(target, true);\n\t\t\ttarget.setAttribute(\"class\", startClassList);\n\t\t\tfor (p in endVars) {\n\t\t\t\tif (endVars[p] !== startVars[p] && !transformRelated.test(p)) {\n\t\t\t\t\tchangingVars[p] = endVars[p];\n\t\t\t\t\tif (!style[p] && style[p] !== \"0\") {\n\t\t\t\t\t\tinlineToRemoveAtEnd[p] = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcache.classPT = plugin._pt = new PropTween(plugin._pt, target, \"className\", 0, 0, _renderClassName, data, 0, -11);\n\t\t\tif (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://greensock.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.\n\t\t\t\tstyle.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).\n\t\t\t}\n\t\t\t_parseTransform(target, true); //to clear the caching of transforms\n\t\t\tdata.css = new gsap.plugins.css();\n\t\t\tdata.css.init(target, changingVars, tween);\n\t\t\tplugin._props.push(...data.css._props);\n\t\t\treturn 1;\n\t\t}\n\t\t*/\n\t},\n\n\n\n\n\n\t/*\n\t * --------------------------------------------------------------------------------------\n\t * TRANSFORMS\n\t * --------------------------------------------------------------------------------------\n\t */\n\t_identity2DMatrix = [1,0,0,1,0,0],\n\t_rotationalProperties = {},\n\t_isNullTransform = value => (value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value),\n\t_getComputedTransformMatrixAsArray = target => {\n\t\tlet matrixString = _getComputedProperty(target, _transformProp);\n\t\treturn _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\n\t},\n\t_getMatrix = (target, force2D) => {\n\t\tlet cache = target._gsap || _getCache(target),\n\t\t\tstyle = target.style,\n\t\t\tmatrix = _getComputedTransformMatrixAsArray(target),\n\t\t\tparent, nextSibling, temp, addedToDOM;\n\t\tif (cache.svg && target.getAttribute(\"transform\")) {\n\t\t\ttemp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like \"translate(50,60) rotate(135,0,0)\" are parsed because it mashes it into a matrix.\n\t\t\tmatrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\n\t\t\treturn (matrix.join(\",\") === \"1,0,0,1,0,0\") ? _identity2DMatrix : matrix;\n\t\t} else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) { //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n\t\t\t//browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not \"none\". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).\n\t\t\ttemp = style.display;\n\t\t\tstyle.display = \"block\";\n\t\t\tparent = target.parentNode;\n\t\t\tif (!parent || !target.offsetParent) { // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375\n\t\t\t\taddedToDOM = 1; //flag\n\t\t\t\tnextSibling = target.nextElementSibling;\n\t\t\t\t_docElement.appendChild(target); //we must add it to the DOM in order to get values properly\n\t\t\t}\n\t\t\tmatrix = _getComputedTransformMatrixAsArray(target);\n\t\t\ttemp ? (style.display = temp) : _removeProperty(target, \"display\");\n\t\t\tif (addedToDOM) {\n\t\t\t\tnextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\n\t\t\t}\n\t\t}\n\t\treturn (force2D && matrix.length > 6) ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\n\t},\n\t_applySVGOrigin = (target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) => {\n\t\tlet cache = target._gsap,\n\t\t\tmatrix = matrixArray || _getMatrix(target, true),\n\t\t\txOriginOld = cache.xOrigin || 0,\n\t\t\tyOriginOld = cache.yOrigin || 0,\n\t\t\txOffsetOld = cache.xOffset || 0,\n\t\t\tyOffsetOld = cache.yOffset || 0,\n\t\t\ta = matrix[0],\n\t\t\tb = matrix[1],\n\t\t\tc = matrix[2],\n\t\t\td = matrix[3],\n\t\t\ttx = matrix[4],\n\t\t\tty = matrix[5],\n\t\t\toriginSplit = origin.split(\" \"),\n\t\t\txOrigin = parseFloat(originSplit[0]) || 0,\n\t\t\tyOrigin = parseFloat(originSplit[1]) || 0,\n\t\t\tbounds, determinant, x, y;\n\t\tif (!originIsAbsolute) {\n\t\t\tbounds = _getBBox(target);\n\t\t\txOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\n\t\t\tyOrigin = bounds.y + (~((originSplit[1] || originSplit[0]).indexOf(\"%\")) ? yOrigin / 100 * bounds.height : yOrigin);\n\t\t} else if (matrix !== _identity2DMatrix && (determinant = (a * d - b * c))) { //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.\n\t\t\tx = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + ((c * ty - d * tx) / determinant);\n\t\t\ty = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - ((a * ty - b * tx) / determinant);\n\t\t\txOrigin = x;\n\t\t\tyOrigin = y;\n\t\t}\n\t\tif (smooth || (smooth !== false && cache.smooth)) {\n\t\t\ttx = xOrigin - xOriginOld;\n\t\t\tty = yOrigin - yOriginOld;\n\t\t\tcache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\n\t\t\tcache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\n\t\t} else {\n\t\t\tcache.xOffset = cache.yOffset = 0;\n\t\t}\n\t\tcache.xOrigin = xOrigin;\n\t\tcache.yOrigin = yOrigin;\n\t\tcache.smooth = !!smooth;\n\t\tcache.origin = origin;\n\t\tcache.originIsAbsolute = !!originIsAbsolute;\n\t\ttarget.style[_transformOriginProp] = \"0px 0px\"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).\n\t\tif (pluginToAddPropTweensTo) {\n\t\t\t_addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\n\t\t\t_addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\n\t\t\t_addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\n\t\t\t_addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\n\t\t}\n\t\ttarget.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\n\t},\n\t_parseTransform = (target, uncache) => {\n\t\tlet cache = target._gsap || new GSCache(target);\n\t\tif (\"x\" in cache && !uncache && !cache.uncache) {\n\t\t\treturn cache;\n\t\t}\n\t\tlet style = target.style,\n\t\t\tinvertedScaleX = cache.scaleX < 0,\n\t\t\tpx = \"px\",\n\t\t\tdeg = \"deg\",\n\t\t\tcs = getComputedStyle(target),\n\t\t\torigin = _getComputedProperty(target, _transformOriginProp) || \"0\",\n\t\t\tx, y, z, scaleX, scaleY, rotation, rotationX, rotationY, skewX, skewY, perspective, xOrigin, yOrigin,\n\t\t\tmatrix, angle, cos, sin, a, b, c, d, a12, a22, t1, t2, t3, a13, a23, a33, a42, a43, a32;\n\t\tx = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\n\t\tscaleX = scaleY = 1;\n\t\tcache.svg = !!(target.getCTM && _isSVG(target));\n\n\t\tif (cs.translate) { // accommodate independent transforms by combining them into normal ones.\n\t\t\tif (cs.translate !== \"none\" || cs.scale !== \"none\" || cs.rotate !== \"none\") {\n\t\t\t\tstyle[_transformProp] = (cs.translate !== \"none\" ? \"translate3d(\" + (cs.translate + \" 0 0\").split(\" \").slice(0, 3).join(\", \") + \") \" : \"\") + (cs.rotate !== \"none\" ? \"rotate(\" + cs.rotate + \") \" : \"\") + (cs.scale !== \"none\" ? \"scale(\" + cs.scale.split(\" \").join(\",\") + \") \" : \"\") + (cs[_transformProp] !== \"none\" ? cs[_transformProp] : \"\");\n\t\t\t}\n\t\t\tstyle.scale = style.rotate = style.translate = \"none\";\n\t\t}\n\n\t\tmatrix = _getMatrix(target, cache.svg);\n\t\tif (cache.svg) {\n\t\t\tif (cache.uncache) { // if cache.uncache is true (and maybe if origin is 0,0), we need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + \"px \" + (cache.yOrigin - bbox.y) + \"px\". Previously we let the data-svg-origin stay instead, but when introducing revert(), it complicated things.\n\t\t\t\tt2 = target.getBBox();\n\t\t\t\torigin = (cache.xOrigin - t2.x) + \"px \" + (cache.yOrigin - t2.y) + \"px\";\n\t\t\t\tt1 = \"\";\n\t\t\t} else {\n\t\t\t\tt1 = !uncache && target.getAttribute(\"data-svg-origin\"); // Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.\n\t\t\t}\n\t\t\t_applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\n\t\t}\n\t\txOrigin = cache.xOrigin || 0;\n\t\tyOrigin = cache.yOrigin || 0;\n\t\tif (matrix !== _identity2DMatrix) {\n\t\t\ta = matrix[0]; //a11\n\t\t\tb = matrix[1]; //a21\n\t\t\tc = matrix[2]; //a31\n\t\t\td = matrix[3]; //a41\n\t\t\tx = a12 = matrix[4];\n\t\t\ty = a22 = matrix[5];\n\n\t\t\t//2D matrix\n\t\t\tif (matrix.length === 6) {\n\t\t\t\tscaleX = Math.sqrt(a * a + b * b);\n\t\t\t\tscaleY = Math.sqrt(d * d + c * c);\n\t\t\t\trotation = (a || b) ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).\n\t\t\t\tskewX = (c || d) ? _atan2(c, d) * _RAD2DEG + rotation : 0;\n\t\t\t\tskewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\n\t\t\t\tif (cache.svg) {\n\t\t\t\t\tx -= xOrigin - (xOrigin * a + yOrigin * c);\n\t\t\t\t\ty -= yOrigin - (xOrigin * b + yOrigin * d);\n\t\t\t\t}\n\n\t\t\t//3D matrix\n\t\t\t} else {\n\t\t\t\ta32 = matrix[6];\n\t\t\t\ta42 = matrix[7];\n\t\t\t\ta13 = matrix[8];\n\t\t\t\ta23 = matrix[9];\n\t\t\t\ta33 = matrix[10];\n\t\t\t\ta43 = matrix[11];\n\t\t\t\tx = matrix[12];\n\t\t\t\ty = matrix[13];\n\t\t\t\tz = matrix[14];\n\n\t\t\t\tangle = _atan2(a32, a33);\n\t\t\t\trotationX = angle * _RAD2DEG;\n\t\t\t\t//rotationX\n\t\t\t\tif (angle) {\n\t\t\t\t\tcos = Math.cos(-angle);\n\t\t\t\t\tsin = Math.sin(-angle);\n\t\t\t\t\tt1 = a12*cos+a13*sin;\n\t\t\t\t\tt2 = a22*cos+a23*sin;\n\t\t\t\t\tt3 = a32*cos+a33*sin;\n\t\t\t\t\ta13 = a12*-sin+a13*cos;\n\t\t\t\t\ta23 = a22*-sin+a23*cos;\n\t\t\t\t\ta33 = a32*-sin+a33*cos;\n\t\t\t\t\ta43 = a42*-sin+a43*cos;\n\t\t\t\t\ta12 = t1;\n\t\t\t\t\ta22 = t2;\n\t\t\t\t\ta32 = t3;\n\t\t\t\t}\n\t\t\t\t//rotationY\n\t\t\t\tangle = _atan2(-c, a33);\n\t\t\t\trotationY = angle * _RAD2DEG;\n\t\t\t\tif (angle) {\n\t\t\t\t\tcos = Math.cos(-angle);\n\t\t\t\t\tsin = Math.sin(-angle);\n\t\t\t\t\tt1 = a*cos-a13*sin;\n\t\t\t\t\tt2 = b*cos-a23*sin;\n\t\t\t\t\tt3 = c*cos-a33*sin;\n\t\t\t\t\ta43 = d*sin+a43*cos;\n\t\t\t\t\ta = t1;\n\t\t\t\t\tb = t2;\n\t\t\t\t\tc = t3;\n\t\t\t\t}\n\t\t\t\t//rotationZ\n\t\t\t\tangle = _atan2(b, a);\n\t\t\t\trotation = angle * _RAD2DEG;\n\t\t\t\tif (angle) {\n\t\t\t\t\tcos = Math.cos(angle);\n\t\t\t\t\tsin = Math.sin(angle);\n\t\t\t\t\tt1 = a*cos+b*sin;\n\t\t\t\t\tt2 = a12*cos+a22*sin;\n\t\t\t\t\tb = b*cos-a*sin;\n\t\t\t\t\ta22 = a22*cos-a12*sin;\n\t\t\t\t\ta = t1;\n\t\t\t\t\ta12 = t2;\n\t\t\t\t}\n\n\t\t\t\tif (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) { //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.\n\t\t\t\t\trotationX = rotation = 0;\n\t\t\t\t\trotationY = 180 - rotationY;\n\t\t\t\t}\n\t\t\t\tscaleX = _round(Math.sqrt(a * a + b * b + c * c));\n\t\t\t\tscaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\n\t\t\t\tangle = _atan2(a12, a22);\n\t\t\t\tskewX = (Math.abs(angle) > 0.0002) ? angle * _RAD2DEG : 0;\n\t\t\t\tperspective = a43 ? 1 / ((a43 < 0) ? -a43 : a43) : 0;\n\t\t\t}\n\n\t\t\tif (cache.svg) { //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).\n\t\t\t\tt1 = target.getAttribute(\"transform\");\n\t\t\t\tcache.forceCSS = target.setAttribute(\"transform\", \"\") || (!_isNullTransform(_getComputedProperty(target, _transformProp)));\n\t\t\t\tt1 && target.setAttribute(\"transform\", t1);\n\t\t\t}\n\t\t}\n\n\t\tif (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\n\t\t\tif (invertedScaleX) {\n\t\t\t\tscaleX *= -1;\n\t\t\t\tskewX += (rotation <= 0) ? 180 : -180;\n\t\t\t\trotation += (rotation <= 0) ? 180 : -180;\n\t\t\t} else {\n\t\t\t\tscaleY *= -1;\n\t\t\t\tskewX += (skewX <= 0) ? 180 : -180;\n\t\t\t}\n\t\t}\n\t\tuncache = uncache || cache.uncache;\n\t\tcache.x = x - ((cache.xPercent = x && ((!uncache && cache.xPercent) || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\n\t\tcache.y = y - ((cache.yPercent = y && ((!uncache && cache.yPercent) || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\n\t\tcache.z = z + px;\n\t\tcache.scaleX = _round(scaleX);\n\t\tcache.scaleY = _round(scaleY);\n\t\tcache.rotation = _round(rotation) + deg;\n\t\tcache.rotationX = _round(rotationX) + deg;\n\t\tcache.rotationY = _round(rotationY) + deg;\n\t\tcache.skewX = skewX + deg;\n\t\tcache.skewY = skewY + deg;\n\t\tcache.transformPerspective = perspective + px;\n\t\tif ((cache.zOrigin = parseFloat(origin.split(\" \")[2]) || 0)) {\n\t\t\tstyle[_transformOriginProp] = _firstTwoOnly(origin);\n\t\t}\n\t\tcache.xOffset = cache.yOffset = 0;\n\t\tcache.force3D = _config.force3D;\n\t\tcache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\n\t\tcache.uncache = 0;\n\t\treturn cache;\n\t},\n\t_firstTwoOnly = value => (value = value.split(\" \"))[0] + \" \" + value[1], //for handling transformOrigin values, stripping out the 3rd dimension\n\t_addPxTranslate = (target, start, value) => {\n\t\tlet unit = getUnit(start);\n\t\treturn _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\n\t},\n\t_renderNon3DTransforms = (ratio, cache) => {\n\t\tcache.z = \"0px\";\n\t\tcache.rotationY = cache.rotationX = \"0deg\";\n\t\tcache.force3D = 0;\n\t\t_renderCSSTransforms(ratio, cache);\n\t},\n\t_zeroDeg = \"0deg\",\n\t_zeroPx = \"0px\",\n\t_endParenthesis = \") \",\n\t_renderCSSTransforms = function(ratio, cache) {\n\t\tlet {xPercent, yPercent, x, y, z, rotation, rotationY, rotationX, skewX, skewY, scaleX, scaleY, transformPerspective, force3D, target, zOrigin} = cache || this,\n\t\t\ttransforms = \"\",\n\t\t\tuse3D = (force3D === \"auto\" && ratio && ratio !== 1) || force3D === true;\n\n\t\t// Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)\n\t\tif (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\n\t\t\tlet angle = parseFloat(rotationY) * _DEG2RAD,\n\t\t\t\ta13 = Math.sin(angle),\n\t\t\t\ta33 = Math.cos(angle),\n\t\t\t\tcos;\n\t\t\tangle = parseFloat(rotationX) * _DEG2RAD;\n\t\t\tcos = Math.cos(angle);\n\t\t\tx = _addPxTranslate(target, x, a13 * cos * -zOrigin);\n\t\t\ty = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\n\t\t\tz = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\n\t\t}\n\n\t\tif (transformPerspective !== _zeroPx) {\n\t\t\ttransforms += \"perspective(\" + transformPerspective + _endParenthesis;\n\t\t}\n\t\tif (xPercent || yPercent) {\n\t\t\ttransforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\n\t\t}\n\t\tif (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\n\t\t\ttransforms += (z !== _zeroPx || use3D) ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\n\t\t}\n\t\tif (rotation !== _zeroDeg) {\n\t\t\ttransforms += \"rotate(\" + rotation + _endParenthesis;\n\t\t}\n\t\tif (rotationY !== _zeroDeg) {\n\t\t\ttransforms += \"rotateY(\" + rotationY + _endParenthesis;\n\t\t}\n\t\tif (rotationX !== _zeroDeg) {\n\t\t\ttransforms += \"rotateX(\" + rotationX + _endParenthesis;\n\t\t}\n\t\tif (skewX !== _zeroDeg || skewY !== _zeroDeg) {\n\t\t\ttransforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\n\t\t}\n\t\tif (scaleX !== 1 || scaleY !== 1) {\n\t\t\ttransforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\n\t\t}\n\t\ttarget.style[_transformProp] = transforms || \"translate(0, 0)\";\n\t},\n\t_renderSVGTransforms = function(ratio, cache) {\n\t\tlet {xPercent, yPercent, x, y, rotation, skewX, skewY, scaleX, scaleY, target, xOrigin, yOrigin, xOffset, yOffset, forceCSS} = cache || this,\n\t\t\ttx = parseFloat(x),\n\t\t\tty = parseFloat(y),\n\t\t\ta11, a21, a12, a22, temp;\n\t\trotation = parseFloat(rotation);\n\t\tskewX = parseFloat(skewX);\n\t\tskewY = parseFloat(skewY);\n\t\tif (skewY) { //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.\n\t\t\tskewY = parseFloat(skewY);\n\t\t\tskewX += skewY;\n\t\t\trotation += skewY;\n\t\t}\n\t\tif (rotation || skewX) {\n\t\t\trotation *= _DEG2RAD;\n\t\t\tskewX *= _DEG2RAD;\n\t\t\ta11 = Math.cos(rotation) * scaleX;\n\t\t\ta21 = Math.sin(rotation) * scaleX;\n\t\t\ta12 = Math.sin(rotation - skewX) * -scaleY;\n\t\t\ta22 = Math.cos(rotation - skewX) * scaleY;\n\t\t\tif (skewX) {\n\t\t\t\tskewY *= _DEG2RAD;\n\t\t\t\ttemp = Math.tan(skewX - skewY);\n\t\t\t\ttemp = Math.sqrt(1 + temp * temp);\n\t\t\t\ta12 *= temp;\n\t\t\t\ta22 *= temp;\n\t\t\t\tif (skewY) {\n\t\t\t\t\ttemp = Math.tan(skewY);\n\t\t\t\t\ttemp = Math.sqrt(1 + temp * temp);\n\t\t\t\t\ta11 *= temp;\n\t\t\t\t\ta21 *= temp;\n\t\t\t\t}\n\t\t\t}\n\t\t\ta11 = _round(a11);\n\t\t\ta21 = _round(a21);\n\t\t\ta12 = _round(a12);\n\t\t\ta22 = _round(a22);\n\t\t} else {\n\t\t\ta11 = scaleX;\n\t\t\ta22 = scaleY;\n\t\t\ta21 = a12 = 0;\n\t\t}\n\t\tif ((tx && !~(x + \"\").indexOf(\"px\")) || (ty && !~(y + \"\").indexOf(\"px\"))) {\n\t\t\ttx = _convertToUnit(target, \"x\", x, \"px\");\n\t\t\tty = _convertToUnit(target, \"y\", y, \"px\");\n\t\t}\n\t\tif (xOrigin || yOrigin || xOffset || yOffset) {\n\t\t\ttx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\n\t\t\tty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\n\t\t}\n\t\tif (xPercent || yPercent) {\n\t\t\t//The SVG spec doesn't support percentage-based translation in the \"transform\" attribute, so we merge it into the translation to simulate it.\n\t\t\ttemp = target.getBBox();\n\t\t\ttx = _round(tx + xPercent / 100 * temp.width);\n\t\t\tty = _round(ty + yPercent / 100 * temp.height);\n\t\t}\n\t\ttemp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\n\t\ttarget.setAttribute(\"transform\", temp);\n\t\tforceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)\n\t},\n\t_addRotationalPropTween = function(plugin, target, property, startNum, endValue) {\n\t\tlet cap = 360,\n\t\t\tisString = _isString(endValue),\n\t\t\tendNum = parseFloat(endValue) * ((isString && ~endValue.indexOf(\"rad\")) ? _RAD2DEG : 1),\n\t\t\tchange = endNum - startNum,\n\t\t\tfinalValue = (startNum + change) + \"deg\",\n\t\t\tdirection, pt;\n\t\tif (isString) {\n\t\t\tdirection = endValue.split(\"_\")[1];\n\t\t\tif (direction === \"short\") {\n\t\t\t\tchange %= cap;\n\t\t\t\tif (change !== change % (cap / 2)) {\n\t\t\t\t\tchange += (change < 0) ? cap : -cap;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (direction === \"cw\" && change < 0) {\n\t\t\t\tchange = ((change + cap * _bigNum) % cap) - ~~(change / cap) * cap;\n\t\t\t} else if (direction === \"ccw\" && change > 0) {\n\t\t\t\tchange = ((change - cap * _bigNum) % cap) - ~~(change / cap) * cap;\n\t\t\t}\n\t\t}\n\t\tplugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\n\t\tpt.e = finalValue;\n\t\tpt.u = \"deg\";\n\t\tplugin._props.push(property);\n\t\treturn pt;\n\t},\n\t_assign = (target, source) => { // Internet Explorer doesn't have Object.assign(), so we recreate it here.\n\t\tfor (let p in source) {\n\t\t\ttarget[p] = source[p];\n\t\t}\n\t\treturn target;\n\t},\n\t_addRawTransformPTs = (plugin, transforms, target) => { //for handling cases where someone passes in a whole transform string, like transform: \"scale(2, 3) rotate(20deg) translateY(30em)\"\n\t\tlet startCache = _assign({}, target._gsap),\n\t\t\texclude = \"perspective,force3D,transformOrigin,svgOrigin\",\n\t\t\tstyle = target.style,\n\t\t\tendCache, p, startValue, endValue, startNum, endNum, startUnit, endUnit;\n\t\tif (startCache.svg) {\n\t\t\tstartValue = target.getAttribute(\"transform\");\n\t\t\ttarget.setAttribute(\"transform\", \"\");\n\t\t\tstyle[_transformProp] = transforms;\n\t\t\tendCache = _parseTransform(target, 1);\n\t\t\t_removeProperty(target, _transformProp);\n\t\t\ttarget.setAttribute(\"transform\", startValue);\n\t\t} else {\n\t\t\tstartValue = getComputedStyle(target)[_transformProp];\n\t\t\tstyle[_transformProp] = transforms;\n\t\t\tendCache = _parseTransform(target, 1);\n\t\t\tstyle[_transformProp] = startValue;\n\t\t}\n\t\tfor (p in _transformProps) {\n\t\t\tstartValue = startCache[p];\n\t\t\tendValue = endCache[p];\n\t\t\tif (startValue !== endValue && exclude.indexOf(p) < 0) { //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.\n\t\t\t\tstartUnit = getUnit(startValue);\n\t\t\t\tendUnit = getUnit(endValue);\n\t\t\t\tstartNum = (startUnit !== endUnit) ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\n\t\t\t\tendNum = parseFloat(endValue);\n\t\t\t\tplugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\n\t\t\t\tplugin._pt.u = endUnit || 0;\n\t\t\t\tplugin._props.push(p);\n\t\t\t}\n\t\t}\n\t\t_assign(endCache, startCache);\n\t};\n\n// handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.\n_forEachName(\"padding,margin,Width,Radius\", (name, index) => {\n\tlet t = \"Top\",\n\t\tr = \"Right\",\n\t\tb = \"Bottom\",\n\t\tl = \"Left\",\n\t\tprops = (index < 3 ? [t,r,b,l] : [t+l, t+r, b+r, b+l]).map(side => index < 2 ? name + side : \"border\" + side + name);\n\t_specialProps[(index > 1 ? \"border\" + name : name)] = function(plugin, target, property, endValue, tween) {\n\t\tlet a, vars;\n\t\tif (arguments.length < 4) { // getter, passed target, property, and unit (from _get())\n\t\t\ta = props.map(prop => _get(plugin, prop, property));\n\t\t\tvars = a.join(\" \");\n\t\t\treturn vars.split(a[0]).length === 5 ? a[0] : vars;\n\t\t}\n\t\ta = (endValue + \"\").split(\" \");\n\t\tvars = {};\n\t\tprops.forEach((prop, i) => vars[prop] = a[i] = a[i] || a[(((i - 1) / 2) | 0)]);\n\t\tplugin.init(target, vars, tween);\n\t}\n});\n\n\nexport const CSSPlugin = {\n\tname: \"css\",\n\tregister: _initCore,\n\ttargetTest(target) {\n\t\treturn target.style && target.nodeType;\n\t},\n\tinit(target, vars, tween, index, targets) {\n\t\tlet props = this._props,\n\t\t\tstyle = target.style,\n\t\t\tstartAt = tween.vars.startAt,\n\t\t\tstartValue, endValue, endNum, startNum, type, specialProp, p, startUnit, endUnit, relative, isTransformRelated, transformPropTween, cache, smooth, hasPriority, inlineProps;\n\t\t_pluginInitted || _initCore();\n\t\t// we may call init() multiple times on the same plugin instance, like when adding special properties, so make sure we don't overwrite the revert data or inlineProps\n\t\tthis.styles = this.styles || _getStyleSaver(target);\n\t\tinlineProps = this.styles.props;\n\t\tthis.tween = tween;\n\t\tfor (p in vars) {\n\t\t\tif (p === \"autoRound\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tendValue = vars[p];\n\t\t\tif (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) { // plugins\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttype = typeof(endValue);\n\t\t\tspecialProp = _specialProps[p];\n\t\t\tif (type === \"function\") {\n\t\t\t\tendValue = endValue.call(tween, index, target, targets);\n\t\t\t\ttype = typeof(endValue);\n\t\t\t}\n\t\t\tif (type === \"string\" && ~endValue.indexOf(\"random(\")) {\n\t\t\t\tendValue = _replaceRandom(endValue);\n\t\t\t}\n\t\t\tif (specialProp) {\n\t\t\t\tspecialProp(this, target, p, endValue, tween) && (hasPriority = 1);\n\t\t\t} else if (p.substr(0,2) === \"--\") { //CSS variable\n\t\t\t\tstartValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\n\t\t\t\tendValue += \"\";\n\t\t\t\t_colorExp.lastIndex = 0;\n\t\t\t\tif (!_colorExp.test(startValue)) { // colors don't have units\n\t\t\t\t\tstartUnit = getUnit(startValue);\n\t\t\t\t\tendUnit = getUnit(endValue);\n\t\t\t\t}\n\t\t\t\tendUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\n\t\t\t\tthis.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\n\t\t\t\tprops.push(p);\n\t\t\t\tinlineProps.push(p, 0, style[p]);\n\t\t\t} else if (type !== \"undefined\") {\n\t\t\t\tif (startAt && p in startAt) { // in case someone hard-codes a complex value as the start, like top: \"calc(2vh / 2)\". Without this, it'd use the computed value (always in px)\n\t\t\t\t\tstartValue = typeof(startAt[p]) === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\n\t\t\t\t\t_isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\n\t\t\t\t\tgetUnit(startValue + \"\") || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\"); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.\n\t\t\t\t\t(startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p)); // can't work with relative values\n\t\t\t\t} else {\n\t\t\t\t\tstartValue = _get(target, p);\n\t\t\t\t}\n\t\t\t\tstartNum = parseFloat(startValue);\n\t\t\t\trelative = (type === \"string\" && endValue.charAt(1) === \"=\") && endValue.substr(0, 2);\n\t\t\t\trelative && (endValue = endValue.substr(2));\n\t\t\t\tendNum = parseFloat(endValue);\n\t\t\t\tif (p in _propertyAliases) {\n\t\t\t\t\tif (p === \"autoAlpha\") { //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.\n\t\t\t\t\t\tif (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) { //if visibility is initially set to \"hidden\", we should interpret that as intent to make opacity 0 (a convenience)\n\t\t\t\t\t\t\tstartNum = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinlineProps.push(\"visibility\", 0, style.visibility);\n\t\t\t\t\t\t_addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\n\t\t\t\t\t}\n\t\t\t\t\tif (p !== \"scale\" && p !== \"transform\") {\n\t\t\t\t\t\tp = _propertyAliases[p];\n\t\t\t\t\t\t~p.indexOf(\",\") && (p = p.split(\",\")[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tisTransformRelated = (p in _transformProps);\n\n\t\t\t\t//--- TRANSFORM-RELATED ---\n\t\t\t\tif (isTransformRelated) {\n\t\t\t\t\tthis.styles.save(p);\n\t\t\t\t\tif (!transformPropTween) {\n\t\t\t\t\t\tcache = target._gsap;\n\t\t\t\t\t\t(cache.renderTransform && !vars.parseTransform) || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:\"translateX(50vw)\"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.\n\t\t\t\t\t\tsmooth = (vars.smoothOrigin !== false && cache.smooth);\n\t\t\t\t\t\ttransformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)\n\t\t\t\t\t\ttransformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.\n\t\t\t\t\t}\n\t\t\t\t\tif (p === \"scale\") {\n\t\t\t\t\t\tthis._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, ((relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY) || 0, _renderCSSProp);\n\t\t\t\t\t\tthis._pt.u = 0;\n\t\t\t\t\t\tprops.push(\"scaleY\", p);\n\t\t\t\t\t\tp += \"X\";\n\t\t\t\t\t} else if (p === \"transformOrigin\") {\n\t\t\t\t\t\tinlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);\n\t\t\t\t\t\tendValue = _convertKeywordsToPercentages(endValue); //in case something like \"left top\" or \"bottom right\" is passed in. Convert to percentages.\n\t\t\t\t\t\tif (cache.svg) {\n\t\t\t\t\t\t\t_applySVGOrigin(target, endValue, 0, smooth, 0, this);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tendUnit = parseFloat(endValue.split(\" \")[2]) || 0; //handle the zOrigin separately!\n\t\t\t\t\t\t\tendUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\n\t\t\t\t\t\t\t_addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (p === \"svgOrigin\") {\n\t\t\t\t\t\t_applySVGOrigin(target, endValue, 1, smooth, 0, this);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (p in _rotationalProperties) {\n\t\t\t\t\t\t_addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue);\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t} else if (p === \"smoothOrigin\") {\n\t\t\t\t\t\t_addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (p === \"force3D\") {\n\t\t\t\t\t\tcache[p] = endValue;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else if (p === \"transform\") {\n\t\t\t\t\t\t_addRawTransformPTs(this, endValue, target);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else if (!(p in style)) {\n\t\t\t\t\tp = _checkPropPrefix(p) || p;\n\t\t\t\t}\n\n\t\t\t\tif (isTransformRelated || ((endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && (p in style))) {\n\t\t\t\t\tstartUnit = (startValue + \"\").substr((startNum + \"\").length);\n\t\t\t\t\tendNum || (endNum = 0); // protect against NaN\n\t\t\t\t\tendUnit = getUnit(endValue) || ((p in _config.units) ? _config.units[p] : startUnit);\n\t\t\t\t\tstartUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\n\t\t\t\t\tthis._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, (!isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false) ? _renderRoundedCSSProp : _renderCSSProp);\n\t\t\t\t\tthis._pt.u = endUnit || 0;\n\t\t\t\t\tif (startUnit !== endUnit && endUnit !== \"%\") { //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a \"b\" (beginning) property and point to a render method that handles that. (performance optimization)\n\t\t\t\t\t\tthis._pt.b = startValue;\n\t\t\t\t\t\tthis._pt.r = _renderCSSPropWithBeginning;\n\t\t\t\t\t}\n\t\t\t\t} else if (!(p in style)) {\n\t\t\t\t\tif (p in target) { //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.\n\t\t\t\t\t\tthis.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);\n\t\t\t\t\t} else if (p !== \"parseTransform\") {\n\t\t\t\t\t\t_missingPlugin(p, endValue);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);\n\t\t\t\t}\n\t\t\t\tisTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : inlineProps.push(p, 1, startValue || target[p]));\n\t\t\t\tprops.push(p);\n\t\t\t}\n\t\t}\n\t\thasPriority && _sortPropTweensByPriority(this);\n\n\t},\n\trender(ratio, data) {\n\t\tif (data.tween._time || !_reverting()) {\n\t\t\tlet pt = data._pt;\n\t\t\twhile (pt) {\n\t\t\t\tpt.r(ratio, pt.d);\n\t\t\t\tpt = pt._next;\n\t\t\t}\n\t\t} else {\n\t\t\tdata.styles.revert();\n\t\t}\n\t},\n\tget: _get,\n\taliases: _propertyAliases,\n\tgetSetter(target, property, plugin) { //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like \"x\" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.\n\t\tlet p = _propertyAliases[property];\n\t\t(p && p.indexOf(\",\") < 0) && (property = p);\n\t\treturn (property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\"))) ? (plugin && _recentSetterPlugin === plugin ? (property === \"scale\" ? _setterScale : _setterTransform) : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender)) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\n\t},\n\tcore: { _removeProperty, _getMatrix }\n\n};\n\ngsap.utils.checkPrefix = _checkPropPrefix;\ngsap.core.getStyleSaver = _getStyleSaver;\n(function(positionAndScale, rotation, others, aliases) {\n\tlet all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, name => {_transformProps[name] = 1});\n\t_forEachName(rotation, name => {_config.units[name] = \"deg\"; _rotationalProperties[name] = 1});\n\t_propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\n\t_forEachName(aliases, name => {\n\t\tlet split = name.split(\":\");\n\t\t_propertyAliases[split[1]] = all[split[0]];\n\t});\n})(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\n_forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", name => {_config.units[name] = \"px\"});\n\ngsap.registerPlugin(CSSPlugin);\n\nexport { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix };","import { gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenLite, TimelineLite, TimelineMax } from \"./gsap-core.js\";\nimport { CSSPlugin } from \"./CSSPlugin.js\";\n\nconst gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap, // to protect from tree shaking\n\tTweenMaxWithCSS = gsapWithCSS.core.Tween;\n\nexport {\n\tgsapWithCSS as gsap,\n\tgsapWithCSS as default,\n\tCSSPlugin,\n\tTweenMaxWithCSS as TweenMax,\n\tTweenLite,\n\tTimelineMax,\n\tTimelineLite,\n\tPower0,\n\tPower1,\n\tPower2,\n\tPower3,\n\tPower4,\n\tLinear,\n\tQuad,\n\tCubic,\n\tQuart,\n\tQuint,\n\tStrong,\n\tElastic,\n\tBack,\n\tSteppedEase,\n\tBounce,\n\tSine,\n\tExpo,\n\tCirc\n};"],"names":["_isString","value","_isFunction","_isNumber","_isUndefined","_isObject","_isNotFalse","_windowExists","window","_isFuncOrString","_install","scope","_installScope","_merge","_globals","gsap","_missingPlugin","property","console","warn","_warn","message","suppress","_addGlobal","name","obj","_emptyFunc","_harness","targets","harnessPlugin","i","target","_gsap","harness","_harnessPlugins","length","targetTest","GSCache","splice","_getCache","toArray","_getProperty","v","getAttribute","_forEachName","names","func","split","forEach","_round","Math","round","_roundPrecise","_parseRelative","start","operator","charAt","end","parseFloat","substr","_arrayContainsAny","toSearch","toFind","l","indexOf","_lazyRender","tween","_lazyTweens","a","slice","_lazyLookup","_lazy","render","_lazySafeRender","animation","time","suppressEvents","force","_reverting","_initted","_startAt","_numericIfPossible","n","match","_delimitedValueExp","trim","_passThrough","p","_setDefaults","defaults","_mergeDeep","base","toMerge","_copyExcluding","excluding","copy","_inheritDefaults","vars","parent","_globalTimeline","keyframes","_setKeyframeDefaults","excludeDuration","_isArray","inherit","_dp","_addLinkedListItem","child","firstProp","lastProp","sortBy","t","prev","_prev","_next","_removeLinkedListItem","next","_removeFromParent","onlyIfParentHasAutoRemove","autoRemoveChildren","remove","_act","_uncache","_end","_dur","_start","_dirty","_rewindStartAt","totalTime","revert","_revertConfigNoKill","immediateRender","autoRevert","_elapsedCycleDuration","_repeat","_animationCycle","_tTime","duration","_rDelay","_parentToChildTotalTime","parentTime","_ts","totalDuration","_tDur","_setEnd","abs","_rts","_tinyNum","_alignPlayhead","smoothChildTiming","_time","_postAddChecks","timeline","rawTime","_clamp","_zTime","_addToTimeline","position","skipChecks","_parsePosition","_delay","timeScale","_sort","_isFromOrFromStart","_recent","_scrollTrigger","trigger","ScrollTrigger","create","_attemptInitTween","tTime","_initTween","_pt","lazy","_lastRenderedFrame","_ticker","frame","push","_setDuration","skipUncache","leavePlayhead","repeat","dur","totalProgress","_onUpdateTotalDuration","Timeline","_createTweenType","type","params","irVars","isLegacy","varsIndex","runBackwards","startAt","Tween","_conditionalReturn","getUnit","_unitExp","exec","_isArrayLike","nonEmpty","nodeType","_win","selector","el","current","nativeElement","querySelectorAll","_doc","createElement","shuffle","sort","random","distribute","each","ease","_parseEase","from","cache","isDecimal","ratios","isNaN","axis","ratioX","ratioY","center","edges","originX","originY","x","y","d","j","max","min","wrapAt","distances","grid","_bigNum","getBoundingClientRect","left","_sqrt","amount","b","u","_invertEase","_roundModifier","pow","raw","snap","snapTo","radius","is2D","isArray","values","increment","dx","dy","closest","roundingIncrement","returnFunction","floor","_wrapArray","wrapper","index","_replaceRandom","nums","s","_strictNumExp","_getLabelInDirection","fromTime","backward","distance","label","labels","_interrupt","scrollTrigger","kill","progress","_callback","_createPlugin","config","isFunc","Plugin","init","_props","instanceDefaults","_renderPropTweens","add","_addPropTween","_killPropTweensOf","modifier","_addPluginModifier","rawVars","statics","get","getSetter","_getSetter","aliases","register","_wake","_plugins","prototype","prop","_reservedProps","toUpperCase","PropTween","_registerPluginQueue","_hue","h","m1","m2","_255","splitColor","toHSL","forceAlpha","r","g","wasHSL","_colorLookup","black","parseInt","_numExp","transparent","map","Number","_colorOrderData","c","_colorExp","_numWithUnitExp","_formatColors","orderMatchData","shell","result","colors","color","join","replace","shift","_colorStringFilter","combined","lastIndex","test","_hslExp","_configEaseFromString","_easeMap","apply","_parseObjectInString","val","parsedVal","key","lastIndexOf","_quotesExp","_valueInParentheses","open","close","nested","substring","_CE","_customEaseExp","_propagateYoyoEase","isYoyo","_first","yoyoEase","_yoyo","_ease","_yEase","_insertEase","easeIn","easeOut","easeInOut","lowercaseName","toLowerCase","_easeInOutFromOut","_configElastic","amplitude","period","p1","_sin","p3","p2","_2PI","asin","_configBack","overshoot","_suppressOverwrites","_context","_coreInitted","_coreReady","_quickTween","_tickerActive","_id","_req","_raf","_self","_delta","_i","_getTime","_lagThreshold","_adjustedLag","_startTime","_lastUpdate","_gap","_nextTime","_listeners","n1","_config","autoSleep","force3D","nullTargetWarn","units","lineHeight","_defaults","overwrite","delay","PI","_HALF_PI","_gsID","sqrt","_cos","cos","sin","_isTypedArray","ArrayBuffer","isView","Array","_complexStringNumExp","_relExp","_startAtRevertConfig","isStart","_revertConfig","_effects","_nextGCFrame","_callbackNames","cycleDuration","whole","data","_zeroPosition","endTime","percentAnimation","offset","isPercent","recent","clippedDuration","_slice","leaveStrings","_flatten","ar","accumulator","call","mapRange","inMin","inMax","outMin","outMax","inRange","outRange","executeLazyFirst","callback","prevContext","context","_ctx","callbackScope","aqua","lime","silver","maroon","teal","blue","navy","white","olive","yellow","orange","gray","purple","green","red","pink","cyan","RegExp","Date","now","tick","_tick","deltaRatio","fps","wake","document","gsapVersions","version","GreenSockGlobals","requestAnimationFrame","sleep","f","setTimeout","cancelAnimationFrame","clearTimeout","lagSmoothing","threshold","adjustedLag","Infinity","once","prioritize","defaultEase","overlap","dispatch","elapsed","manual","power","Linear","easeNone","none","SteppedEase","steps","immediateStart","id","this","set","Animation","startTime","arguments","_ptLookup","_pTime","ratio","iteration","_ps","_recacheAncestors","paused","includeRepeats","wrapRepeats","prevIsReverting","globalTime","_sat","repeatDelay","yoyo","seek","restart","includeDelay","play","reversed","reverse","pause","atTime","resume","invalidate","isActive","eventCallback","_onUpdate","then","onFulfilled","self","Promise","resolve","_resolve","_then","_prom","sortChildren","_this","to","fromTo","fromVars","toVars","delayedCall","staggerTo","stagger","onCompleteAll","onCompleteAllParams","onComplete","onCompleteParams","staggerFrom","staggerFromTo","prevPaused","pauseTween","prevStart","prevIteration","prevTime","tDur","crossingStart","_lock","rewinding","doesWrap","repeatRefresh","onRepeat","_hasPause","_forcing","_findNextPauseTween","_last","onUpdate","adjustedTime","_this2","addLabel","getChildren","tweens","timelines","ignoreBeforeTime","getById","animations","removeLabel","killTweensOf","addPause","removePause","props","onlyActive","getTweensOf","_overwritingTween","children","parsedTargets","isGlobalTime","_targets","tweenTo","initted","tl","onStart","onStartParams","tweenFromTo","fromPosition","toPosition","nextLabel","afterTime","previousLabel","beforeTime","currentLabel","shiftChildren","adjustLabels","soft","clear","includeLabels","updateRoot","_checkPlugin","plugin","pt","ptLookup","_processVars","_parseFuncOrString","style","priority","_parseKeyframe","allProps","easeEach","e","_forceAllPropTweens","stringFilter","funcParam","optional","currentValue","parsedStart","setter","_setterFuncWithParam","_setterFunc","_setterPlain","_addComplexStringPropTween","startNums","endNum","chunk","startNum","hasRandom","_renderComplexString","matchIndex","m","fp","_renderBoolean","_renderPlain","cleanVars","hasPriority","gsData","harnessVars","overwritten","onUpdateParams","prevStartAt","fullTargets","autoOverwrite","_overwrite","_from","_ptCache","_op","_sortPropTweensByPriority","_onInit","_staggerTweenProps","_staggerPropsToSkip","skipInherit","curTarget","staggerFunc","staggerVarsToMerge","_this3","kf","_hasNoPausedAncestors","isNegative","_renderZeroDurationTween","prevRatio","_parentPlayheadIsBeforeStart","resetTo","startIsRelative","_updatePropTweens","rootPT","lookup","ptCache","overwrittenProps","curLookup","curOverwriteProps","killingTargets","propTweenLookup","firstPT","_arraysMatch","a1","a2","_addAliasesToVars","propertyAliases","onReverseComplete","onReverseCompleteParams","_setterAttribute","setAttribute","_setterWithModifier","mSet","mt","hasNonDependentRemaining","op","dep","pt2","first","last","pr","change","renderer","TweenMax","TweenLite","TimelineLite","TimelineMax","_dispatch","_emptyArray","_onMediaChange","matches","_lastMediaTime","_media","anyMatch","toggled","queries","conditions","matchMedia","onMatch","_contextID","Context","prevSelector","_r","isReverted","ignore","getTweens","o","_this4","MatchMedia","mq","active","cond","contexts","addListener","addEventListener","registerPlugin","args","getProperty","unit","uncache","getter","format","quickSetter","setters","quickTo","isTweening","registerEffect","effect","plugins","extendTimeline","pluginName","registerEase","parseEase","exportRoot","includeDelayedCalls","matchMediaRefresh","found","removeEventListener","utils","wrap","range","wrapYoyo","total","normalize","clamp","pipe","functions","reduce","unitize","interpolate","mutate","interpolators","il","isString","master","install","effects","ticker","globalTimeline","core","globals","getCache","reverting","toAdd","suppressOverwrites","_getPluginPropTween","_buildModifierPlugin","temp","_addModifiers","modifiers","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","setProperty","_setterTransform","_setterScale","scaleX","scaleY","_setterScaleWithRender","renderTransform","_setterTransformWithRender","_saveStyle","isNotCSS","_transformProps","tfm","_propertyAliases","transform","_get","_transformProp","svg","svgo","_transformOriginProp","_removeIndependentTransforms","translate","removeProperty","_revertStyle","_capsExp","_getStyleSaver","properties","saver","save","_createElement","ns","createElementNS","_getComputedProperty","skipPrefixFallback","cs","getComputedStyle","getPropertyValue","_checkPropPrefix","_initCore","_docElement","documentElement","_tempDiv","cssText","_supports3D","_pluginInitted","_getBBoxHack","swapIfPossible","bbox","ownerSVGElement","oldParent","parentNode","oldSibling","nextSibling","oldCSS","appendChild","display","getBBox","_gsapBBox","insertBefore","removeChild","_getAttributeFallbacks","attributesArray","hasAttribute","_getBBox","bounds","error","width","height","_isSVG","getCTM","_removeProperty","removeAttribute","_addNonTweeningPT","beginning","onlySetAtEnd","_convertToUnit","px","isSVG","curValue","curUnit","horizontal","_horizontalExp","isRootSVG","tagName","measureProperty","toPixels","toPercent","_nonConvertibleUnits","body","_nonStandardLayouts","_tweenComplexCSSString","startValues","startValue","endValue","endUnit","startUnit","_convertKeywordsToPercentages","_keywordToPercent","_renderClearProps","clearTransforms","_parseTransform","_isNullTransform","_getComputedTransformMatrixAsArray","matrixString","_identity2DMatrix","_getMatrix","force2D","addedToDOM","matrix","baseVal","consolidate","offsetParent","nextElementSibling","_applySVGOrigin","origin","originIsAbsolute","smooth","matrixArray","pluginToAddPropTweensTo","determinant","xOriginOld","xOrigin","yOriginOld","yOrigin","xOffsetOld","xOffset","yOffsetOld","yOffset","tx","ty","originSplit","_addPxTranslate","_addRotationalPropTween","direction","cap","_RAD2DEG","finalValue","_assign","source","_addRawTransformPTs","transforms","endCache","startCache","_recentSetterPlugin","Power0","Power1","Power2","Power3","Power4","Quad","Cubic","Quart","Quint","Strong","Elastic","Back","Bounce","Sine","Expo","Circ","_DEG2RAD","_atan2","atan2","_complexExp","autoAlpha","scale","alpha","_prefixes","element","preferPrefix","deg","rad","turn","flex","_firstTwoOnly","zOrigin","_specialProps","top","bottom","right","clearProps","_rotationalProperties","z","rotation","rotationX","rotationY","skewX","skewY","perspective","angle","a12","a22","t1","t2","t3","a13","a23","a33","a42","a43","a32","invertedScaleX","rotate","forceCSS","xPercent","offsetWidth","yPercent","offsetHeight","transformPerspective","_renderSVGTransforms","_renderCSSTransforms","_renderNon3DTransforms","_zeroDeg","_zeroPx","_endParenthesis","use3D","a11","a21","tan","side","positionAndScale","all","CSSPlugin","specialProp","relative","isTransformRelated","transformPropTween","inlineProps","styles","visibility","parseTransform","smoothOrigin","autoRound","checkPrefix","getStyleSaver","gsapWithCSS","TweenMaxWithCSS"],"mappings":";;;;;;;;;ycAgCa,SAAZA,EAAYC,SAA2B,iBAAXA,EACd,SAAdC,EAAcD,SAA2B,mBAAXA,EAClB,SAAZE,EAAYF,SAA2B,iBAAXA,EACb,SAAfG,EAAeH,eAA2B,IAAXA,EACnB,SAAZI,EAAYJ,SAA2B,iBAAXA,EACd,SAAdK,EAAcL,UAAmB,IAAVA,EACP,SAAhBM,UAAyC,oBAAZC,OACX,SAAlBC,EAAkBR,UAASC,EAAYD,IAAUD,EAAUC,GAchD,SAAXS,EAAWC,UAAUC,EAAgBC,GAAOF,EAAOG,MAAcC,GAChD,SAAjBC,EAAkBC,EAAUhB,UAAUiB,QAAQC,KAAK,mBAAoBF,EAAU,SAAUhB,EAAO,yCAC1F,SAARmB,EAASC,EAASC,UAAcA,GAAYJ,QAAQC,KAAKE,GAC5C,SAAbE,EAAcC,EAAMC,UAASD,IAASV,GAASU,GAAQC,IAASb,IAAkBA,EAAcY,GAAQC,IAAUX,GACrG,SAAbY,WAAmB,EAaR,SAAXC,GAAWC,OAETC,EAAeC,EADZC,EAASH,EAAQ,MAErBvB,EAAU0B,IAAW7B,EAAY6B,KAAYH,EAAU,CAACA,MAClDC,GAAiBE,EAAOC,OAAS,IAAIC,SAAU,KACpDH,EAAII,GAAgBC,OACbL,MAAQI,GAAgBJ,GAAGM,WAAWL,KAC7CF,EAAgBK,GAAgBJ,OAEjCA,EAAIF,EAAQO,OACLL,KACLF,EAAQE,KAAOF,EAAQE,GAAGE,QAAUJ,EAAQE,GAAGE,MAAQ,IAAIK,GAAQT,EAAQE,GAAID,MAAqBD,EAAQU,OAAOR,EAAG,UAEjHF,EAEI,SAAZW,GAAYR,UAAUA,EAAOC,OAASL,GAASa,GAAQT,IAAS,GAAGC,MACpD,SAAfS,GAAgBV,EAAQd,EAAUyB,UAAOA,EAAIX,EAAOd,KAAcf,EAAYwC,GAAKX,EAAOd,KAAeb,EAAasC,IAAMX,EAAOY,cAAgBZ,EAAOY,aAAa1B,IAAcyB,EACtK,SAAfE,GAAgBC,EAAOC,UAAWD,EAAQA,EAAME,MAAM,MAAMC,QAAQF,IAAUD,EACrE,SAATI,GAAShD,UAASiD,KAAKC,MAAc,IAARlD,GAAkB,KAAU,EACzC,SAAhBmD,GAAgBnD,UAASiD,KAAKC,MAAc,IAARlD,GAAoB,KAAY,EACnD,SAAjBoD,GAAkBC,EAAOrD,OACpBsD,EAAWtD,EAAMuD,OAAO,GAC3BC,EAAMC,WAAWzD,EAAM0D,OAAO,WAC/BL,EAAQI,WAAWJ,GACC,MAAbC,EAAmBD,EAAQG,EAAmB,MAAbF,EAAmBD,EAAQG,EAAmB,MAAbF,EAAmBD,EAAQG,EAAMH,EAAQG,EAE/F,SAApBG,GAAqBC,EAAUC,WAC1BC,EAAID,EAAO3B,OACdL,EAAI,EACE+B,EAASG,QAAQF,EAAOhC,IAAM,KAAOA,EAAIiC,WACxCjC,EAAIiC,EAEC,SAAdE,SAGEnC,EAAGoC,EAFAH,EAAII,GAAYhC,OACnBiC,EAAID,GAAYE,MAAM,OAEvBC,GAAc,GAETxC,EADLqC,GAAYhC,OAAS,EACTL,EAAIiC,EAAGjC,KAClBoC,EAAQE,EAAEtC,KACDoC,EAAMK,QAAUL,EAAMM,OAAON,EAAMK,MAAM,GAAIL,EAAMK,MAAM,IAAI,GAAMA,MAAQ,GAGpE,SAAlBE,GAAmBC,EAAWC,EAAMC,EAAgBC,GACnDV,GAAYhC,SAAW2C,GAAcb,KACrCS,EAAUF,OAAOG,EAAMC,EAAgBC,GAAUC,GAAcH,EAAO,IAAMD,EAAUK,UAAYL,EAAUM,WAC5Gb,GAAYhC,SAAW2C,GAAcb,KAEjB,SAArBgB,GAAqBhF,OAChBiF,EAAIxB,WAAWzD,UACXiF,GAAW,IAANA,KAAajF,EAAQ,IAAIkF,MAAMC,IAAoBjD,OAAS,EAAI+C,EAAIlF,EAAUC,GAASA,EAAMoF,OAASpF,EAErG,SAAfqF,GAAeC,UAAKA,EACL,SAAfC,GAAgB/D,EAAKgE,OACf,IAAIF,KAAKE,EACZF,KAAK9D,IAASA,EAAI8D,GAAKE,EAASF,WAE3B9D,EAaK,SAAbiE,GAAcC,EAAMC,OACd,IAAIL,KAAKK,EACP,cAANL,GAA2B,gBAANA,GAA6B,cAANA,IAAsBI,EAAKJ,GAAKlF,EAAUuF,EAAQL,IAAMG,GAAWC,EAAKJ,KAAOI,EAAKJ,GAAK,IAAKK,EAAQL,IAAMK,EAAQL,WAE1JI,EAES,SAAjBE,GAAkBpE,EAAKqE,OAErBP,EADGQ,EAAO,OAENR,KAAK9D,EACR8D,KAAKO,IAAeC,EAAKR,GAAK9D,EAAI8D,WAE7BQ,EAEW,SAAnBC,GAAmBC,OACdC,EAASD,EAAKC,QAAUC,EAC3BrD,EAAOmD,EAAKG,UA3BS,SAAvBC,qBAAuBC,UAAmB,SAAC7E,EAAKgE,OAC1C,IAAIF,KAAKE,EACZF,KAAK9D,GAAe,aAAN8D,GAAoBe,GAA0B,SAANf,IAAiB9D,EAAI8D,GAAKE,EAASF,KAyBlEc,CAAqBE,EAASN,EAAKG,YAAcZ,MACtElF,EAAY2F,EAAKO,cACbN,GACNpD,EAAKmD,EAAMC,EAAOD,KAAKR,UACvBS,EAASA,EAAOA,QAAUA,EAAOO,WAG5BR,EAQa,SAArBS,GAAsBR,EAAQS,EAAOC,EAAsBC,EAAoBC,YAA1CF,IAAAA,EAAY,mBAAUC,IAAAA,EAAW,aAEpEE,EADGC,EAAOd,EAAOW,MAEdC,MACHC,EAAIJ,EAAMG,GACHE,GAAQA,EAAKF,GAAUC,GAC7BC,EAAOA,EAAKC,aAGVD,GACHL,EAAMO,MAAQF,EAAKE,MACnBF,EAAKE,MAAQP,IAEbA,EAAMO,MAAQhB,EAAOU,GACrBV,EAAOU,GAAaD,GAEjBA,EAAMO,MACTP,EAAMO,MAAMD,MAAQN,EAEpBT,EAAOW,GAAYF,EAEpBA,EAAMM,MAAQD,EACdL,EAAMT,OAASS,EAAMF,IAAMP,EACpBS,EAEgB,SAAxBQ,GAAyBjB,EAAQS,EAAOC,EAAsBC,YAAtBD,IAAAA,EAAY,mBAAUC,IAAAA,EAAW,aACpEG,EAAOL,EAAMM,MAChBG,EAAOT,EAAMO,MACVF,EACHA,EAAKE,MAAQE,EACHlB,EAAOU,KAAeD,IAChCT,EAAOU,GAAaQ,GAEjBA,EACHA,EAAKH,MAAQD,EACHd,EAAOW,KAAcF,IAC/BT,EAAOW,GAAYG,GAEpBL,EAAMO,MAAQP,EAAMM,MAAQN,EAAMT,OAAS,KAExB,SAApBmB,GAAqBV,EAAOW,GAC3BX,EAAMT,UAAYoB,GAA6BX,EAAMT,OAAOqB,qBAAuBZ,EAAMT,OAAOsB,QAAUb,EAAMT,OAAOsB,OAAOb,GAC9HA,EAAMc,KAAO,EAEH,SAAXC,GAAYhD,EAAWiC,MAClBjC,KAAeiC,GAASA,EAAMgB,KAAOjD,EAAUkD,MAAQjB,EAAMkB,OAAS,WACrEzD,EAAIM,EACDN,GACNA,EAAE0D,OAAS,EACX1D,EAAIA,EAAE8B,cAGDxB,EAWS,SAAjBqD,GAAkB7D,EAAO8D,EAAWpD,EAAgBC,UAAUX,EAAMc,WAAaF,EAAaZ,EAAMc,SAASiD,OAAOC,IAAwBhE,EAAM+B,KAAKkC,kBAAoBjE,EAAM+B,KAAKmC,YAAelE,EAAMc,SAASR,OAAOwD,GAAW,EAAMnD,IAEpN,SAAxBwD,GAAwB3D,UAAaA,EAAU4D,QAAUC,GAAgB7D,EAAU8D,OAAS9D,EAAYA,EAAU+D,WAAa/D,EAAUgE,SAAYhE,EAAY,EAMvI,SAA1BiE,GAA2BC,EAAYjC,UAAWiC,EAAajC,EAAMkB,QAAUlB,EAAMkC,KAAoB,GAAblC,EAAMkC,IAAW,EAAKlC,EAAMmB,OAASnB,EAAMmC,gBAAkBnC,EAAMoC,OACrJ,SAAVC,GAAUtE,UAAcA,EAAUiD,KAAOvE,GAAcsB,EAAUmD,QAAWnD,EAAUqE,MAAQ7F,KAAK+F,IAAIvE,EAAUmE,KAAOnE,EAAUwE,MAAQC,IAAc,IACvI,SAAjBC,GAAkB1E,EAAWsD,OACxB9B,EAASxB,EAAU+B,WACnBP,GAAUA,EAAOmD,mBAAqB3E,EAAUmE,MACnDnE,EAAUmD,OAASzE,GAAc8C,EAAOoD,OAAyB,EAAhB5E,EAAUmE,IAAUb,EAAYtD,EAAUmE,MAAQnE,EAAUoD,OAASpD,EAAUoE,gBAAkBpE,EAAUqE,OAASf,IAActD,EAAUmE,MAC7LG,GAAQtE,GACRwB,EAAO4B,QAAUJ,GAASxB,EAAQxB,IAE5BA,EAYS,SAAjB6E,GAAkBC,EAAU7C,OACvBI,MACAJ,EAAM2C,OAAU3C,EAAM5B,WAAa4B,EAAMiB,QAC5Cb,EAAI4B,GAAwBa,EAASC,UAAW9C,KAC3CA,EAAMiB,MAAQ8B,GAAO,EAAG/C,EAAMmC,gBAAiB/B,GAAKJ,EAAM6B,OAASW,IACvExC,EAAMnC,OAAOuC,GAAG,IAIdW,GAAS8B,EAAU7C,GAAOF,KAAO+C,EAASzE,UAAYyE,EAASF,OAASE,EAAS5B,MAAQ4B,EAASX,IAAK,IAEtGW,EAAS5B,KAAO4B,EAASf,eAC5B1B,EAAIyC,EACGzC,EAAEN,KACQ,GAAfM,EAAE0C,WAAmB1C,EAAEiB,UAAUjB,EAAEyB,QACpCzB,EAAIA,EAAEN,IAGR+C,EAASG,QAAUR,GAGJ,SAAjBS,GAAkBJ,EAAU7C,EAAOkD,EAAUC,UAC5CnD,EAAMT,QAAUmB,GAAkBV,GAClCA,EAAMkB,OAASzE,IAAejD,EAAU0J,GAAYA,EAAWA,GAAYL,IAAarD,EAAkB4D,GAAeP,EAAUK,EAAUlD,GAAS6C,EAASF,OAAS3C,EAAMqD,QAC9KrD,EAAMgB,KAAOvE,GAAcuD,EAAMkB,QAAWlB,EAAMmC,gBAAkB5F,KAAK+F,IAAItC,EAAMsD,cAAiB,IACpGvD,GAAmB8C,EAAU7C,EAAO,SAAU,QAAS6C,EAASU,MAAQ,SAAW,GACnFC,GAAmBxD,KAAW6C,EAASY,QAAUzD,GACjDmD,GAAcP,GAAeC,EAAU7C,GACvC6C,EAASX,IAAM,GAAKO,GAAeI,EAAUA,EAAShB,QAC/CgB,EAES,SAAjBa,GAAkB3F,EAAW4F,UAAaxJ,GAASyJ,eAAiBvJ,EAAe,gBAAiBsJ,KAAaxJ,GAASyJ,cAAcC,OAAOF,EAAS5F,GACpI,SAApB+F,GAAqBvG,EAAOS,EAAME,EAAOD,EAAgB8F,UACxDC,GAAWzG,EAAOS,EAAM+F,GACnBxG,EAAMa,UAGNF,GAASX,EAAM0G,MAAQ9F,IAAgBZ,EAAM0D,OAA4B,IAApB1D,EAAM+B,KAAK4E,OAAqB3G,EAAM0D,MAAQ1D,EAAM+B,KAAK4E,OAAUC,IAAuBC,GAAQC,OAC3J7G,GAAY8G,KAAK/G,GACjBA,EAAMK,MAAQ,CAACmG,EAAO9F,GACf,UALA,EA2EM,SAAfsG,GAAgBxG,EAAW+D,EAAU0C,EAAaC,OAC7CC,EAAS3G,EAAU4D,QACtBgD,EAAMlI,GAAcqF,IAAa,EACjC8C,EAAgB7G,EAAU8D,OAAS9D,EAAUqE,aAC9CwC,IAAkBH,IAAkB1G,EAAU4E,OAASgC,EAAM5G,EAAUkD,MACvElD,EAAUkD,KAAO0D,EACjB5G,EAAUqE,MAASsC,EAAeA,EAAS,EAAI,KAAOjI,GAAckI,GAAOD,EAAS,GAAM3G,EAAUgE,QAAU2C,GAAlFC,EACZ,EAAhBC,IAAsBH,GAAiBhC,GAAe1E,EAAYA,EAAU8D,OAAS9D,EAAUqE,MAAQwC,GACvG7G,EAAUwB,QAAU8C,GAAQtE,GAC5ByG,GAAezD,GAAShD,EAAUwB,OAAQxB,GACnCA,EAEiB,SAAzB8G,GAAyB9G,UAAcA,aAAqB+G,GAAY/D,GAAShD,GAAawG,GAAaxG,EAAWA,EAAUkD,MA2B7G,SAAnB8D,GAAoBC,EAAMC,EAAQpC,OAIhCqC,EAAQ3F,EAHL4F,EAAW3L,EAAUyL,EAAO,IAC/BG,GAAaD,EAAW,EAAI,IAAMH,EAAO,EAAI,EAAI,GACjD1F,EAAO2F,EAAOG,MAEfD,IAAa7F,EAAKwC,SAAWmD,EAAO,IACpC3F,EAAKC,OAASsD,EACVmC,EAAM,KACTE,EAAS5F,EACTC,EAASsD,EACFtD,KAAY,oBAAqB2F,IACvCA,EAAS3F,EAAOD,KAAKR,UAAY,GACjCS,EAAS5F,EAAY4F,EAAOD,KAAKO,UAAYN,EAAOA,OAErDD,EAAKkC,gBAAkB7H,EAAYuL,EAAO1D,iBAC1CwD,EAAO,EAAK1F,EAAK+F,aAAe,EAAM/F,EAAKgG,QAAUL,EAAOG,EAAY,UAElE,IAAIG,GAAMN,EAAO,GAAI3F,EAAM2F,EAAmB,EAAZG,IAErB,SAArBI,GAAsBlM,EAAO6C,UAAS7C,GAAmB,IAAVA,EAAc6C,EAAK7C,GAAS6C,EAEjE,SAAVsJ,GAAWnM,EAAOyC,UAAO1C,EAAUC,KAAYyC,EAAI2J,GAASC,KAAKrM,IAAeyC,EAAE,GAAP,GAG5D,SAAf6J,GAAgBtM,EAAOuM,UAAavM,GAAUI,EAAUJ,IAAU,WAAYA,KAAYuM,IAAavM,EAAMkC,QAAalC,EAAMkC,OAAS,KAAMlC,GAASI,EAAUJ,EAAM,OAAUA,EAAMwM,UAAYxM,IAAUyM,EAInM,SAAXC,GAAW1M,UACVA,EAAQuC,GAAQvC,GAAO,IAAMmB,EAAM,kBAAoB,GAChD,SAAAsB,OACFkK,EAAK3M,EAAM4M,SAAW5M,EAAM6M,eAAiB7M,SAC1CuC,GAAQE,EAAGkK,EAAGG,iBAAmBH,EAAKA,IAAO3M,EAAQmB,EAAM,kBAAoB4L,EAAKC,cAAc,OAAShN,IAG1G,SAAViN,GAAU9I,UAAKA,EAAE+I,KAAK,iBAAM,GAAKjK,KAAKkK,WAEzB,SAAbC,GAAa3K,MACRxC,EAAYwC,UACRA,MAEJuD,EAAO5F,EAAUqC,GAAKA,EAAI,CAAC4K,KAAK5K,GACnC6K,EAAOC,GAAWvH,EAAKsH,MACvBE,EAAOxH,EAAKwH,MAAQ,EACpB9H,EAAOjC,WAAWuC,EAAKN,OAAS,EAChC+H,EAAQ,GACRC,EAAoB,EAAPF,GAAYA,EAAO,EAChCG,EAASC,MAAMJ,IAASE,EACxBG,EAAO7H,EAAK6H,KACZC,EAASN,EACTO,EAASP,SACNzN,EAAUyN,GACbM,EAASC,EAAS,CAACC,OAAO,GAAIC,MAAM,GAAIzK,IAAI,GAAGgK,IAAS,GAC7CE,GAAaC,IACxBG,EAASN,EAAK,GACdO,EAASP,EAAK,IAER,SAAC3L,EAAGC,EAAQqC,OAGjB+J,EAASC,EAASC,EAAGC,EAAGC,EAAGC,EAAGC,EAAKC,EAAKC,EAFrC5K,GAAKK,GAAK6B,GAAM9D,OACnByM,EAAYlB,EAAM3J,OAEd6K,EAAW,MACfD,EAAwB,SAAd1I,EAAK4I,KAAmB,GAAK5I,EAAK4I,MAAQ,CAAC,EAAGC,IAAU,IACrD,KACZL,GAAOK,EACAL,GAAOA,EAAMrK,EAAEuK,KAAUI,wBAAwBC,OAASL,EAAS5K,IAC1E4K,QAEDC,EAAYlB,EAAM3J,GAAK,GACvBoK,EAAUP,EAAU1K,KAAKwL,IAAIC,EAAQ5K,GAAKgK,EAAU,GAAKN,EAAOkB,EAChEP,EAAUO,IAAWG,EAAU,EAAIlB,EAAS7J,EAAIiK,EAASW,EAAS,GAAMlB,EAAOkB,EAAU,EAEzFD,EAAMI,EACDN,EAFLC,EAAM,EAEMD,EAAIzK,EAAGyK,IAClBH,EAAKG,EAAIG,EAAUR,EACnBG,EAAIF,GAAYI,EAAIG,EAAU,GAC9BC,EAAUJ,GAAKD,EAAKT,EAA8B5K,KAAK+F,IAAc,MAAT6E,EAAgBQ,EAAID,GAArDY,EAAMZ,EAAIA,EAAIC,EAAIA,GACxCG,EAAJF,IAAaE,EAAMF,GACnBA,EAAIG,IAASA,EAAMH,GAEX,WAATd,GAAsBP,GAAQ0B,GAC/BA,EAAUH,IAAMA,EAAMC,EACtBE,EAAUF,IAAMA,EAChBE,EAAUlM,EAAIqB,GAAKL,WAAWuC,EAAKiJ,SAAYxL,WAAWuC,EAAKqH,OAAkBvJ,EAAT4K,EAAa5K,EAAI,EAAK+J,EAA+C,MAATA,EAAe/J,EAAI4K,EAASA,EAA3DzL,KAAKuL,IAAIE,EAAQ5K,EAAI4K,KAAkD,IAAe,UAATlB,GAAoB,EAAI,GAC1MmB,EAAUO,EAAKpL,EAAI,EAAK4B,EAAO5B,EAAI4B,EACnCiJ,EAAUQ,EAAIhD,GAAQnG,EAAKiJ,QAAUjJ,EAAKqH,OAAS,EACnDC,EAAQA,GAAQxJ,EAAI,EAAKsL,GAAY9B,GAAQA,SAE9CxJ,GAAM6K,EAAU9M,GAAK8M,EAAUF,KAAOE,EAAUH,KAAQ,EACjDrL,GAAcwL,EAAUO,GAAK5B,EAAOA,EAAKxJ,GAAKA,GAAK6K,EAAUlM,GAAKkM,EAAUQ,GAGpE,SAAjBE,GAAiB5M,OACZ6C,EAAIrC,KAAKqM,IAAI,KAAM7M,EAAI,IAAIK,MAAM,KAAK,IAAM,IAAIZ,eAC7C,SAAAqN,OACFtK,EAAI9B,GAAcF,KAAKC,MAAMO,WAAW8L,GAAO9M,GAAKA,EAAI6C,UACpDL,EAAIA,EAAI,GAAKK,GAAKpF,EAAUqP,GAAO,EAAIpD,GAAQoD,KAGlD,SAAPC,GAAQC,EAAQzP,OAEd0P,EAAQC,EADLC,EAAUtJ,EAASmJ,UAElBG,GAAWxP,EAAUqP,KACzBC,EAASE,EAAUH,EAAOC,QAAUb,EAChCY,EAAOI,QACVJ,EAASlN,GAAQkN,EAAOI,SACnBF,GAAQzP,EAAUuP,EAAO,OAC7BC,GAAUA,IAGXD,EAASJ,GAAeI,EAAOK,YAG1B5D,GAAmBlM,EAAQ4P,EAAmC3P,EAAYwP,GAAU,SAAAF,UAAQI,EAAOF,EAAOF,GAAatM,KAAK+F,IAAI2G,EAAOJ,IAAQG,EAASC,EAAOJ,GAAS,SAAAA,WAM7KQ,EAAIC,EALD5B,EAAI3K,WAAWkM,EAAOJ,EAAInB,EAAImB,GACjClB,EAAI5K,WAAWkM,EAAOJ,EAAIlB,EAAI,GAC9BI,EAAMI,EACNoB,EAAU,EACVpO,EAAI4N,EAAOvN,OAELL,MAILkO,EAHGJ,GACHI,EAAKN,EAAO5N,GAAGuM,EAAIA,GAET2B,GADVC,EAAKP,EAAO5N,GAAGwM,EAAIA,GACC2B,EAEf/M,KAAK+F,IAAIyG,EAAO5N,GAAKuM,IAElBK,IACRA,EAAMsB,EACNE,EAAUpO,UAGZoO,GAAYP,GAAUjB,GAAOiB,EAAUD,EAAOQ,GAAWV,EACjDI,GAAQM,IAAYV,GAAOrP,EAAUqP,GAAQU,EAAUA,EAAU9D,GAAQoD,IArBtCF,GAAeI,IAwBnD,SAATtC,GAAUsB,EAAKD,EAAK0B,EAAmBC,UAAmBjE,GAAmB5F,EAASmI,IAAQD,GAA4B,IAAtB0B,KAAgCA,EAAoB,IAAMC,EAAgB,kBAAM7J,EAASmI,GAAOA,KAAOxL,KAAKkK,SAAWsB,EAAIvM,UAAYgO,EAAoBA,GAAqB,QAAUC,EAAiBD,EAAoB,WAAI,IAAQA,EAAoB,IAAIhO,OAAS,GAAK,IAAOe,KAAKmN,MAAMnN,KAAKC,OAAOuL,EAAMyB,EAAoB,EAAIjN,KAAKkK,UAAYqB,EAAMC,EAA0B,IAApByB,IAA4BA,GAAqBA,EAAoBC,GAAkBA,IAIxhB,SAAbE,GAAclM,EAAGmM,EAAStQ,UAAUkM,GAAmBlM,EAAO,SAAAuQ,UAASpM,IAAImM,EAAQC,MAalE,SAAjBC,GAAiBxQ,WAGf6B,EAAG4O,EAAMjN,EAAKoM,EAFX7I,EAAO,EACV2J,EAAI,KAEI7O,EAAI7B,EAAM+D,QAAQ,UAAWgD,KACrCvD,EAAMxD,EAAM+D,QAAQ,IAAKlC,GACzB+N,EAAkC,MAAxB5P,EAAMuD,OAAO1B,EAAI,GAC3B4O,EAAOzQ,EAAM0D,OAAO7B,EAAI,EAAG2B,EAAM3B,EAAI,GAAGqD,MAAM0K,EAAUzK,GAAqBwL,IAC7ED,GAAK1Q,EAAM0D,OAAOqD,EAAMlF,EAAIkF,GAAQoG,GAAOyC,EAAUa,GAAQA,EAAK,GAAIb,EAAU,GAAKa,EAAK,IAAKA,EAAK,IAAM,MAC1G1J,EAAOvD,EAAM,SAEPkN,EAAI1Q,EAAM0D,OAAOqD,EAAM/G,EAAMkC,OAAS6E,GA4CvB,SAAvB6J,GAAwBrH,EAAUsH,EAAUC,OAG1CxL,EAAGyL,EAAUC,EAFVC,EAAS1H,EAAS0H,OACrBxC,EAAMI,MAEFvJ,KAAK2L,GACTF,EAAWE,EAAO3L,GAAKuL,GACP,KAASC,GAAYC,GAAYtC,GAAOsC,EAAW9N,KAAK+F,IAAI+H,MAC3EC,EAAQ1L,EACRmJ,EAAMsC,UAGDC,EAmBK,SAAbE,GAAazM,UACZ2C,GAAkB3C,GAClBA,EAAU0M,eAAiB1M,EAAU0M,cAAcC,OAAOvM,GAC1DJ,EAAU4M,WAAa,GAAKC,GAAU7M,EAAW,eAC1CA,EAIQ,SAAhB8M,GAAgBC,MACXlR,KAAmBkR,EAAQ,KAE1BjQ,GADJiQ,GAAUA,EAAOjQ,MAAQiQ,WAAkBA,GACzBjQ,KACjBkQ,EAASxR,EAAYuR,GACrBE,EAAUnQ,IAASkQ,GAAUD,EAAOG,KAAQ,gBACtCC,OAAS,IACXJ,EACJK,EAAmB,CAACF,KAAMlQ,EAAY8C,OAAQuN,GAAmBC,IAAKC,GAAeZ,KAAMa,GAAmBC,SAAUC,GAAoBC,QAAS,GACrJC,EAAU,CAAClQ,WAAY,EAAGmQ,IAAK,EAAGC,UAAWC,GAAYC,QAAS,GAAIC,SAAU,MACjFC,KACInB,IAAWE,EAAQ,IAClBkB,GAASrR,UAGbgE,GAAamM,EAAQnM,GAAaK,GAAe4L,EAAQK,GAAmBQ,IAC5EzR,GAAO8Q,EAAOmB,UAAWjS,GAAOiR,EAAkBjM,GAAe4L,EAAQa,KACzEO,GAAUlB,EAAOoB,KAAOvR,GAASmQ,EAC7BF,EAAOrP,aACVF,GAAgB+I,KAAK0G,GACrBqB,GAAexR,GAAQ,GAExBA,GAAiB,QAATA,EAAiB,MAAQA,EAAKgC,OAAO,GAAGyP,cAAgBzR,EAAKmC,OAAO,IAAM,SAEnFpC,EAAWC,EAAMmQ,GACjBF,EAAOkB,UAAYlB,EAAOkB,SAAS5R,GAAM4Q,EAAQuB,SAEjDzB,GAAU0B,GAAqBlI,KAAKwG,GAkD/B,SAAP2B,GAAQC,EAAGC,EAAIC,UAEC,GADfF,GAAKA,EAAI,EAAI,EAAQ,EAAJA,GAAS,EAAI,GACX,EAAKC,GAAMC,EAAKD,GAAMD,EAAI,EAAIA,EAAI,GAAKE,EAAU,EAAJF,EAAQ,EAAKC,GAAMC,EAAKD,IAAO,EAAI,EAAID,GAAK,EAAIC,GAAME,GAAQ,GAAM,EAExH,SAAbC,GAAc/Q,EAAGgR,EAAOC,OAEtBC,EAAGC,EAAG1E,EAAGkE,EAAG1C,EAAG5M,EAAG0K,EAAKC,EAAKH,EAAGuF,EAD5B1P,EAAK1B,EAAyBvC,EAAUuC,GAAK,CAACA,GAAK,GAAKA,GAAK,EAAK8Q,GAAM9Q,EAAI8Q,IAAQ,EAA3EO,GAAaC,UAErB5P,EAAG,IACc,MAAjB1B,EAAEiB,QAAQ,KACbjB,EAAIA,EAAEiB,OAAO,EAAGjB,EAAEP,OAAS,IAExB4R,GAAarR,GAChB0B,EAAI2P,GAAarR,QACX,GAAoB,MAAhBA,EAAEc,OAAO,GAAY,IAC3Bd,EAAEP,OAAS,IAIdO,EAAI,KAHJkR,EAAIlR,EAAEc,OAAO,IAGCoQ,GAFdC,EAAInR,EAAEc,OAAO,IAESqQ,GADtB1E,EAAIzM,EAAEc,OAAO,IACiB2L,GAAkB,IAAbzM,EAAEP,OAAeO,EAAEc,OAAO,GAAKd,EAAEc,OAAO,GAAK,KAEhE,IAAbd,EAAEP,aAEE,EADPiC,EAAI6P,SAASvR,EAAEiB,OAAO,EAAG,GAAI,MAChB,GAAKS,GAAK,EAAKoP,GAAMpP,EAAIoP,GAAMS,SAASvR,EAAEiB,OAAO,GAAI,IAAM,KAGzES,EAAI,EADJ1B,EAAIuR,SAASvR,EAAEiB,OAAO,GAAI,MAChB,GAAKjB,GAAK,EAAK8Q,GAAM9Q,EAAI8Q,SAC7B,GAAuB,QAAnB9Q,EAAEiB,OAAO,EAAG,MACtBS,EAAI0P,EAASpR,EAAEyC,MAAMyL,IAChB8C,GAUE,IAAKhR,EAAEsB,QAAQ,YACrBI,EAAI1B,EAAEyC,MAAM+O,IACZP,GAAcvP,EAAEjC,OAAS,IAAMiC,EAAE,GAAK,GAC/BA,OAZPiP,GAAMjP,EAAE,GAAK,IAAO,IACpBuM,EAAKvM,EAAE,GAAK,IAGZwP,EAAQ,GAFR7P,EAAKK,EAAE,GAAK,MACZyP,EAAK9P,GAAK,GAAMA,GAAK4M,EAAI,GAAK5M,EAAI4M,EAAI5M,EAAI4M,GAE/B,EAAXvM,EAAEjC,SAAeiC,EAAE,IAAM,GACzBA,EAAE,GAAKgP,GAAKC,EAAI,EAAI,EAAGO,EAAGC,GAC1BzP,EAAE,GAAKgP,GAAKC,EAAGO,EAAGC,GAClBzP,EAAE,GAAKgP,GAAKC,EAAI,EAAI,EAAGO,EAAGC,QAO3BzP,EAAI1B,EAAEyC,MAAMyL,KAAkBmD,GAAaI,YAE5C/P,EAAIA,EAAEgQ,IAAIC,eAEPX,IAAUI,IACbF,EAAIxP,EAAE,GAAKoP,GACXK,EAAIzP,EAAE,GAAKoP,GACXrE,EAAI/K,EAAE,GAAKoP,GAGXzP,IAFA0K,EAAMvL,KAAKuL,IAAImF,EAAGC,EAAG1E,KACrBT,EAAMxL,KAAKwL,IAAIkF,EAAGC,EAAG1E,KACH,EACdV,IAAQC,EACX2E,EAAI1C,EAAI,GAERpC,EAAIE,EAAMC,EACViC,EAAQ,GAAJ5M,EAAUwK,GAAK,EAAIE,EAAMC,GAAOH,GAAKE,EAAMC,GAC/C2E,EAAI5E,IAAQmF,GAAKC,EAAI1E,GAAKZ,GAAKsF,EAAI1E,EAAI,EAAI,GAAKV,IAAQoF,GAAK1E,EAAIyE,GAAKrF,EAAI,GAAKqF,EAAIC,GAAKtF,EAAI,EAC5F8E,GAAK,IAENjP,EAAE,MAAQiP,EAAI,IACdjP,EAAE,MAAY,IAAJuM,EAAU,IACpBvM,EAAE,MAAY,IAAJL,EAAU,KAErB4P,GAAcvP,EAAEjC,OAAS,IAAMiC,EAAE,GAAK,GAC/BA,EAEU,SAAlBkQ,GAAkB5R,OACboN,EAAS,GACZyE,EAAI,GACJzS,GAAK,SACNY,EAAEK,MAAMyR,IAAWxR,QAAQ,SAAAN,OACtB0B,EAAI1B,EAAEyC,MAAMsP,KAAoB,GACpC3E,EAAO7E,WAAP6E,EAAe1L,GACfmQ,EAAEtJ,KAAKnJ,GAAKsC,EAAEjC,OAAS,KAExB2N,EAAOyE,EAAIA,EACJzE,EAEQ,SAAhB4E,GAAiB/D,EAAG+C,EAAOiB,OAKzBJ,EAAGK,EAAOrG,EAAGxK,EAJV8Q,EAAS,GACZC,GAAUnE,EAAIkE,GAAQ1P,MAAMqP,IAC5B7I,EAAO+H,EAAQ,QAAU,QACzB5R,EAAI,MAEAgT,SACGnE,KAERmE,EAASA,EAAOV,IAAI,SAAAW,UAAUA,EAAQtB,GAAWsB,EAAOrB,EAAO,KAAO/H,GAAQ+H,EAAQqB,EAAM,GAAK,IAAMA,EAAM,GAAK,KAAOA,EAAM,GAAK,KAAOA,EAAM,GAAKA,EAAMC,KAAK,MAAQ,MACrKL,IACHpG,EAAI+F,GAAgB3D,IACpB4D,EAAII,EAAeJ,GACbS,KAAKH,KAAYtG,EAAEgG,EAAES,KAAKH,QAE/B9Q,GADA6Q,EAAQjE,EAAEsE,QAAQT,GAAW,KAAKzR,MAAM0R,KAC9BtS,OAAS,EACZL,EAAIiC,EAAGjC,IACb+S,GAAUD,EAAM9S,KAAOyS,EAAEvQ,QAAQlC,GAAKgT,EAAOI,SAAWvJ,EAAO,YAAc4C,EAAEpM,OAASoM,EAAIuG,EAAO3S,OAAS2S,EAASH,GAAgBO,aAInIN,MAEJ7Q,GADA6Q,EAAQjE,EAAE5N,MAAMyR,KACNrS,OAAS,EACZL,EAAIiC,EAAGjC,IACb+S,GAAUD,EAAM9S,GAAKgT,EAAOhT,UAGvB+S,EAASD,EAAM7Q,GAWF,SAArBoR,GAAqB/Q,OAEnBsP,EADG0B,EAAWhR,EAAE4Q,KAAK,QAEtBR,GAAUa,UAAY,EAClBb,GAAUc,KAAKF,UAClB1B,EAAQ6B,GAAQD,KAAKF,GACrBhR,EAAE,GAAKsQ,GAActQ,EAAE,GAAIsP,GAC3BtP,EAAE,GAAKsQ,GAActQ,EAAE,GAAIsP,EAAOY,GAAgBlQ,EAAE,MAC7C,EA2Je,SAAxBoR,GAAwBhU,OACnBuB,GAASvB,EAAO,IAAIuB,MAAM,KAC7BwK,EAAOkI,GAAS1S,EAAM,WACfwK,GAAuB,EAAfxK,EAAMZ,QAAcoL,EAAKkE,OAAUlE,EAAKkE,OAAOiE,MAAM,MAAOlU,EAAKwC,QAAQ,KAAO,CAzB1E,SAAvB2R,qBAAuB1V,WAMrBuQ,EAAOoF,EAAKC,EALTpU,EAAM,GACTsB,EAAQ9C,EAAM0D,OAAO,EAAG1D,EAAMkC,OAAO,GAAGY,MAAM,KAC9C+S,EAAM/S,EAAM,GACZjB,EAAI,EACJiC,EAAIhB,EAAMZ,OAEJL,EAAIiC,EAAGjC,IACb8T,EAAM7S,EAAMjB,GACZ0O,EAAQ1O,IAAMiC,EAAE,EAAI6R,EAAIG,YAAY,KAAOH,EAAIzT,OAC/C0T,EAAYD,EAAIjS,OAAO,EAAG6M,GAC1B/O,EAAIqU,GAAOjI,MAAMgI,GAAaA,EAAUZ,QAAQe,GAAY,IAAI3Q,QAAUwQ,EAC1EC,EAAMF,EAAIjS,OAAO6M,EAAM,GAAGnL,cAEpB5D,EAW0FkU,CAAqB5S,EAAM,KATvG,SAAtBkT,oBAAsBhW,OACjBiW,EAAOjW,EAAM+D,QAAQ,KAAO,EAC/BmS,EAAQlW,EAAM+D,QAAQ,KACtBoS,EAASnW,EAAM+D,QAAQ,IAAKkS,UACtBjW,EAAMoW,UAAUH,GAAOE,GAAUA,EAASD,EAAQlW,EAAM+D,QAAQ,IAAKmS,EAAQ,GAAKA,GAK0CF,CAAoBzU,GAAMuB,MAAM,KAAKqR,IAAInP,KAAwBwQ,GAASa,KAAOC,GAAejB,KAAK9T,GAASiU,GAASa,IAAI,GAAI9U,GAAQ+L,EAItP,SAArBiJ,GAAsBhN,EAAUiN,WACFlJ,EAAzB5G,EAAQ6C,EAASkN,OACd/P,GACFA,aAAiB8E,GACpB+K,GAAmB7P,EAAO8P,IAChB9P,EAAMV,KAAK0Q,UAAchQ,EAAMiQ,OAAUjQ,EAAM2B,SAAY3B,EAAMiQ,QAAUH,IACjF9P,EAAM6C,SACTgN,GAAmB7P,EAAM6C,SAAUiN,IAEnClJ,EAAO5G,EAAMkQ,MACblQ,EAAMkQ,MAAQlQ,EAAMmQ,OACpBnQ,EAAMmQ,OAASvJ,EACf5G,EAAMiQ,MAAQH,IAGhB9P,EAAQA,EAAMO,MAIF,SAAd6P,GAAelU,EAAOmU,EAAQC,EAAkCC,YAAlCD,IAAAA,EAAU,iBAAA1R,UAAK,EAAIyR,EAAO,EAAIzR,cAAI2R,IAAAA,EAAa,mBAAA3R,UAAKA,EAAI,GAAKyR,EAAW,EAAJzR,GAAS,EAAI,EAAIyR,EAAiB,GAAT,EAAIzR,IAAU,QAEvI4R,EADG5J,EAAO,CAACyJ,OAAAA,EAAQC,QAAAA,EAASC,UAAAA,UAE7BtU,GAAaC,EAAO,SAAArB,OAGd,IAAI+D,KAFTkQ,GAASjU,GAAQV,GAASU,GAAQ+L,EAClCkI,GAAU0B,EAAgB3V,EAAK4V,eAAkBH,EACnC1J,EACbkI,GAAS0B,GAAuB,WAAN5R,EAAiB,MAAc,YAANA,EAAkB,OAAS,WAAakQ,GAASjU,EAAO,IAAM+D,GAAKgI,EAAKhI,KAGtHgI,EAEY,SAApB8J,GAAoBJ,UAAY,SAAA1R,UAAKA,EAAI,IAAM,EAAI0R,EAAQ,EAAS,EAAJ1R,IAAW,EAAI,GAAK0R,EAAmB,GAAV1R,EAAI,KAAW,GAC3F,SAAjB+R,GAAkB3L,EAAM4L,EAAWC,GAIvB,SAAVP,GAAU1R,UAAW,IAANA,EAAU,EAAIkS,WAAM,GAAO,GAAKlS,GAAMmS,GAAMnS,EAAIoS,GAAMC,GAAM,MAHxEH,EAAmB,GAAbF,EAAkBA,EAAY,EACvCK,GAAMJ,IAAW7L,EAAO,GAAK,OAAS4L,EAAY,EAAIA,EAAY,GAClEI,EAAKC,EAAKC,GAAQ3U,KAAK4U,KAAK,EAAIL,IAAO,GAEvClK,EAAiB,QAAT5B,EAAkBsL,GAAoB,OAATtL,EAAiB,SAAApG,UAAK,EAAI0R,GAAQ,EAAI1R,IAAK8R,GAAkBJ,WACnGW,EAAKC,EAAOD,EACZrK,EAAKkE,OAAS,SAAC8F,EAAWC,UAAWF,GAAe3L,EAAM4L,EAAWC,IAC9DjK,EAEM,SAAdwK,GAAepM,EAAMqM,GACN,SAAVf,GAAU1R,UAAKA,IAAQA,EAAKA,IAAMyS,EAAY,GAAKzS,EAAIyS,GAAa,EAAK,WADzDA,IAAAA,EAAY,aAE/BzK,EAAgB,QAAT5B,EAAiBsL,GAAmB,OAATtL,EAAgB,SAAApG,UAAK,EAAI0R,GAAQ,EAAI1R,IAAK8R,GAAkBJ,WAC/F1J,EAAKkE,OAAS,SAAAuG,UAAaD,GAAYpM,EAAMqM,IACtCzK,EAtiCT,IAWC0K,EACAnT,EAAYoT,EA0BZ/R,EAAiBuG,EAAMyL,EAAcnL,EAErCpM,EACAwX,EAYAtN,EAilBAuN,EAwOAC,EAUEC,EAAKC,EAAMC,EAAMC,EAAOC,EAAQC,EAR7BC,EACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAqMDlU,EACGmU,EA7jCDC,EAAU,CACZC,UAAW,IACXC,QAAS,OACTC,eAAgB,EAChBC,MAAO,CAACC,WAAW,KAEpBC,EAAY,CACXnR,SAAU,GACVoR,WAAW,EACXC,MAAO,GAIRhL,EAAU,IACV3F,EAAW,EAAI2F,EACf+I,EAAiB,EAAV3U,KAAK6W,GACZC,EAAWnC,EAAO,EAClBoC,EAAQ,EACRhL,EAAQ/L,KAAKgX,KACbC,EAAOjX,KAAKkX,IACZ1C,EAAOxU,KAAKmX,IASZC,EAAwC,mBAAhBC,aAA8BA,YAAYC,QAAW,aAC7EjU,EAAWkU,MAAM5K,QACjBe,GAAgB,oBAChBsD,GAAU,mCACVO,GAAkB,8BAClBiG,GAAuB,mCACvBC,GAAU,gBACVvV,GAAqB,kBACrBiH,GAAW,wCAEXvL,GAAW,GAQX8Z,GAAuB,CAAChW,gBAAgB,EAAMiW,SAAS,EAAMxJ,MAAM,GACnEnJ,GAAsB,CAACtD,gBAAgB,EAAMyM,MAAM,GACnDyJ,GAAgB,CAAClW,gBAAgB,GACjCoO,GAAiB,GACjB7O,GAAc,GACdG,GAAc,GAEduO,GAAW,GACXkI,GAAW,GACXC,GAAe,GACf9Y,GAAkB,GAClB+Y,GAAiB,GAiEjBpa,GAAS,SAATA,OAAU8E,EAAMC,OACV,IAAIL,KAAKK,EACbD,EAAKJ,GAAKK,EAAQL,UAEZI,GAoGR4C,GAAkB,SAAlBA,gBAAmBmC,EAAOwQ,OACrBC,EAAQjY,KAAKmN,MAAM3F,GAASwQ,UACzBxQ,GAAUyQ,IAAUzQ,EAASyQ,EAAQ,EAAIA,GAmEjDhR,GAAqB,SAArBA,0BAAuBiR,IAAAA,WAAmB,gBAATA,GAAmC,YAATA,GA+E3DC,GAAgB,CAACxT,OAAO,EAAGyT,QAAQ5Z,EAAYoH,cAAcpH,GAC7DqI,GAAiB,SAAjBA,eAAkBrF,EAAWmF,EAAU0R,OAIrCzZ,EAAG0Z,EAAQC,EAHRvK,EAASxM,EAAUwM,OACtBwK,EAAShX,EAAU0F,SAAWiR,GAC9BM,EAAkBjX,EAAU+D,YAAcqG,EAAU4M,EAAOJ,SAAQ,GAAS5W,EAAUkD,YAEnF5H,EAAU6J,KAAcgE,MAAMhE,IAAcA,KAAYqH,IAC3DsK,EAAS3R,EAASrG,OAAO,GACzBiY,EAAoC,MAAxB5R,EAASlG,QAAQ,GAC7B7B,EAAI+H,EAAS7F,QAAQ,KACN,MAAXwX,GAA6B,MAAXA,GAChB,GAAL1Z,IAAW+H,EAAWA,EAASoL,QAAQ,IAAK,MACzB,MAAXuG,EAAiBE,EAAO7T,OAAS6T,EAAOJ,QAA0B,GAAlBI,EAAOpT,WAAkB5E,WAAWmG,EAASlG,OAAO,KAAO,IAAM8X,GAAa3Z,EAAI,EAAI4Z,EAASH,GAAkBzS,gBAAkB,IAAM,IAE9LhH,EAAI,GACN+H,KAAYqH,IAAYA,EAAOrH,GAAY8R,GACrCzK,EAAOrH,KAEf2R,EAAS9X,WAAWmG,EAASrG,OAAO1B,EAAE,GAAK+H,EAASlG,OAAO7B,EAAE,IACzD2Z,GAAaF,IAChBC,EAASA,EAAS,KAAOjV,EAASgV,GAAoBA,EAAiB,GAAKA,GAAkBzS,iBAEnF,EAAJhH,EAASiI,eAAerF,EAAWmF,EAASlG,OAAO,EAAG7B,EAAE,GAAIyZ,GAAoBC,EAASG,EAAkBH,IAEhG,MAAZ3R,EAAoB8R,GAAmB9R,GAsBhDH,GAAS,SAATA,OAAUgF,EAAKD,EAAKxO,UAAUA,EAAQyO,EAAMA,EAAcD,EAARxO,EAAcwO,EAAMxO,GAGtE2b,GAAS,GAAGvX,MAIZ7B,GAAU,SAAVA,QAAWvC,EAAOU,EAAOkb,UAAiB3D,IAAavX,GAASuX,EAASvL,SAAWuL,EAASvL,SAAS1M,IAASD,EAAUC,IAAW4b,IAAiB1D,GAAiBvF,KAAqErM,EAAStG,GAFzO,SAAX6b,SAAYC,EAAIF,EAAcG,mBAAAA,IAAAA,EAAc,IAAOD,EAAG/Y,QAAQ,SAAA/C,UAAUD,EAAUC,KAAW4b,GAAiBtP,GAAatM,EAAO,GAAK+b,EAAY/Q,WAAZ+Q,EAAoBxZ,GAAQvC,IAAU+b,EAAY/Q,KAAKhL,MAAW+b,EAEoDF,CAAS7b,EAAO4b,GAAgBtP,GAAatM,GAAS2b,GAAOK,KAAKhc,EAAO,GAAKA,EAAQ,CAACA,GAAS,GAA5K2b,GAAOK,MAAMtb,GAASqM,GAAMD,iBAAiB9M,GAAQ,IA4ItOic,GAAW,SAAXA,SAAYC,EAAOC,EAAOC,EAAQC,EAAQrc,OACrCsc,EAAUH,EAAQD,EACrBK,EAAWF,EAASD,SACdlQ,GAAmBlM,EAAO,SAAAA,UAASoc,IAAapc,EAAQkc,GAASI,EAAWC,GAAa,MAoDjGjL,GAAY,SAAZA,UAAa7M,EAAWiH,EAAM8Q,OAK5B7Q,EAAQjL,EAAOkU,EAJZnS,EAAIgC,EAAUuB,KACjByW,EAAWha,EAAEiJ,GACbgR,EAAczE,EACd0E,EAAUlY,EAAUmY,QAEhBH,SAGL9Q,EAASlJ,EAAEiJ,EAAO,UAClBhL,EAAQ+B,EAAEoa,eAAiBpY,EAC3B+X,GAAoBtY,GAAYhC,QAAU8B,KAC1C2Y,IAAY1E,EAAW0E,GACvB/H,EAASjJ,EAAS8Q,EAAShH,MAAM/U,EAAOiL,GAAU8Q,EAAST,KAAKtb,GAChEuX,EAAWyE,EACJ9H,GASR1B,GAAuB,GAqDvBK,GAAO,IACPO,GAAe,CACdgJ,KAAK,CAAC,EAAEvJ,GAAKA,IACbwJ,KAAK,CAAC,EAAExJ,GAAK,GACbyJ,OAAO,CAAC,IAAI,IAAI,KAChBjJ,MAAM,CAAC,EAAE,EAAE,GACXkJ,OAAO,CAAC,IAAI,EAAE,GACdC,KAAK,CAAC,EAAE,IAAI,KACZC,KAAK,CAAC,EAAE,EAAE5J,IACV6J,KAAK,CAAC,EAAE,EAAE,KACVC,MAAM,CAAC9J,GAAKA,GAAKA,IACjB+J,MAAM,CAAC,IAAI,IAAI,GACfC,OAAO,CAAChK,GAAKA,GAAK,GAClBiK,OAAO,CAACjK,GAAK,IAAI,GACjBkK,KAAK,CAAC,IAAI,IAAI,KACdC,OAAO,CAAC,IAAI,EAAE,KACdC,MAAM,CAAC,EAAE,IAAI,GACbC,IAAI,CAACrK,GAAK,EAAE,GACZsK,KAAK,CAACtK,GAAK,IAAI,KACfuK,KAAK,CAAC,EAAEvK,GAAKA,IACbW,YAAY,CAACX,GAAKA,GAAKA,GAAK,IAqH7BgB,GAAa,eAEXjP,EADGoL,EAAI,6EAEHpL,KAAKwO,GACTpD,GAAK,IAAMpL,EAAI,aAET,IAAIyY,OAAOrN,EAAI,IAAK,MANf,GAQb4E,GAAU,YAkCVxK,IACK8N,EAAWoF,KAAKC,IACnBpF,EAAgB,IAChBC,EAAe,GACfC,EAAaH,IACbI,EAAcD,EAEdG,EADAD,EAAO,IAAO,IA0BfR,EAAQ,CACP/T,KAAK,EACLqG,MAAM,EACNmT,qBACCC,IAAM,IAEPC,+BAAWC,UACH3F,GAAU,KAAQ2F,GAAO,MAEjCC,qBACKnG,KACED,GAAgB5X,MACpBmM,EAAOyL,EAAe3X,OACtBwM,EAAON,EAAK8R,UAAY,GACxB1d,GAASC,KAAOA,IACf2L,EAAK+R,eAAiB/R,EAAK+R,aAAe,KAAKxT,KAAKlK,GAAK2d,SAC1Dhe,EAASE,GAAiB8L,EAAKiS,mBAAsBjS,EAAK3L,MAAQ2L,GAAS,IAC3E+L,EAAO/L,EAAKkS,sBACZzL,GAAqBnQ,QAAQwO,KAE9B+G,GAAOG,EAAMmG,QACbrG,EAAOC,GAAS,SAAAqG,UAAKC,WAAWD,EAAI3F,EAAyB,IAAbT,EAAM/T,KAAc,EAAK,IACzE2T,EAAgB,EAChB8F,GAAM,KAGRS,wBACEpG,EAAO/L,EAAKsS,qBAAuBC,cAAc1G,GAClDD,EAAgB,EAChBE,EAAO9W,GAERwd,mCAAaC,EAAWC,GACvBtG,EAAgBqG,GAAaE,EAAAA,EAC7BtG,EAAe7V,KAAKwL,IAAI0Q,GAAe,GAAItG,IAE5CwF,iBAAIA,GACHpF,EAAO,KAAQoF,GAAO,KACtBnF,EAAyB,IAAbT,EAAM/T,KAAcuU,GAEjClH,iBAAI0K,EAAU4C,EAAMC,OACfzc,EAAOwc,EAAO,SAACvY,EAAGwH,EAAGuQ,EAAGpc,GAAOga,EAAS3V,EAAGwH,EAAGuQ,EAAGpc,GAAIgW,EAAMlR,OAAO1E,IAAU4Z,SAChFhE,EAAMlR,OAAOkV,GACbtD,EAAWmG,EAAa,UAAY,QAAQzc,GAC5C8P,KACO9P,GAER0E,uBAAOkV,EAAU5a,KACdA,EAAIsX,EAAWpV,QAAQ0Y,KAActD,EAAW9W,OAAOR,EAAG,IAAYA,GAAN8W,GAAWA,KAE9EQ,WAzEAA,EAAa,KA6EfxG,GAAQ,SAARA,eAAe0F,GAAiBvN,GAAQwT,QAoBxC9I,GAAW,GACXc,GAAiB,sBACjBP,GAAa,QA4Bb3G,GAAc,SAAdA,YAAc9B,UAAQ,SAAAhI,UAAK,EAAIgI,EAAK,EAAIhI,KAoBxCiI,GAAa,SAAbA,WAAcD,EAAMiS,UAAiBjS,IAAsBrN,EAAYqN,GAAQA,EAAOkI,GAASlI,IAASiI,GAAsBjI,KAAlFiS,GAjJlC,SAARpB,GAAQ1b,OAGN+c,EAASC,EAAU/a,EAAMqG,EAFtB2U,EAAU9G,IAAaI,EAC1B2G,GAAe,IAANld,KAEAoW,EAAV6G,IAA4B3G,GAAc2G,EAAU5G,IAItC,GADd0G,GADA9a,GADAsU,GAAe0G,GACM3G,GACJG,IACEyG,KAClB5U,IAAU0N,EAAM1N,MAChB2N,EAAShU,EAAoB,IAAb+T,EAAM/T,KACtB+T,EAAM/T,KAAOA,GAAc,IAC3BwU,GAAasG,GAAsBvG,GAAXuG,EAAkB,EAAIvG,EAAOuG,GACrDC,EAAW,GAEZE,IAAWrH,EAAMC,EAAK4F,KAClBsB,MACE9G,EAAK,EAAGA,EAAKQ,EAAWjX,OAAQyW,IACpCQ,EAAWR,GAAIjU,EAAMgU,EAAQ3N,EAAOtI,GAqL9B,SAAVuU,GAAU1R,UAAMA,EAAI8T,EAAMnU,EAAIK,EAAIA,EAAKA,EAFlC,kBAE4CL,WAAKK,EAAI,IAEjD,KAF6D,GAAI,IAAOA,EAD5E,kBACsFL,GAAKK,GAAK,KAE5F,MAFwGA,EAAI,MAAQL,WAAKK,EAAI,MAE7H,KAF2I,GAAI,QAV1J3C,GAAa,uCAAwC,SAACpB,EAAMM,OACvD+d,EAAQ/d,EAAI,EAAIA,EAAI,EAAIA,EAC5BiV,GAAYvV,EAAO,UAAYqe,EAAQ,GAAI/d,EAAI,SAAAyD,mBAAKA,EAAKsa,IAAQ,SAAAta,UAAKA,GAAG,SAAAA,UAAK,WAAK,EAAIA,EAAMsa,IAAO,SAAAta,UAAKA,EAAI,GAAKrC,SAAK,EAAJqC,EAAUsa,GAAQ,EAAI,EAAI3c,SAAW,GAAT,EAAIqC,GAAWsa,GAAQ,MAEvKpK,GAASqK,OAAOC,SAAWtK,GAASuK,KAAOvK,GAASqK,OAAO9I,OAC3DD,GAAY,UAAWO,GAAe,MAAOA,GAAe,OAAQA,MAClEpS,EAMC,OALEmU,EAAK,EAKC,KADVtC,GAAY,SAAU,SAAAxR,UAAK,EAAI0R,GAAQ,EAAI1R,IAAI0R,IAEhDF,GAAY,OAAQ,SAAAxR,UAAKA,WAAI,EAAM,IAAMA,EAAI,IAAM,IACnDwR,GAAY,OAAQ,SAAAxR,WAAO0J,EAAM,EAAK1J,EAAIA,GAAM,KAChDwR,GAAY,OAAQ,SAAAxR,UAAW,IAANA,EAAU,EAA0B,EAArB4U,EAAK5U,EAAIyU,KACjDjD,GAAY,OAAQgB,GAAY,MAAOA,GAAY,OAAQA,MAC3DtC,GAASwK,YAAcxK,GAASyK,MAAQpf,GAASmf,YAAc,CAC9DxO,uBAAOyO,EAAWC,YAAXD,IAAAA,EAAQ,OACVzI,EAAK,EAAIyI,EACZtI,EAAKsI,GAASC,EAAiB,EAAI,GACnCxI,EAAKwI,EAAiB,EAAI,SAEpB,SAAA5a,WAAQqS,EAAKlO,GAAO,EADpB,UAC4BnE,GAAM,GAAKoS,GAAMF,KAGtDmC,EAAUrM,KAAOkI,GAAS,YAG1B7S,GAAa,qEAAsE,SAAApB,UAAQyZ,IAAkBzZ,EAAO,IAAMA,EAAO,mBAoBpHa,GAEZ,iBAAYN,EAAQE,QACdme,GAAKnG,KACVlY,EAAOC,MAAQqe,MACVte,OAASA,OACTE,QAAUA,OACVsQ,IAAMtQ,EAAUA,EAAQsQ,IAAM9P,QAC9B6d,IAAMre,EAAUA,EAAQuQ,UAAYC,IAyB9B8N,6BAmBZzG,MAAA,eAAM7Z,UACDA,GAAmB,IAAVA,QACPiG,QAAUma,KAAKna,OAAOmD,mBAAsBgX,KAAKG,UAAUH,KAAKxY,OAAS5H,EAAQogB,KAAKrW,aACtFA,OAAS/J,EACPogB,MAEDA,KAAKrW,WAGbvB,SAAA,kBAASxI,UACDwgB,UAAUte,OAASke,KAAKvX,cAA6B,EAAfuX,KAAK/X,QAAcrI,GAASA,EAAQogB,KAAK3X,SAAW2X,KAAK/X,QAAUrI,GAASogB,KAAKvX,iBAAmBuX,KAAKzY,SAGvJkB,cAAA,uBAAc7I,UACRwgB,UAAUte,aAGV2F,OAAS,EACPoD,GAAamV,KAAMA,KAAK/X,QAAU,EAAIrI,GAASA,EAASogB,KAAK/X,QAAU+X,KAAK3X,UAAa2X,KAAK/X,QAAU,KAHvG+X,KAAKtX,UAMdf,UAAA,mBAAUA,EAAWpD,MACpBgO,MACK6N,UAAUte,cACPke,KAAK7X,WAETtC,EAASma,KAAK5Z,OACdP,GAAUA,EAAOmD,mBAAqBgX,KAAKxX,IAAK,KACnDO,GAAeiX,KAAMrY,IACpB9B,EAAOO,KAAOP,EAAOA,QAAUqD,GAAerD,EAAQma,MAEhDna,GAAUA,EAAOA,QACnBA,EAAOA,OAAOoD,QAAUpD,EAAO2B,QAAwB,GAAd3B,EAAO2C,IAAW3C,EAAOsC,OAAStC,EAAO2C,KAAO3C,EAAO4C,gBAAkB5C,EAAOsC,SAAWtC,EAAO2C,MAC9I3C,EAAO8B,UAAU9B,EAAOsC,QAAQ,GAEjCtC,EAASA,EAAOA,QAEZma,KAAKna,QAAUma,KAAK5Z,IAAIc,qBAAmC,EAAX8Y,KAAKxX,KAAWb,EAAYqY,KAAKtX,OAAWsX,KAAKxX,IAAM,GAAiB,EAAZb,IAAoBqY,KAAKtX,QAAUf,IACnJ4B,GAAeyW,KAAK5Z,IAAK4Z,KAAMA,KAAKxY,OAASwY,KAAKrW,eAG1CqW,KAAK7X,SAAWR,IAAeqY,KAAKzY,OAAShD,GAAoByb,KAAKtb,UAAY7B,KAAK+F,IAAIoX,KAAK1W,UAAYR,IAAenB,IAAcqY,KAAKtb,WAAasb,KAAKrO,KAAOqO,KAAKK,mBAC1K7X,MAAQwX,KAAKM,OAAS3Y,GAG1BvD,GAAgB4b,KAAMrY,EAAWpD,IAIlCyb,SAGR1b,KAAA,cAAK1E,EAAO2E,UACJ6b,UAAUte,OAASke,KAAKrY,UAAW9E,KAAKwL,IAAI2R,KAAKvX,gBAAiB7I,EAAQoI,GAAsBgY,QAAUA,KAAKzY,KAAOyY,KAAK3X,WAAczI,EAAQogB,KAAKzY,KAAO,GAAIhD,GAAkByb,KAAK/W,UAGhMiC,cAAA,uBAActL,EAAO2E,UACb6b,UAAUte,OAASke,KAAKrY,UAAWqY,KAAKvX,gBAAkB7I,EAAO2E,GAAkByb,KAAKvX,gBAAkB5F,KAAKwL,IAAI,EAAG2R,KAAK7X,OAAS6X,KAAKtX,OAASsX,KAAKO,UAG/JtP,SAAA,kBAASrR,EAAO2E,UACR6b,UAAUte,OAASke,KAAKrY,UAAWqY,KAAK5X,aAAc4X,KAAKzJ,OAA8B,EAAnByJ,KAAKQ,YAA+B5gB,EAAZ,EAAIA,GAAiBoI,GAAsBgY,MAAOzb,GAAmByb,KAAK5X,WAAavF,KAAKwL,IAAI,EAAG2R,KAAK/W,MAAQ+W,KAAKzY,MAAQyY,KAAKO,UAGxOC,UAAA,mBAAU5gB,EAAO2E,OACZsW,EAAgBmF,KAAK5X,WAAa4X,KAAK3X,eACpC+X,UAAUte,OAASke,KAAKrY,UAAUqY,KAAK/W,OAASrJ,EAAQ,GAAKib,EAAetW,GAAkByb,KAAK/X,QAAUC,GAAgB8X,KAAK7X,OAAQ0S,GAAiB,EAAI,MAcvKjR,UAAA,mBAAUhK,OACJwgB,UAAUte,cACPke,KAAKnX,QAAUC,EAAW,EAAIkX,KAAKnX,QAEvCmX,KAAKnX,OAASjJ,SACVogB,SAEJ3V,EAAQ2V,KAAKna,QAAUma,KAAKxX,IAAMF,GAAwB0X,KAAKna,OAAOoD,MAAO+W,MAAQA,KAAK7X,mBAMzFU,MAAQjJ,GAAS,OACjB4I,IAAOwX,KAAKS,KAAO7gB,KAAWkJ,EAAY,EAAIkX,KAAKnX,UACnDlB,UAAU0B,IAAQxG,KAAK+F,IAAIoX,KAAKrW,QAASqW,KAAKtX,MAAO2B,IAAQ,GAClE1B,GAAQqX,MAriCW,SAApBU,kBAAoBrc,WACfwB,EAASxB,EAAUwB,OAChBA,GAAUA,EAAOA,QACvBA,EAAO4B,OAAS,EAChB5B,EAAO4C,gBACP5C,EAASA,EAAOA,cAEVxB,EA+hCAqc,CAAkBV,UAG1BW,OAAA,gBAAO/gB,UACDwgB,UAAUte,QAGXke,KAAKS,MAAQ7gB,UACX6gB,IAAM7gB,SAEL0gB,OAASN,KAAK7X,QAAUtF,KAAKuL,KAAK4R,KAAKrW,OAAQqW,KAAK5W,gBACpDZ,IAAMwX,KAAK5Y,KAAO,IAEvBmL,UACK/J,IAAMwX,KAAKnX,UAEXlB,UAAUqY,KAAKna,SAAWma,KAAKna,OAAOmD,kBAAoBgX,KAAK5W,UAAY4W,KAAK7X,QAAU6X,KAAKM,OAA6B,IAApBN,KAAK/O,YAAqBpO,KAAK+F,IAAIoX,KAAK1W,UAAYR,IAAakX,KAAK7X,QAAUW,MAGxLkX,MAdCA,KAAKS,QAiBdN,UAAA,mBAAUvgB,MACLwgB,UAAUte,OAAQ,MAChB0F,OAAS5H,MACViG,EAASma,KAAKna,QAAUma,KAAK5Z,WACjCP,IAAWA,EAAOgE,OAAUmW,KAAKna,QAAW0D,GAAe1D,EAAQma,KAAMpgB,EAAQogB,KAAKrW,QAC/EqW,YAEDA,KAAKxY,WAGbyT,QAAA,iBAAQ2F,UACAZ,KAAKxY,QAAUvH,EAAY2gB,GAAkBZ,KAAKvX,gBAAkBuX,KAAK5X,YAAcvF,KAAK+F,IAAIoX,KAAKxX,KAAO,OAGpHY,QAAA,iBAAQyX,OACHhb,EAASma,KAAKna,QAAUma,KAAK5Z,WACzBP,EAAwBgb,KAAiBb,KAAKxX,KAAQwX,KAAK/X,SAAW+X,KAAK/W,OAAS+W,KAAK9U,gBAAkB,GAAO8U,KAAK7X,QAAU6X,KAAKzY,KAAOyY,KAAK3X,SAAY2X,KAAKxX,IAAoBF,GAAwBzC,EAAOuD,QAAQyX,GAAcb,MAAnEA,KAAK7X,OAArK6X,KAAK7X,WAGvBP,OAAA,gBAAOwJ,YAAAA,IAAAA,EAAQqJ,QACVqG,EAAkBrc,SACtBA,EAAa2M,GACT4O,KAAKtb,UAAYsb,KAAKrb,iBACpBwE,UAAY6W,KAAK7W,SAASvB,OAAOwJ,QACjCzJ,WAAW,IAAMyJ,EAAO7M,iBAEhB,gBAATwW,OAAqC,IAAhB3J,EAAOJ,MAAkBgP,KAAKhP,OACxDvM,EAAaqc,EACNd,SAGRe,WAAA,oBAAW3X,WACN/E,EAAY2b,KACf1b,EAAO8b,UAAUte,OAASsH,EAAU/E,EAAU+E,UACxC/E,GACNC,EAAOD,EAAUmD,OAASlD,GAAQD,EAAUmE,KAAO,GACnDnE,EAAYA,EAAU+B,WAEf4Z,KAAKna,QAAUma,KAAKgB,KAAQhB,KAAKgB,KAAKpb,KAAKkC,iBAAmB,EAAIkY,KAAKgB,KAAKD,WAAW3X,GAAY9E,MAG5G0G,OAAA,gBAAOpL,UACFwgB,UAAUte,aACRmG,QAAUrI,IAAUof,EAAAA,GAAY,EAAIpf,EAClCuL,GAAuB6U,QAEN,IAAlBA,KAAK/X,QAAiB+W,EAAAA,EAAWgB,KAAK/X,YAG9CgZ,YAAA,qBAAYrhB,MACPwgB,UAAUte,OAAQ,KACjBwC,EAAO0b,KAAK/W,kBACXZ,QAAUzI,EACfuL,GAAuB6U,MAChB1b,EAAO0b,KAAK1b,KAAKA,GAAQ0b,YAE1BA,KAAK3X,YAGb6Y,KAAA,cAAKthB,UACAwgB,UAAUte,aACRyU,MAAQ3W,EACNogB,MAEDA,KAAKzJ,UAGb4K,KAAA,cAAK3X,EAAUjF,UACPyb,KAAKrY,UAAU+B,GAAesW,KAAMxW,GAAWvJ,EAAYsE,QAGnE6c,QAAA,iBAAQC,EAAc9c,UACdyb,KAAKsB,OAAO3Z,UAAU0Z,GAAgBrB,KAAKrW,OAAS,EAAG1J,EAAYsE,QAG3E+c,KAAA,cAAKlU,EAAM7I,UACF,MAAR6I,GAAgB4S,KAAKmB,KAAK/T,EAAM7I,GACzByb,KAAKuB,UAAS,GAAOZ,QAAO,OAGpCa,QAAA,iBAAQpU,EAAM7I,UACL,MAAR6I,GAAgB4S,KAAKmB,KAAK/T,GAAQ4S,KAAKvX,gBAAiBlE,GACjDyb,KAAKuB,UAAS,GAAMZ,QAAO,OAGnCc,MAAA,eAAMC,EAAQnd,UACH,MAAVmd,GAAkB1B,KAAKmB,KAAKO,EAAQnd,GAC7Byb,KAAKW,QAAO,OAGpBgB,OAAA,yBACQ3B,KAAKW,QAAO,OAGpBY,SAAA,kBAAS3hB,UACJwgB,UAAUte,UACXlC,IAAUogB,KAAKuB,YAAcvB,KAAKpW,WAAWoW,KAAKnX,OAASjJ,GAASkJ,EAAW,IAC1EkX,MAEDA,KAAKnX,KAAO,MAGpB+Y,WAAA,kCACMld,SAAWsb,KAAK5Y,KAAO,OACvBkC,QAAUR,EACRkX,SAGR6B,SAAA,wBAGEzY,EAFGvD,EAASma,KAAKna,QAAUma,KAAK5Z,IAChCnD,EAAQ+c,KAAKxY,eAEH3B,KAAWma,KAAKxX,KAAOwX,KAAKtb,UAAYmB,EAAOgc,aAAezY,EAAUvD,EAAOuD,SAAQ,KAAUnG,GAASmG,EAAU4W,KAAK/E,SAAQ,GAAQnS,QAGrJgZ,cAAA,uBAAcxW,EAAM+Q,EAAU9Q,OACzB3F,EAAOoa,KAAKpa,YACO,EAAnBwa,UAAUte,QACRua,GAGJzW,EAAK0F,GAAQ+Q,EACb9Q,IAAW3F,EAAK0F,EAAO,UAAYC,GAC1B,aAATD,IAAwB0U,KAAK+B,UAAY1F,WAJlCzW,EAAK0F,GAMN0U,MAEDpa,EAAK0F,OAGb0W,KAAA,cAAKC,OACAC,EAAOlC,YACJ,IAAImC,QAAQ,SAAAC,GAEN,SAAXC,SACKC,EAAQJ,EAAKF,KACjBE,EAAKF,KAAO,KACZniB,EAAY4e,KAAOA,EAAIA,EAAEyD,MAAWzD,EAAEuD,MAAQvD,IAAMyD,KAAUA,EAAKF,KAAOM,GAC1EF,EAAQ3D,GACRyD,EAAKF,KAAOM,MANV7D,EAAI5e,EAAYoiB,GAAeA,EAAchd,GAQ7Cid,EAAKxd,UAAsC,IAAzBwd,EAAKhX,iBAAqC,GAAZgX,EAAK1Z,MAAe0Z,EAAK/Z,QAAU+Z,EAAK1Z,IAAM,EACjG6Z,KAEAH,EAAKK,MAAQF,SAKhBrR,KAAA,gBACCF,GAAWkP,qCA9RApa,QACNA,KAAOA,OACP+D,QAAU/D,EAAK6T,OAAS,GACxBuG,KAAK/X,QAAUrC,EAAKoF,SAAWgU,EAAAA,GAAY,EAAIpZ,EAAKoF,QAAU,UAC7D3C,QAAUzC,EAAKqb,aAAe,OAC9B1K,QAAU3Q,EAAKsb,QAAUtb,EAAK0Q,eAE/B9N,IAAM,EACXqC,GAAamV,MAAOpa,EAAKwC,SAAU,EAAG,QACjC2S,KAAOnV,EAAKmV,KACblD,SACE2E,KAAO3E,GACHkD,KAAKnQ,KAAKoV,MAEpB/H,GAAiBvN,GAAQwT,OAqR3B/Y,GAAa+a,GAAUzN,UAAW,CAACxJ,MAAM,EAAGzB,OAAO,EAAGF,KAAK,EAAGa,OAAO,EAAGO,MAAM,EAAGjB,OAAO,EAAGQ,QAAQ,EAAGsO,OAAM,EAAO1Q,OAAO,KAAMnB,UAAS,EAAO2D,QAAQ,EAAGG,IAAI,EAAGpC,IAAI,EAAGma,MAAM,EAAGjX,QAAQR,EAAUyZ,MAAM,EAAG9B,KAAI,EAAO5X,KAAK,QAyBhNuC,iCAEAxF,EAAW4D,yBAAX5D,IAAAA,EAAO,mBACZA,UACDiL,OAAS,KACT7H,oBAAsBpD,EAAKoD,oBAC3B9B,qBAAuBtB,EAAKsB,qBAC5B2C,MAAQ5J,EAAY2F,EAAK4c,cAC9B1c,GAAmByD,GAAe3D,EAAKC,QAAUC,4BAAuB0D,GACxE5D,EAAK2b,UAAYkB,EAAKjB,UACtB5b,EAAK+a,QAAU8B,EAAK9B,QAAO,GAC3B/a,EAAKmL,eAAiB/G,6BAAqBpE,EAAKmL,8EAGjD2R,GAAA,YAAGnhB,EAASqE,EAAM4D,UACjB6B,GAAiB,EAAG+U,UAAWJ,MACxBA,QAGR5S,KAAA,cAAK7L,EAASqE,EAAM4D,UACnB6B,GAAiB,EAAG+U,UAAWJ,MACxBA,QAGR2C,OAAA,gBAAOphB,EAASqhB,EAAUC,EAAQrZ,UACjC6B,GAAiB,EAAG+U,UAAWJ,MACxBA,QAGRC,IAAA,aAAI1e,EAASqE,EAAM4D,UAClB5D,EAAKwC,SAAW,EAChBxC,EAAKC,OAASma,KACdra,GAAiBC,GAAMqb,cAAgBrb,EAAKoF,OAAS,GACrDpF,EAAKkC,kBAAoBlC,EAAKkC,oBAC1B+D,GAAMtK,EAASqE,EAAM8D,GAAesW,KAAMxW,GAAW,GAClDwW,QAGRpE,KAAA,cAAKS,EAAU9Q,EAAQ/B,UACfD,GAAeyW,KAAMnU,GAAMiX,YAAY,EAAGzG,EAAU9Q,GAAS/B,MAIrEuZ,UAAA,mBAAUxhB,EAAS6G,EAAUxC,EAAMod,EAASxZ,EAAUyZ,EAAeC,UACpEtd,EAAKwC,SAAWA,EAChBxC,EAAKod,QAAUpd,EAAKod,SAAWA,EAC/Bpd,EAAKud,WAAaF,EAClBrd,EAAKwd,iBAAmBF,EACxBtd,EAAKC,OAASma,SACVnU,GAAMtK,EAASqE,EAAM8D,GAAesW,KAAMxW,IACvCwW,QAGRqD,YAAA,qBAAY9hB,EAAS6G,EAAUxC,EAAMod,EAASxZ,EAAUyZ,EAAeC,UACtEtd,EAAK+F,aAAe,EACpBhG,GAAiBC,GAAMkC,gBAAkB7H,EAAY2F,EAAKkC,iBACnDkY,KAAK+C,UAAUxhB,EAAS6G,EAAUxC,EAAMod,EAASxZ,EAAUyZ,EAAeC,MAGlFI,cAAA,uBAAc/hB,EAAS6G,EAAUwa,EAAUC,EAAQG,EAASxZ,EAAUyZ,EAAeC,UACpFL,EAAOjX,QAAUgX,EACjBjd,GAAiBkd,GAAQ/a,gBAAkB7H,EAAY4iB,EAAO/a,iBACvDkY,KAAK+C,UAAUxhB,EAAS6G,EAAUya,EAAQG,EAASxZ,EAAUyZ,EAAeC,MAGpF/e,OAAA,gBAAOwD,EAAWpD,EAAgBC,OAMhCF,EAAMgC,EAAOS,EAAMyZ,EAAW3F,EAAe0I,EAAYC,EAAY5Z,EAAW6Z,EAAWC,EAAexC,EAAM9K,EAL7GuN,EAAW3D,KAAK/W,MACnB2a,EAAO5D,KAAKvY,OAASuY,KAAKvX,gBAAkBuX,KAAKtX,MACjDuC,EAAM+U,KAAKzY,KACX8C,EAAQ1C,GAAa,EAAI,EAAI5E,GAAc4E,GAC3Ckc,EAAiB7D,KAAK1W,OAAS,GAAQ3B,EAAY,IAAOqY,KAAKtb,WAAauG,aAEpEnF,GAA2B8d,EAARvZ,GAA6B,GAAb1C,IAAmB0C,EAAQuZ,GACnEvZ,IAAU2V,KAAK7X,QAAU3D,GAASqf,EAAe,IAChDF,IAAa3D,KAAK/W,OAASgC,IAC9BZ,GAAS2V,KAAK/W,MAAQ0a,EACtBhc,GAAaqY,KAAK/W,MAAQ0a,GAE3Brf,EAAO+F,EACPoZ,EAAYzD,KAAKxY,OAEjB+b,IADA3Z,EAAYoW,KAAKxX,KAEbqb,IACH5Y,IAAQ0Y,EAAW3D,KAAK1W,SAEvB3B,GAAcpD,IAAoByb,KAAK1W,OAAS3B,IAE9CqY,KAAK/X,QAAS,IACjBiZ,EAAOlB,KAAKzJ,MACZsE,EAAgB5P,EAAM+U,KAAK3X,QACvB2X,KAAK/X,SAAW,GAAKN,EAAY,SAC7BqY,KAAKrY,UAA0B,IAAhBkT,EAAsBlT,EAAWpD,EAAgBC,MAExEF,EAAOvB,GAAcsH,EAAQwQ,GACzBxQ,IAAUuZ,GACbpD,EAAYR,KAAK/X,QACjB3D,EAAO2G,KAEPuV,KAAenW,EAAQwQ,KACN2F,IAAcnW,EAAQwQ,IACtCvW,EAAO2G,EACPuV,KAEMvV,EAAP3G,IAAeA,EAAO2G,IAEvByY,EAAgBxb,GAAgB8X,KAAK7X,OAAQ0S,IAC5C8I,GAAY3D,KAAK7X,QAAUub,IAAkBlD,GAAaR,KAAK7X,OAASub,EAAgB7I,EAAgBmF,KAAKzY,MAAQ,IAAMmc,EAAgBlD,GACxIU,GAAqB,EAAZV,IACZlc,EAAO2G,EAAM3G,EACb8R,EAAS,GAUNoK,IAAckD,IAAkB1D,KAAK8D,MAAO,KAC3CC,EAAa7C,GAAyB,EAAhBwC,EACzBM,EAAYD,KAAe7C,GAAqB,EAAZV,MACrCA,EAAYkD,IAAkBK,GAAaA,GAC3CJ,EAAWI,EAAY,EAAI9Y,OACtB6Y,MAAQ,OACR3f,OAAOwf,IAAavN,EAAS,EAAIrT,GAAcyd,EAAY3F,IAAiBtW,GAAiB0G,GAAK6Y,MAAQ,OAC1G3b,OAASkC,GACb9F,GAAkByb,KAAKna,QAAUqL,GAAU8O,KAAM,iBAC7Cpa,KAAKqe,gBAAkB7N,IAAW4J,KAAK4B,aAAakC,MAAQ,GAC5DH,GAAYA,IAAa3D,KAAK/W,OAAUsa,IAAgBvD,KAAKxX,KAAQwX,KAAKpa,KAAKse,WAAalE,KAAKna,SAAWma,KAAK5Y,YAC9G4Y,QAER/U,EAAM+U,KAAKzY,KACXqc,EAAO5D,KAAKtX,MACRsb,SACEF,MAAQ,EACbH,EAAWI,EAAY9Y,GAAO,UACzB9G,OAAOwf,GAAU,QACjB/d,KAAKqe,gBAAkB7N,GAAU4J,KAAK4B,mBAEvCkC,MAAQ,GACR9D,KAAKxX,MAAQ+a,SACVvD,KAGR7J,GAAmB6J,KAAM5J,OAGvB4J,KAAKmE,YAAcnE,KAAKoE,UAAYpE,KAAK8D,MAAQ,IACpDN,EArwCmB,SAAtBa,oBAAuBhgB,EAAWsf,EAAUrf,OACvCgC,KACOqd,EAAPrf,MACHgC,EAAQjC,EAAUgS,OACX/P,GAASA,EAAMkB,QAAUlD,GAAM,IAClB,YAAfgC,EAAMyU,MAAsBzU,EAAMkB,OAASmc,SACvCrd,EAERA,EAAQA,EAAMO,eAGfP,EAAQjC,EAAUigB,MACXhe,GAASA,EAAMkB,QAAUlD,GAAM,IAClB,YAAfgC,EAAMyU,MAAsBzU,EAAMkB,OAASmc,SACvCrd,EAERA,EAAQA,EAAMM,OAqvCDyd,CAAoBrE,KAAMjd,GAAc4gB,GAAW5gB,GAAcuB,OAE7E+F,GAAS/F,GAAQA,EAAOkf,EAAWhc,cAIhCW,OAASkC,OACTpB,MAAQ3E,OACR8C,MAAQwC,EAERoW,KAAKtb,gBACJqd,UAAY/B,KAAKpa,KAAK2e,cACtB7f,SAAW,OACX4E,OAAS3B,EACdgc,EAAW,IAEPA,GAAYrf,IAASC,IAAmBic,IAC5CtP,GAAU8O,KAAM,WACZA,KAAK7X,SAAWkC,UACZ2V,QAGG2D,GAARrf,GAAiC,GAAbqD,MACvBrB,EAAQ0Z,KAAK3J,OACN/P,GAAO,IACbS,EAAOT,EAAMO,OACRP,EAAMc,MAAQ9C,GAAQgC,EAAMkB,SAAWlB,EAAMkC,KAAOgb,IAAeld,EAAO,IAC1EA,EAAMT,SAAWma,YACbA,KAAK7b,OAAOwD,EAAWpD,EAAgBC,MAE/C8B,EAAMnC,OAAmB,EAAZmC,EAAMkC,KAAWlE,EAAOgC,EAAMkB,QAAUlB,EAAMkC,KAAOlC,EAAMmB,OAASnB,EAAMmC,gBAAkBnC,EAAMoC,QAAUpE,EAAOgC,EAAMkB,QAAUlB,EAAMkC,IAAKjE,EAAgBC,GACvKF,IAAS0b,KAAK/W,QAAW+W,KAAKxX,MAAQ+a,EAAa,CACtDC,EAAa,EACbzc,IAASsD,GAAU2V,KAAK1W,QAAUR,UAIpCxC,EAAQS,MAEH,CACNT,EAAQ0Z,KAAKsE,cACTE,EAAe7c,EAAY,EAAIA,EAAYrD,EACxCgC,GAAO,IACbS,EAAOT,EAAMM,OACRN,EAAMc,MAAQod,GAAgBle,EAAMgB,OAAShB,EAAMkC,KAAOgb,IAAeld,EAAO,IAChFA,EAAMT,SAAWma,YACbA,KAAK7b,OAAOwD,EAAWpD,EAAgBC,MAE/C8B,EAAMnC,OAAmB,EAAZmC,EAAMkC,KAAWgc,EAAele,EAAMkB,QAAUlB,EAAMkC,KAAOlC,EAAMmB,OAASnB,EAAMmC,gBAAkBnC,EAAMoC,QAAU8b,EAAele,EAAMkB,QAAUlB,EAAMkC,IAAKjE,EAAgBC,GAAUC,IAAe6B,EAAM5B,UAAY4B,EAAM3B,WACxOL,IAAS0b,KAAK/W,QAAW+W,KAAKxX,MAAQ+a,EAAa,CACtDC,EAAa,EACbzc,IAASsD,GAAU2V,KAAK1W,OAASkb,GAAgB1b,EAAWA,UAI9DxC,EAAQS,MAGNyc,IAAejf,SACbkd,QACL+B,EAAWrf,OAAewf,GAARrf,EAAmB,GAAKwE,GAAUQ,OAAiBqa,GAARrf,EAAmB,GAAK,EACjF0b,KAAKxX,iBACHhB,OAASic,EACd9a,GAAQqX,MACDA,KAAK7b,OAAOwD,EAAWpD,EAAgBC,QAG3Cud,YAAcxd,GAAkB2M,GAAU8O,KAAM,YAAY,IAC5D3V,IAAUuZ,GAAQ5D,KAAK7X,QAAU6X,KAAKvX,kBAAsB4B,GAASsZ,KAAeF,IAAczD,KAAKxY,QAAU3E,KAAK+F,IAAIgB,KAAe/G,KAAK+F,IAAIoX,KAAKxX,MAAWwX,KAAK8D,SAC1Knc,GAAcsD,KAAUZ,IAAUuZ,GAAmB,EAAX5D,KAAKxX,MAAc6B,GAAS2V,KAAKxX,IAAM,IAAOxB,GAAkBgZ,KAAM,GAC5Gzb,GAAoBoD,EAAY,IAAMgc,IAActZ,IAASsZ,GAAaC,IAC9E1S,GAAU8O,KAAO3V,IAAUuZ,GAAqB,GAAbjc,EAAiB,aAAe,qBAAsB,SACpF4a,OAAWlY,EAAQuZ,GAA2B,EAAnB5D,KAAKpW,aAAoBoW,KAAKuC,kBAI1DvC,QAGRrO,IAAA,aAAIrL,EAAOkD,iBACV1J,EAAU0J,KAAcA,EAAWE,GAAesW,KAAMxW,EAAUlD,MAC5DA,aAAiB4Z,IAAY,IAC9Bha,EAASI,UACZA,EAAM3D,QAAQ,SAAAvB,UAAOqjB,EAAK9S,IAAIvQ,EAAKoI,KAC5BwW,QAEJrgB,EAAU2G,UACN0Z,KAAK0E,SAASpe,EAAOkD,OAEzB3J,EAAYyG,UAGR0Z,KAFP1Z,EAAQuF,GAAMiX,YAAY,EAAGxc,UAKxB0Z,OAAS1Z,EAAQiD,GAAeyW,KAAM1Z,EAAOkD,GAAYwW,QAGjE2E,YAAA,qBAAY5O,EAAe6O,EAAeC,EAAkBC,YAAhD/O,IAAAA,GAAS,YAAM6O,IAAAA,GAAS,YAAMC,IAAAA,GAAY,YAAMC,IAAAA,GAAoBrW,WAC3E1K,EAAI,GACPuC,EAAQ0Z,KAAK3J,OACP/P,GACFA,EAAMkB,QAAUsd,IACfxe,aAAiBuF,GACpB+Y,GAAU7gB,EAAE6G,KAAKtE,IAEjBue,GAAa9gB,EAAE6G,KAAKtE,GACpByP,GAAUhS,EAAE6G,WAAF7G,EAAUuC,EAAMqe,aAAY,EAAMC,EAAQC,MAGtDve,EAAQA,EAAMO,aAER9C,KAGRghB,QAAA,iBAAQhF,WACHiF,EAAahF,KAAK2E,YAAY,EAAG,EAAG,GACvCljB,EAAIujB,EAAWljB,OACVL,QACDujB,EAAWvjB,GAAGmE,KAAKma,KAAOA,SACtBiF,EAAWvjB,MAKrB0F,OAAA,gBAAOb,UACF3G,EAAU2G,GACN0Z,KAAKiF,YAAY3e,GAErBzG,EAAYyG,GACR0Z,KAAKkF,aAAa5e,IAE1BQ,GAAsBkZ,KAAM1Z,GACxBA,IAAU0Z,KAAKjW,eACbA,QAAUiW,KAAKsE,OAEdjd,GAAS2Y,UAGjBrY,UAAA,mBAAUA,EAAWpD,UACf6b,UAAUte,aAGVsiB,SAAW,GACXpE,KAAK5Z,KAAO4Z,KAAKxX,WAChBhB,OAASzE,GAAc2H,GAAQpG,MAAmB,EAAX0b,KAAKxX,IAAUb,EAAYqY,KAAKxX,KAAOwX,KAAKvX,gBAAkBd,IAAcqY,KAAKxX,mBAExHb,oBAAUA,EAAWpD,QACtB6f,SAAW,EACTpE,MARCA,KAAK7X,UAWduc,SAAA,kBAAS9T,EAAOpH,eACVqH,OAAOD,GAASlH,GAAesW,KAAMxW,GACnCwW,QAGRiF,YAAA,qBAAYrU,iBACJoP,KAAKnP,OAAOD,GACZoP,QAGRmF,SAAA,kBAAS3b,EAAU6S,EAAU9Q,OACxB7E,EAAImF,GAAMiX,YAAY,EAAGzG,GAAYhb,EAAYkK,UACrD7E,EAAEqU,KAAO,eACJoJ,UAAY,EACV5a,GAAeyW,KAAMtZ,EAAGgD,GAAesW,KAAMxW,OAGrD4b,YAAA,qBAAY5b,OACPlD,EAAQ0Z,KAAK3J,WACjB7M,EAAWE,GAAesW,KAAMxW,GACzBlD,GACFA,EAAMkB,SAAWgC,GAA2B,YAAflD,EAAMyU,MACtC/T,GAAkBV,GAEnBA,EAAQA,EAAMO,SAIhBqe,aAAA,sBAAa3jB,EAAS8jB,EAAOC,WACxBV,EAAS5E,KAAKuF,YAAYhkB,EAAS+jB,GACtC7jB,EAAImjB,EAAO9iB,OACLL,KACL+jB,KAAsBZ,EAAOnjB,IAAOmjB,EAAOnjB,GAAGuP,KAAKzP,EAAS8jB,UAEvDrF,QAGRuF,YAAA,qBAAYhkB,EAAS+jB,WAKnBG,EAJG1hB,EAAI,GACP2hB,EAAgBvjB,GAAQZ,GACxB+E,EAAQ0Z,KAAK3J,OACbsP,EAAe7lB,EAAUwlB,GAEnBhf,GACFA,aAAiBuF,GAChBtI,GAAkB+C,EAAMsf,SAAUF,KAAmBC,IAAiBH,IAAsBlf,EAAM5B,UAAY4B,EAAMkC,MAASlC,EAAMya,WAAW,IAAMuE,GAAchf,EAAMya,WAAWza,EAAMmC,iBAAmB6c,GAAcA,GAAchf,EAAMub,aACjP9d,EAAE6G,KAAKtE,IAEGmf,EAAWnf,EAAMif,YAAYG,EAAeJ,IAAaxjB,QACpEiC,EAAE6G,WAAF7G,EAAU0hB,GAEXnf,EAAQA,EAAMO,aAER9C,KAUR8hB,QAAA,iBAAQrc,EAAU5D,GACjBA,EAAOA,GAAQ,OAIdkgB,EAHGC,EAAK/F,KACR/E,EAAUvR,GAAeqc,EAAIvc,GAC3BoC,EAAqDhG,EAArDgG,QAASoa,EAA4CpgB,EAA5CogB,QAASC,EAAmCrgB,EAAnCqgB,cAAene,EAAoBlC,EAApBkC,gBAEnCjE,EAAQgI,GAAM6W,GAAGqD,EAAI5gB,GAAa,CACjC+H,KAAMtH,EAAKsH,MAAQ,OACnB1C,MAAM,EACN1C,iBAAiB,EACjBxD,KAAM2W,EACNzB,UAAW,OACXpR,SAAUxC,EAAKwC,UAAavF,KAAK+F,KAAKqS,GAAYrP,GAAW,SAAUA,EAAWA,EAAQtH,KAAOyhB,EAAG9c,QAAU8c,EAAGnc,cAAiBd,EAClIkd,QAAS,sBACRD,EAAGtE,SACEqE,EAAS,KACT1d,EAAWxC,EAAKwC,UAAYvF,KAAK+F,KAAKqS,GAAYrP,GAAW,SAAUA,EAAWA,EAAQtH,KAAOyhB,EAAG9c,QAAU8c,EAAGnc,aACpH/F,EAAM0D,OAASa,GAAayC,GAAahH,EAAOuE,EAAU,EAAG,GAAGjE,OAAON,EAAMoF,OAAO,GAAM,GAC3F6c,EAAU,EAEXE,GAAWA,EAAQ3Q,MAAMxR,EAAOoiB,GAAiB,MAEhDrgB,WACGkC,EAAkBjE,EAAMM,OAAO,GAAKN,KAG5CqiB,YAAA,qBAAYC,EAAcC,EAAYxgB,UAC9Boa,KAAK6F,QAAQO,EAAYjhB,GAAa,CAACyG,QAAQ,CAACtH,KAAKoF,GAAesW,KAAMmG,KAAiBvgB,OAGnGyV,OAAA,yBACQ2E,KAAKjW,WAGbsc,UAAA,mBAAUC,mBAAAA,IAAAA,EAAYtG,KAAK/W,OACnBuH,GAAqBwP,KAAMtW,GAAesW,KAAMsG,OAGxDC,cAAA,uBAAcC,mBAAAA,IAAAA,EAAaxG,KAAK/W,OACxBuH,GAAqBwP,KAAMtW,GAAesW,KAAMwG,GAAa,MAGrEC,aAAA,sBAAa7mB,UACLwgB,UAAUte,OAASke,KAAKmB,KAAKvhB,GAAO,GAAQogB,KAAKuG,cAAcvG,KAAK/W,MAAQH,MAGpF4d,cAAA,uBAAc7X,EAAQ8X,EAAc7B,YAAAA,IAAAA,EAAmB,WAGrD5f,EAFGoB,EAAQ0Z,KAAK3J,OAChBxF,EAASmP,KAAKnP,OAERvK,GACFA,EAAMkB,QAAUsd,IACnBxe,EAAMkB,QAAUqH,EAChBvI,EAAMgB,MAAQuH,GAEfvI,EAAQA,EAAMO,SAEX8f,MACEzhB,KAAK2L,EACLA,EAAO3L,IAAM4f,IAChBjU,EAAO3L,IAAM2J,UAITxH,GAAS2Y,SAGjB4B,WAAA,oBAAWgF,OACNtgB,EAAQ0Z,KAAK3J,gBACZyN,MAAQ,EACNxd,GACNA,EAAMsb,WAAWgF,GACjBtgB,EAAQA,EAAMO,yBAEF+a,qBAAWgF,MAGzBC,MAAA,eAAMC,YAAAA,IAAAA,GAAgB,WAEpB/f,EADGT,EAAQ0Z,KAAK3J,OAEV/P,GACNS,EAAOT,EAAMO,WACRM,OAAOb,GACZA,EAAQS,cAEJX,MAAQ4Z,KAAK/W,MAAQ+W,KAAK7X,OAAS6X,KAAKM,OAAS,GACtDwG,IAAkB9G,KAAKnP,OAAS,IACzBxJ,GAAS2Y,SAGjBvX,cAAA,uBAAc7I,OAKZ+G,EAAM1D,EAAO4C,EAJVuI,EAAM,EACT8T,EAAOlC,KACP1Z,EAAQ4b,EAAKoC,MACbb,EAAYhV,KAET2R,UAAUte,cACNogB,EAAKtY,WAAWsY,EAAKja,QAAU,EAAIia,EAAK9Z,WAAa8Z,EAAKzZ,kBAAoByZ,EAAKX,YAAc3hB,EAAQA,OAE7GsiB,EAAKza,OAAQ,KAChB5B,EAASqc,EAAKrc,OACPS,GACNK,EAAOL,EAAMM,MACbN,EAAMmB,QAAUnB,EAAMmC,gBAEVgb,GADZxgB,EAAQqD,EAAMkB,SACW0a,EAAKrY,OAASvD,EAAMkC,MAAQ0Z,EAAK4B,OACzD5B,EAAK4B,MAAQ,EACbva,GAAe2Y,EAAM5b,EAAOrD,EAAQqD,EAAMqD,OAAQ,GAAGma,MAAQ,GAE7DL,EAAYxgB,EAETA,EAAQ,GAAKqD,EAAMkC,MACtB4F,GAAOnL,IACD4C,IAAWqc,EAAK9b,KAASP,GAAUA,EAAOmD,qBAC/CkZ,EAAK1a,QAAUvE,EAAQif,EAAK1Z,IAC5B0Z,EAAKjZ,OAAShG,EACdif,EAAK/Z,QAAUlF,GAEhBif,EAAKwE,eAAezjB,GAAO,GAAQ,UACnCwgB,EAAY,GAEbnd,EAAMgB,KAAO8G,GAAO9H,EAAMkC,MAAQ4F,EAAM9H,EAAMgB,MAC9ChB,EAAQK,EAETkE,GAAaqX,EAAOA,IAASpc,GAAmBoc,EAAKjZ,MAAQmF,EAAO8T,EAAKjZ,MAAQmF,EAAK,EAAG,GACzF8T,EAAKza,OAAS,SAERya,EAAKxZ,gBAGNqe,WAAP,oBAAkBziB,MACbwB,EAAgB0C,MACnBpE,GAAgB0B,EAAiBwC,GAAwBhE,EAAMwB,IAC/D2E,EAAqBC,GAAQC,OAE1BD,GAAQC,OAASgQ,GAAc,CAClCA,IAAgB1B,EAAQC,WAAa,QACjC5S,EAAQR,EAAgBuQ,YACvB/P,IAAUA,EAAMkC,MAASyQ,EAAQC,WAAaxO,GAAQqO,WAAWjX,OAAS,EAAG,MAC1EwE,IAAUA,EAAMkC,KACtBlC,EAAQA,EAAMO,MAEfP,GAASoE,GAAQ8T,qBA1fS0B,IAigB9B/a,GAAaiG,GAASqH,UAAW,CAACqR,MAAM,EAAGK,UAAU,EAAGC,SAAS,IA8GjD,SAAf4C,GAAgBpmB,EAAUgF,EAAM/B,EAAOsM,EAAOzO,EAAQH,OACjD0lB,EAAQC,EAAIC,EAAU1lB,KACtB+Q,GAAS5R,KAAwL,KAA1KqmB,EAAS,IAAIzU,GAAS5R,IAAa2Q,KAAK7P,EAAQulB,EAAOjV,QAAUpM,EAAKhF,GAdnF,SAAfwmB,aAAgBxhB,EAAMuK,EAAOzO,EAAQH,EAASsC,MAC7ChE,EAAY+F,KAAUA,EAAOyhB,GAAmBzhB,EAAM/B,EAAOsM,EAAOzO,EAAQH,KACvEvB,EAAU4F,IAAUA,EAAK0hB,OAAS1hB,EAAKwG,UAAalG,EAASN,IAASqU,EAAcrU,UACjFjG,EAAUiG,GAAQyhB,GAAmBzhB,EAAM/B,EAAOsM,EAAOzO,EAAQH,GAAWqE,MAGnFV,EADGQ,EAAO,OAENR,KAAKU,EACTF,EAAKR,GAAKmiB,GAAmBzhB,EAAKV,GAAIrB,EAAOsM,EAAOzO,EAAQH,UAEtDmE,EAIsG0hB,CAAaxhB,EAAKhF,GAAWuP,EAAOzO,EAAQH,EAASsC,GAAQA,EAAOsM,EAAO5O,KACvLsC,EAAM0G,IAAM2c,EAAK,IAAIrU,GAAUhP,EAAM0G,IAAK7I,EAAQd,EAAU,EAAG,EAAGqmB,EAAO9iB,OAAQ8iB,EAAQ,EAAGA,EAAOM,UAC/F1jB,IAAUmU,OACbmP,EAAWtjB,EAAMwc,UAAUxc,EAAM+hB,SAASjiB,QAAQjC,IAClDD,EAAIwlB,EAAOzV,OAAO1P,OACXL,KACN0lB,EAASF,EAAOzV,OAAO/P,IAAMylB,SAIzBD,EAsKS,SAAjBO,GAAkB9U,EAAMtR,EAAKqmB,EAAUC,OAErCxiB,EAAGnB,EADAmJ,EAAO9L,EAAI8L,MAAQwa,GAAY,kBAE/BxhB,EAAS9E,GACZ2C,EAAI0jB,EAAS/U,KAAU+U,EAAS/U,GAAQ,IAExCtR,EAAIuB,QAAQ,SAAC/C,EAAO6B,UAAMsC,EAAE6G,KAAK,CAAClE,EAAGjF,GAAKL,EAAIU,OAAS,GAAK,IAAKO,EAAGzC,EAAO+nB,EAAGza,eAEzEhI,KAAK9D,EACT2C,EAAI0jB,EAASviB,KAAOuiB,EAASviB,GAAK,IAC5B,SAANA,GAAgBnB,EAAE6G,KAAK,CAAClE,EAAGrD,WAAWqP,GAAOrQ,EAAGjB,EAAI8D,GAAIyiB,EAAGza,IArR/D,IAuGCsY,GACAoC,GAxDAhW,GAAgB,SAAhBA,cAAyBlQ,EAAQgR,EAAMzP,EAAOG,EAAK+M,EAAO5O,EAASuQ,EAAU+V,EAAcC,EAAWC,GACrGloB,EAAYuD,KAASA,EAAMA,EAAI+M,GAAS,EAAGzO,EAAQH,QAIlD2lB,EAHGc,EAAetmB,EAAOgR,GACzBuV,EAAyB,QAAVhlB,EAAmBA,EAASpD,EAAYmoB,GAAgCF,EAAYpmB,EAAQgR,EAAK/O,QAAQ,SAAW9D,EAAY6B,EAAO,MAAQgR,EAAKpP,OAAO,KAAQoP,EAAO,MAAQA,EAAKpP,OAAO,IAAIwkB,GAAapmB,EAAOgR,KAA9JsV,EACvEE,EAAUroB,EAAYmoB,GAA+BF,EAAYK,GAAuBC,GAAlDC,MAEnC1oB,EAAUyD,MACRA,EAAIO,QAAQ,aAChBP,EAAMgN,GAAehN,IAEA,MAAlBA,EAAID,OAAO,OACd+jB,EAAKlkB,GAAeilB,EAAa7kB,IAAQ2I,GAAQkc,IAAgB,KAChD,IAAPf,IACT9jB,EAAM8jB,MAIJa,GAAYE,IAAgB7kB,GAAOwkB,UAClCpa,MAAMya,EAAc7kB,IAAgB,KAARA,GAMhC4kB,GAAkBtV,KAAQhR,GAAWf,EAAe+R,EAAMtP,GAxE7B,SAA7BklB,2BAAsC5mB,EAAQgR,EAAMzP,EAAOG,EAAK8kB,EAAQL,EAAcC,OAIvFtT,EAAQ+T,EAAW7T,EAAO8T,EAAQC,EAAOC,EAAUC,EAAW5kB,EAH3DmjB,EAAK,IAAIrU,GAAUmN,KAAKzV,IAAK7I,EAAQgR,EAAM,EAAG,EAAGkW,GAAsB,KAAMV,GAChF/X,EAAQ,EACR0Y,EAAa,MAEd3B,EAAGpY,EAAI7L,EACPikB,EAAGS,EAAIvkB,EACPH,GAAS,IAEJ0lB,IADLvlB,GAAO,IACeO,QAAQ,cAC7BP,EAAMgN,GAAehN,IAElBykB,IAEHA,EADA9jB,EAAI,CAACd,EAAOG,GACI1B,EAAQgR,GACxBzP,EAAQc,EAAE,GACVX,EAAMW,EAAE,IAETwkB,EAAYtlB,EAAM6B,MAAMuV,KAAyB,GACzC7F,EAAS6F,GAAqBpO,KAAK7I,IAC1ColB,EAAShU,EAAO,GAChBiU,EAAQrlB,EAAI4S,UAAU7F,EAAOqE,EAAOrE,OAChCuE,EACHA,GAASA,EAAQ,GAAK,EACS,UAArB+T,EAAMnlB,QAAQ,KACxBoR,EAAQ,GAEL8T,IAAWD,EAAUM,OACxBH,EAAWrlB,WAAWklB,EAAUM,EAAW,KAAO,EAElD3B,EAAG3c,IAAM,CACR1D,MAAOqgB,EAAG3c,IACVrF,EAAIujB,GAAwB,IAAfI,EAAoBJ,EAAQ,IACzCnY,EAAGoY,EACHxU,EAAwB,MAArBsU,EAAOrlB,OAAO,GAAaH,GAAe0lB,EAAUF,GAAUE,EAAWrlB,WAAWmlB,GAAUE,EACjGI,EAAIpU,GAASA,EAAQ,EAAK7R,KAAKC,MAAQ,GAExCqN,EAAQkK,GAAqBrF,kBAG/BkS,EAAGhT,EAAK/D,EAAQ/M,EAAItB,OAAUsB,EAAI4S,UAAU7F,EAAO/M,EAAItB,QAAU,GACjEolB,EAAG6B,GAAKjB,GACJxN,GAAQrF,KAAK7R,IAAQulB,KACxBzB,EAAGS,EAAI,QAEHpd,IAAM2c,GA4BwBtL,KAAKoE,KAAMte,EAAQgR,EAAMuV,EAAa7kB,EAAK8kB,EAAQL,GAAgB5O,EAAQ4O,aAAcC,KAN1HZ,EAAK,IAAIrU,GAAUmN,KAAKzV,IAAK7I,EAAQgR,GAAOuV,GAAe,EAAG7kB,GAAO6kB,GAAe,GAA6B,kBAAlBD,EAA8BgB,GAAiBC,GAAc,EAAGf,GAC/JJ,IAAcZ,EAAG6B,GAAKjB,GACtBhW,GAAYoV,EAAGpV,SAASA,EAAUkO,KAAMte,GAChCse,KAAKzV,IAAM2c,IAmCtB5c,GAAa,SAAbA,WAAczG,EAAOS,EAAM+F,OAWzB6e,EAAWznB,EAAGyD,EAAGgiB,EAAIxlB,EAAQynB,EAAaC,EAAQxnB,EAASqlB,EAAQE,EAAUhX,EAAOkZ,EAAaC,EAV9F1jB,EAAO/B,EAAM+B,KACdsH,EAAiItH,EAAjIsH,KAAMtB,EAA2HhG,EAA3HgG,QAAS9D,EAAkHlC,EAAlHkC,gBAAiB0C,EAAiG5E,EAAjG4E,KAAM+Z,EAA2F3e,EAA3F2e,SAAUgF,EAAiF3jB,EAAjF2jB,eAAgB9M,EAAiE7W,EAAjE6W,cAAe9Q,EAAkD/F,EAAlD+F,aAAc2K,EAAoC1Q,EAApC0Q,SAAUvQ,EAA0BH,EAA1BG,UAAWgC,EAAenC,EAAfmC,WACpHkD,EAAMpH,EAAM0D,KACZiiB,EAAc3lB,EAAMc,SACpBpD,EAAUsC,EAAM+hB,SAChB/f,EAAShC,EAAMgC,OAEf4jB,EAAe5jB,GAA0B,WAAhBA,EAAOkV,KAAqBlV,EAAOD,KAAKrE,QAAUA,EAC3EmoB,EAAsC,SAArB7lB,EAAM8lB,aAA2B/R,EAClDmO,EAAKliB,EAAMsF,aAEZ4c,GAAQhgB,GAAcmH,IAAUA,EAAO,QACvCrJ,EAAM2S,MAAQrJ,GAAWD,EAAMqM,EAAUrM,MACzCrJ,EAAM4S,OAASH,EAAWtH,GAAY7B,IAAwB,IAAbmJ,EAAoBpJ,EAAOoJ,EAAUiD,EAAUrM,OAAS,EACrGoJ,GAAYzS,EAAM0S,QAAU1S,EAAMoE,UACrCqO,EAAWzS,EAAM4S,OACjB5S,EAAM4S,OAAS5S,EAAM2S,MACrB3S,EAAM2S,MAAQF,GAEfzS,EAAM+lB,OAAS7D,KAAQngB,EAAK+F,cACvBoa,GAAOhgB,IAAcH,EAAKod,QAAU,IAExCqG,GADAznB,EAAUL,EAAQ,GAAKW,GAAUX,EAAQ,IAAIK,QAAU,IAC9BgE,EAAKhE,EAAQ8Q,MACtCwW,EAAY1jB,GAAeI,EAAM+M,IAC7B6W,IACHA,EAAYlgB,OAAS,GAAKkgB,EAAYvY,SAAS,GAC9C3M,EAAO,GAAKqH,GAAgB7D,IAAoBC,EAAcyhB,EAAYrlB,QAAQ,GAAG,GAAQqlB,EAAY5hB,OAAO+D,GAAgBV,EAAMpD,GAAsB0S,IAE7JiP,EAAYtlB,MAAQ,GAEjB0H,MACH5E,GAAkBnD,EAAMc,SAAWkH,GAAMoU,IAAI1e,EAAS4D,GAAa,CAAC4V,KAAM,UAAWvB,WAAW,EAAO3T,OAAQA,EAAQiC,iBAAiB,EAAM0C,MAAOgf,GAAevpB,EAAYuK,GAAOoB,QAAS,KAAM6N,MAAO,EAAG8K,SAAUA,EAAUgF,eAAgBA,EAAgB9M,cAAeA,EAAeuG,QAAS,GAAIpX,KAC/S/H,EAAMc,SAASyB,IAAM,EACrBvC,EAAMc,SAASqc,KAAOnd,EACrBS,EAAO,IAAMG,IAAgBqD,IAAoBC,IAAiBlE,EAAMc,SAASiD,OAAOC,IACrFC,GACCmD,GAAO3G,GAAQ,GAAK+F,GAAS,cAChC/F,IAAST,EAAMyF,OAAShF,SAIpB,GAAIqH,GAAgBV,IAErBue,KACJllB,IAASwD,GAAkB,GAC3B5C,EAAIC,GAAa,CAChBqU,WAAW,EACXuB,KAAM,cACNvQ,KAAM1C,IAAoB0hB,GAAevpB,EAAYuK,GACrD1C,gBAAiBA,EACjBkb,QAAS,EACTnd,OAAQA,GACNqjB,GACHG,IAAgBnkB,EAAEtD,EAAQ8Q,MAAQ2W,GAClCriB,GAAkBnD,EAAMc,SAAWkH,GAAMoU,IAAI1e,EAAS2D,IACtDrB,EAAMc,SAASyB,IAAM,EACrBvC,EAAMc,SAASqc,KAAOnd,EACrBS,EAAO,IAAOG,EAAaZ,EAAMc,SAASiD,OAAOC,IAAuBhE,EAAMc,SAASR,QAAQ,GAAG,IACnGN,EAAMyF,OAAShF,EACVwD,GAEE,IAAKxD,cADXgG,WAAWzG,EAAMc,SAAUmE,EAAUA,OAMxCjF,EAAM0G,IAAM1G,EAAMgmB,SAAW,EAC7Brf,EAAQS,GAAOhL,EAAYuK,IAAWA,IAASS,EAC1CxJ,EAAI,EAAGA,EAAIF,EAAQO,OAAQL,IAAK,IAEpC2nB,GADA1nB,EAASH,EAAQE,IACDE,OAASL,GAASC,GAASE,GAAGE,MAC9CkC,EAAMwc,UAAU5e,GAAK0lB,EAAW,GAChCljB,GAAYmlB,EAAOrJ,KAAOjc,GAAYhC,QAAU8B,KAChDuM,EAAQsZ,IAAgBloB,EAAUE,EAAIgoB,EAAY9lB,QAAQjC,GACtDE,IAA0G,KAA9FqlB,EAAS,IAAIrlB,GAAW2P,KAAK7P,EAAQ2nB,GAAeH,EAAWrlB,EAAOsM,EAAOsZ,KAC5F5lB,EAAM0G,IAAM2c,EAAK,IAAIrU,GAAUhP,EAAM0G,IAAK7I,EAAQulB,EAAO9lB,KAAM,EAAG,EAAG8lB,EAAO9iB,OAAQ8iB,EAAQ,EAAGA,EAAOM,UACtGN,EAAOzV,OAAO7O,QAAQ,SAAAxB,GAASgmB,EAAShmB,GAAQ+lB,IAChDD,EAAOM,WAAa4B,EAAc,KAE9BvnB,GAAWynB,MACVnkB,KAAKgkB,EACL1W,GAAStN,KAAO+hB,EAASD,GAAa9hB,EAAGgkB,EAAWrlB,EAAOsM,EAAOzO,EAAQ+nB,IAC7ExC,EAAOM,WAAa4B,EAAc,GAElChC,EAASjiB,GAAKgiB,EAAKtV,GAAcgK,KAAK/X,EAAOnC,EAAQwD,EAAG,MAAOgkB,EAAUhkB,GAAIiL,EAAOsZ,EAAa,EAAG7jB,EAAKiiB,cAI5GhkB,EAAMimB,KAAOjmB,EAAMimB,IAAIroB,IAAMoC,EAAMmN,KAAKtP,EAAQmC,EAAMimB,IAAIroB,IACtDioB,GAAiB7lB,EAAM0G,MAC1Bib,GAAoB3hB,EACpBiC,EAAgBof,aAAaxjB,EAAQylB,EAAUtjB,EAAMkd,WAAWzc,IAChEglB,GAAezlB,EAAMgC,OACrB2f,GAAoB,GAErB3hB,EAAM0G,KAAOC,IAASvG,GAAYmlB,EAAOrJ,IAAM,GAEhDoJ,GAAeY,GAA0BlmB,GACzCA,EAAMmmB,SAAWnmB,EAAMmmB,QAAQnmB,GAEhCA,EAAMke,UAAYwC,EAClB1gB,EAAMa,WAAab,EAAMimB,KAAOjmB,EAAM0G,OAAS+e,EAC9CvjB,GAAazB,GAAQ,GAAMyhB,EAAG5hB,OAAOsK,GAAS,GAAM,IAyEtD4Y,GAAqB,SAArBA,mBAAsBznB,EAAOiE,EAAOpC,EAAGC,EAAQH,UAAa1B,EAAYD,GAASA,EAAMgc,KAAK/X,EAAOpC,EAAGC,EAAQH,GAAY5B,EAAUC,KAAWA,EAAM+D,QAAQ,WAAcyM,GAAexQ,GAASA,GACnMqqB,GAAqBrP,GAAiB,4DACtCsP,GAAsB,GACvB3nB,GAAa0nB,GAAqB,kDAAmD,SAAA9oB,UAAQ+oB,GAAoB/oB,GAAQ,QA8B5G0K,8BAEAtK,EAASqE,EAAM4D,EAAU2gB,SACf,iBAAVvkB,IACV4D,EAASpB,SAAWxC,EACpBA,EAAO4D,EACPA,EAAW,UAMXuc,EAAItkB,EAAGiE,EAAMhC,EAAGwB,EAAGklB,EAAWC,EAAaC,mBAJtCH,EAAcvkB,EAAOD,GAAiBC,WACsEA,KAA5GwC,IAAAA,SAAUqR,IAAAA,MAAO3R,IAAAA,gBAAiBkb,IAAAA,QAASxJ,IAAAA,UAAWzT,IAAAA,UAAWX,IAAAA,SAAU2L,IAAAA,cAAeuF,IAAAA,SAC/FzQ,EAASD,EAAKC,QAAUC,EACxB4f,GAAiBxf,EAAS3E,IAAY0Y,EAAc1Y,GAAWzB,EAAUyB,EAAQ,IAAO,WAAYqE,GAAS,CAACrE,GAAWY,GAAQZ,QAE7HqkB,SAAWF,EAAc5jB,OAASR,GAASokB,GAAiB3kB,EAAM,eAAiBQ,EAAU,qCAAsC0X,EAAQG,iBAAmB,KAC9JiH,UAAY,KACZsJ,WAAanQ,EACdzT,GAAaid,GAAW5iB,EAAgBgI,IAAahI,EAAgBqZ,GAAQ,IAChF7T,EAAO2kB,EAAK3kB,MACZmgB,EAAKwE,EAAKphB,SAAW,IAAIiC,GAAS,CAAC2P,KAAM,SAAU3V,SAAUA,GAAY,GAAI7D,QAASsE,GAA0B,WAAhBA,EAAOkV,KAAoBlV,EAAOD,KAAKrE,QAAUmkB,KAC9I1U,OACH+U,EAAGlgB,OAASkgB,EAAG3f,8BACf2f,EAAGve,OAAS,EACRwb,GAAW5iB,EAAgBgI,IAAahI,EAAgBqZ,GAAQ,IACnE/V,EAAIgiB,EAAc5jB,OAClBuoB,EAAcrH,GAAWhW,GAAWgW,GAChChjB,EAAUgjB,OACR9d,KAAK8d,GACJiH,GAAmBtmB,QAAQuB,MACRolB,EAAvBA,GAA4C,IACzBplB,GAAK8d,EAAQ9d,QAI9BzD,EAAI,EAAGA,EAAIiC,EAAGjC,KAClBiE,EAAOF,GAAeI,EAAMskB,KACvBlH,QAAU,EACf1M,IAAa5Q,EAAK4Q,SAAWA,GAC7BgU,GAAsB9pB,GAAOkF,EAAM4kB,GACnCF,EAAY1E,EAAcjkB,GAE1BiE,EAAK0C,UAAYif,GAAmBjf,4BAAgB3G,EAAG2oB,EAAW1E,GAClEhgB,EAAK+T,QAAU4N,GAAmB5N,4BAAahY,EAAG2oB,EAAW1E,IAAkB,GAAK6E,EAAK5gB,QACpFqZ,GAAiB,IAANtf,GAAWgC,EAAK+T,UAC1B9P,OAAS8P,EAAQ/T,EAAK+T,QACtBjS,QAAUiS,EACf/T,EAAK+T,MAAQ,GAEdsM,EAAGrD,GAAG0H,EAAW1kB,EAAM2kB,EAAcA,EAAY5oB,EAAG2oB,EAAW1E,GAAiB,GAChFK,EAAGvP,MAAQpB,GAASuK,KAErBoG,EAAG3d,WAAcA,EAAWqR,EAAQ,EAAM8Q,EAAKphB,SAAW,OACpD,GAAIpD,EAAW,CACrBJ,GAAiBR,GAAa4gB,EAAGngB,KAAKR,SAAU,CAAC8H,KAAK,UACtD6Y,EAAGvP,MAAQrJ,GAAWpH,EAAUmH,MAAQtH,EAAKsH,MAAQ,YAEpDnJ,EAAGymB,EAAInoB,EADJiC,EAAO,KAEP4B,EAASH,GACZA,EAAUpD,QAAQ,SAAAgI,UAASob,EAAGrD,GAAGgD,EAAe/a,EAAO,OACvDob,EAAG3d,eACG,KAEDlD,KADLQ,EAAO,GACGK,EACH,SAANb,GAAsB,aAANA,GAAoBsiB,GAAetiB,EAAGa,EAAUb,GAAIQ,EAAMK,EAAU2hB,cAEhFxiB,KAAKQ,MACT3B,EAAI2B,EAAKR,GAAG4H,KAAK,SAAC/I,EAAG+K,UAAM/K,EAAE2C,EAAIoI,EAAEpI,IAE9BjF,EADL6C,EAAO,EACK7C,EAAIsC,EAAEjC,OAAQL,KAEzBY,EAAI,CAAC6K,MADLsd,EAAKzmB,EAAEtC,IACOkmB,EAAGvf,UAAWoiB,EAAG9jB,GAAKjF,EAAIsC,EAAEtC,EAAI,GAAGiF,EAAI,IAAM,IAAM0B,IAC/DlD,GAAKslB,EAAGnoB,EACV0jB,EAAGrD,GAAGgD,EAAerjB,EAAGiC,GACxBA,GAAQjC,EAAE+F,SAGZ2d,EAAG3d,WAAaA,GAAY2d,EAAGrD,GAAG,GAAI,CAACta,SAAUA,EAAW2d,EAAG3d,cAGjEA,GAAYmiB,EAAKniB,SAAUA,EAAW2d,EAAG3d,mBAGpCe,SAAW,SAGC,IAAdqQ,GAAuB5B,IAC1B4N,6BACA1f,EAAgBof,aAAaQ,GAC7BF,GAAoB,GAErBjc,GAAe1D,4BAAc2D,GAC7B5D,EAAK2b,UAAYgJ,EAAK/I,UACtB5b,EAAK+a,QAAU4J,EAAK5J,QAAO,IACvB7Y,IAAqBM,IAAarC,GAAawkB,EAAK/iB,SAAWzE,GAAc8C,EAAOoD,QAAUhJ,EAAY6H,IAlpEvF,SAAxB2iB,sBAAwBpmB,UAAcA,GAAcA,EAAUmE,KAAOiiB,sBAAsBpmB,EAAUwB,QAkpE8B4kB,6BAA+C,WAAhB5kB,EAAOkV,UAClK5S,QAAUW,IACV3E,OAAOtB,KAAKuL,IAAI,GAAIqL,IAAU,IAEpC1I,GAAiB/G,6BAAqB+G,4DAGvC5M,OAAA,gBAAOwD,EAAWpD,EAAgBC,OAMhCF,EAAM4iB,EAAI1G,EAAW3F,EAAe6I,EAAetN,EAAQmK,EAAOpX,EAAUmN,EALzEqN,EAAW3D,KAAK/W,MACnB2a,EAAO5D,KAAKtX,MACZuC,EAAM+U,KAAKzY,KACXmjB,EAAa/iB,EAAY,EACzB0C,EAAqBuZ,EAAO9a,EAAnBnB,IAAgC+iB,EAAc9G,EAAQjc,EAAYmB,EAAY,EAAInB,KAEvFsD,GAEE,GAAIZ,IAAU2V,KAAK7X,SAAWR,GAAanD,IAAWwb,KAAKtb,UAAYsb,KAAK7X,QAAY6X,KAAKrb,UAAaqb,KAAK1W,OAAS,GAAOohB,EAAa,IAClJpmB,EAAO+F,EACPlB,EAAW6W,KAAK7W,SACZ6W,KAAK/X,QAAS,IACjB4S,EAAgB5P,EAAM+U,KAAK3X,QACvB2X,KAAK/X,SAAW,GAAKyiB,SACjB1K,KAAKrY,UAA0B,IAAhBkT,EAAsBlT,EAAWpD,EAAgBC,MAExEF,EAAOvB,GAAcsH,EAAQwQ,GACzBxQ,IAAUuZ,GACbpD,EAAYR,KAAK/X,QACjB3D,EAAO2G,KAEPuV,KAAenW,EAAQwQ,KACN2F,IAAcnW,EAAQwQ,IACtCvW,EAAO2G,EACPuV,KAEMvV,EAAP3G,IAAeA,EAAO2G,KAEvBmL,EAAS4J,KAAKzJ,OAAsB,EAAZiK,KAEvBlK,EAAW0J,KAAKvJ,OAChBnS,EAAO2G,EAAM3G,GAEdof,EAAgBxb,GAAgB8X,KAAK7X,OAAQ0S,GACzCvW,IAASqf,IAAanf,GAASwb,KAAKtb,qBAElCyD,OAASkC,EACP2V,KAEJQ,IAAckD,IACjBva,GAAY6W,KAAKvJ,QAAUN,GAAmBhN,EAAUiN,IAEpD4J,KAAKpa,KAAKqe,eAAkB7N,GAAW4J,KAAK8D,aAC1CA,MAAQtf,EAAQ,OAChBL,OAAOpB,GAAc8X,EAAgB2F,IAAY,GAAMoB,aAAakC,MAAQ,QAK/E9D,KAAKtb,SAAU,IACf0F,GAAkB4V,KAAM0K,EAAa/iB,EAAYrD,EAAME,EAAOD,EAAgB8F,eAC5ElC,OAAS,EACP6X,QAEJ2D,IAAa3D,KAAK/W,aACd+W,QAEJ/U,IAAQ+U,KAAKzY,YACTyY,KAAK7b,OAAOwD,EAAWpD,EAAgBC,WAI3C2D,OAASkC,OACTpB,MAAQ3E,GAER0b,KAAK5Y,MAAQ4Y,KAAKxX,WACjBpB,KAAO,OACPlD,MAAQ,QAGTqc,MAAQA,GAASjK,GAAY0J,KAAKxJ,OAAOlS,EAAO2G,GACjD+U,KAAK4J,aACHrJ,MAAQA,EAAQ,EAAIA,GAGtBjc,IAASqf,IAAapf,IAAmBic,IAC5CtP,GAAU8O,KAAM,WACZA,KAAK7X,SAAWkC,UACZ2V,SAGTkH,EAAKlH,KAAKzV,IACH2c,GACNA,EAAG3T,EAAEgN,EAAO2G,EAAGhZ,GACfgZ,EAAKA,EAAGrgB,MAERsC,GAAYA,EAAShF,OAAOwD,EAAY,EAAIA,GAAarD,GAAQ8R,GAAUtN,EAAWK,EAAS5B,KAAO4B,EAASqN,MAAMlS,EAAO0b,KAAKzY,MAAOhD,EAAgBC,IAAYwb,KAAKrb,WAAaqb,KAAK1W,OAAS3B,GAEjMqY,KAAK+B,YAAcxd,IACtBmmB,GAAchjB,GAAesY,KAAMrY,EAAWpD,EAAgBC,GAC9D0M,GAAU8O,KAAM,kBAGZ/X,SAAWuY,IAAckD,GAAiB1D,KAAKpa,KAAKse,WAAa3f,GAAkByb,KAAKna,QAAUqL,GAAU8O,KAAM,YAElH3V,IAAU2V,KAAKtX,OAAU2B,GAAU2V,KAAK7X,SAAWkC,IACvDqgB,IAAe1K,KAAK+B,WAAara,GAAesY,KAAMrY,EAAW,GAAM,IACtEA,GAAcsD,KAAUZ,IAAU2V,KAAKtX,OAAoB,EAAXsX,KAAKxX,MAAc6B,GAAS2V,KAAKxX,IAAM,IAAOxB,GAAkBgZ,KAAM,GAC/Gzb,GAAoBmmB,IAAe/G,KAActZ,GAASsZ,GAAYvN,KAC7ElF,GAAU8O,KAAO3V,IAAUuZ,EAAO,aAAe,qBAAsB,SAClErB,OAAWlY,EAAQuZ,GAA2B,EAAnB5D,KAAKpW,aAAoBoW,KAAKuC,gBArrEvC,SAA3BoI,yBAA4B9mB,EAAO8D,EAAWpD,EAAgBC,OAK5D0iB,EAAI1G,EAAWkD,EAJZkH,EAAY/mB,EAAM0c,MACrBA,EAAQ5Y,EAAY,IAAOA,KAAgB9D,EAAM2D,QAJpB,SAA/BqjB,oCAAiChlB,IAAAA,cAAYA,GAAUA,EAAO2C,KAAO3C,EAAOnB,WAAamB,EAAOie,QAAUje,EAAOuD,UAAY,GAAKyhB,6BAA6BhlB,IAIlGglB,CAA6BhnB,KAAaA,EAAMa,WAAYoF,GAAmBjG,MAAcA,EAAM2E,IAAM,GAAK3E,EAAMuC,IAAIoC,IAAM,KAAOsB,GAAmBjG,IAAY,EAAI,EACnOod,EAAcpd,EAAMwE,QACpBgC,EAAQ,KAEL4W,GAAepd,EAAMoE,UACxBoC,EAAQhB,GAAO,EAAGxF,EAAM6E,MAAOf,GAC/B6Y,EAAYtY,GAAgBmC,EAAO4W,GACnCpd,EAAM0S,OAAsB,EAAZiK,IAAmBD,EAAQ,EAAIA,GAC3CC,IAActY,GAAgBrE,EAAMsE,OAAQ8Y,KAC/C2J,EAAY,EAAIrK,EAChB1c,EAAM+B,KAAKqe,eAAiBpgB,EAAMa,UAAYb,EAAM+d,eAGlDrB,IAAUqK,GAAanmB,GAAcD,GAASX,EAAMyF,SAAWR,IAAcnB,GAAa9D,EAAMyF,OAAS,KACvGzF,EAAMa,UAAY0F,GAAkBvG,EAAO8D,EAAWnD,EAAOD,EAAgB8F,cAGlFqZ,EAAgB7f,EAAMyF,OACtBzF,EAAMyF,OAAS3B,IAAcpD,EAAiBuE,EAAW,GACtCvE,EAAnBA,GAAoCoD,IAAc+b,EAClD7f,EAAM0c,MAAQA,EACd1c,EAAM+lB,QAAUrJ,EAAQ,EAAIA,GAC5B1c,EAAMoF,MAAQ,EACdpF,EAAMsE,OAASkC,EACf6c,EAAKrjB,EAAM0G,IACJ2c,GACNA,EAAG3T,EAAEgN,EAAO2G,EAAGhZ,GACfgZ,EAAKA,EAAGrgB,MAETc,EAAY,GAAKD,GAAe7D,EAAO8D,EAAWpD,GAAgB,GAClEV,EAAMke,YAAcxd,GAAkB2M,GAAUrN,EAAO,YACvDwG,GAASxG,EAAMoE,UAAY1D,GAAkBV,EAAMgC,QAAUqL,GAAUrN,EAAO,aACzE8D,GAAa9D,EAAM6E,OAASf,EAAY,IAAM9D,EAAM0c,QAAUA,IAClEA,GAASvZ,GAAkBnD,EAAO,GAC7BU,GAAmBE,IACvByM,GAAUrN,EAAQ0c,EAAQ,aAAe,qBAAsB,GAC/D1c,EAAM0e,OAAS1e,EAAM0e,eAGZ1e,EAAMyF,SACjBzF,EAAMyF,OAAS3B,GA8iEfgjB,CAAyB3K,KAAMrY,EAAWpD,EAAgBC,UAkGpDwb,QAGRze,QAAA,0BACQye,KAAK4F,YAGbhE,WAAA,oBAAWgF,UACRA,GAAS5G,KAAKpa,KAAK+F,eAAkBqU,KAAKrb,SAAW,QAClD4F,IAAMyV,KAAK8J,IAAM9J,KAAK+B,UAAY/B,KAAK9b,MAAQ8b,KAAKO,MAAQ,OAC5DF,UAAY,QACZlX,UAAY6W,KAAK7W,SAASyY,WAAWgF,eAC7BhF,qBAAWgF,MAGzBkE,QAAA,iBAAQlqB,EAAUhB,EAAOqD,EAAO8nB,GAC/B9S,GAAiBvN,GAAQwT,YACpB1V,KAAOwX,KAAKsB,WAEhBf,EADGjc,EAAOzB,KAAKwL,IAAI2R,KAAKzY,MAAOyY,KAAK5Z,IAAI6C,MAAQ+W,KAAKxY,QAAUwY,KAAKxX,iBAEhE9D,UAAY4F,GAAW0V,KAAM1b,GAClCic,EAAQP,KAAKxJ,MAAMlS,EAAO0b,KAAKzY,MA1UZ,SAApByjB,kBAAqBnnB,EAAOjD,EAAUhB,EAAOqD,EAAO8nB,EAAiBxK,EAAOjc,OAE1E4iB,EAAI+D,EAAQC,EAAQzpB,EADjB0pB,GAAYtnB,EAAM0G,KAAO1G,EAAMgmB,WAAchmB,EAAMgmB,SAAW,KAAKjpB,OAElEuqB,MACJA,EAAUtnB,EAAMgmB,SAASjpB,GAAY,GACrCsqB,EAASrnB,EAAMwc,UACf5e,EAAIoC,EAAM+hB,SAAS9jB,OACZL,KAAK,KACXylB,EAAKgE,EAAOzpB,GAAGb,KACLsmB,EAAGhZ,GAAKgZ,EAAGhZ,EAAE3D,QACtB2c,EAAKA,EAAGhZ,EAAE3D,IACH2c,GAAMA,EAAGhiB,IAAMtE,GAAYsmB,EAAG6B,KAAOnoB,GAC3CsmB,EAAKA,EAAGrgB,UAGLqgB,SAEJU,GAAsB,EACtB/jB,EAAM+B,KAAKhF,GAAY,MACvB0J,GAAWzG,EAAOS,GAClBsjB,GAAsB,EACf,EAERuD,EAAQvgB,KAAKsc,OAGfzlB,EAAI0pB,EAAQrpB,OACLL,MAENylB,GADA+D,EAASE,EAAQ1pB,IACL8I,KAAO0gB,GAChB3a,GAAKrN,GAAmB,IAAVA,GAAiB8nB,EAA0B7D,EAAG5W,GAAKrN,GAAS,GAAKsd,EAAQ2G,EAAGhT,EAAzCjR,EACpDikB,EAAGhT,EAAItU,EAAQsnB,EAAG5W,EAClB2a,EAAOtD,IAAMsD,EAAOtD,EAAI/kB,GAAOhD,GAASmM,GAAQkf,EAAOtD,IACvDsD,EAAOnc,IAAMmc,EAAOnc,EAAIoY,EAAG5W,EAAIvE,GAAQkf,EAAOnc,IAkT1Ckc,CAAkBhL,KAAMpf,EAAUhB,EAAOqD,EAAO8nB,EAAiBxK,EAAOjc,GACpE0b,KAAK8K,QAAQlqB,EAAUhB,EAAOqD,EAAO8nB,IAG9ChiB,GAAeiX,KAAM,QAChBna,QAAUQ,GAAmB2Z,KAAK5Z,IAAK4Z,KAAM,SAAU,QAASA,KAAK5Z,IAAIyD,MAAQ,SAAW,GAC1FmW,KAAK7b,OAAO,OAGpB6M,KAAA,cAAKzP,EAASqE,eAAAA,IAAAA,EAAO,SACfrE,GAAaqE,GAAiB,QAATA,eACpB1B,MAAQ8b,KAAKzV,IAAM,EACjByV,KAAKna,OAASiL,GAAWkP,MAAQA,QAErCA,KAAK7W,SAAU,KACdya,EAAO5D,KAAK7W,SAASV,4BACpBU,SAAS+b,aAAa3jB,EAASqE,EAAM4f,KAA0D,IAArCA,GAAkB5f,KAAK4T,WAAoBnD,QAAUvF,GAAWkP,WAC1Hna,QAAU+d,IAAS5D,KAAK7W,SAASV,iBAAmBoC,GAAamV,KAAMA,KAAKzY,KAAOyY,KAAK7W,SAAST,MAAQkb,EAAM,EAAG,GAChH5D,SAMPoL,EAAkBC,EAAWC,EAAmBjG,EAAOngB,EAAGgiB,EAAIzlB,EAJ3DikB,EAAgB1F,KAAK4F,SACxB2F,EAAiBhqB,EAAUY,GAAQZ,GAAWmkB,EAC9C8F,EAAkBxL,KAAKK,UACvBoL,EAAUzL,KAAKzV,SAEV3E,GAAiB,QAATA,IAh4EA,SAAf8lB,aAAgBC,EAAIC,WACfnqB,EAAIkqB,EAAG7pB,OACVgD,EAAQrD,IAAMmqB,EAAG9pB,OACXgD,GAASrD,KAAOkqB,EAAGlqB,KAAOmqB,EAAGnqB,YAC7BA,EAAI,EA43EsBiqB,CAAahG,EAAe6F,SACnD,QAAT3lB,IAAmBoa,KAAKzV,IAAM,GACvBuG,GAAWkP,UAEnBoL,EAAmBpL,KAAK8J,IAAM9J,KAAK8J,KAAO,GAC7B,QAATlkB,IACCjG,EAAUiG,KACbV,EAAI,GACJ3C,GAAaqD,EAAM,SAAAzE,UAAQ+D,EAAE/D,GAAQ,IACrCyE,EAAOV,GAERU,EAnVkB,SAApBimB,kBAAqBtqB,EAASqE,OAG5BF,EAAMR,EAAGzD,EAAG4Q,EAFTzQ,EAAUL,EAAQ,GAAKW,GAAUX,EAAQ,IAAIK,QAAU,EAC1DkqB,EAAmBlqB,GAAWA,EAAQyQ,YAElCyZ,SACGlmB,MAGHV,KADLQ,EAAOlF,GAAO,GAAIoF,GACRkmB,KACL5mB,KAAKQ,MAERjE,GADA4Q,EAAUyZ,EAAgB5mB,GAAGxC,MAAM,MACvBZ,OACNL,KACLiE,EAAK2M,EAAQ5Q,IAAMiE,EAAKR,UAKpBQ,EAiUCmmB,CAAkBnG,EAAe9f,IAEzCnE,EAAIikB,EAAc5jB,OACXL,SACD8pB,EAAe5nB,QAAQ+hB,EAAcjkB,QAUpCyD,KATLmmB,EAAYG,EAAgB/pB,GACf,QAATmE,GACHwlB,EAAiB3pB,GAAKmE,EACtByf,EAAQgG,EACRC,EAAoB,KAEpBA,EAAoBF,EAAiB3pB,GAAK2pB,EAAiB3pB,IAAM,GACjE4jB,EAAQzf,GAECyf,GACT6B,EAAKmE,GAAaA,EAAUnmB,MAErB,SAAUgiB,EAAGhZ,IAAuB,IAAjBgZ,EAAGhZ,EAAE8C,KAAK9L,IAClC4B,GAAsBkZ,KAAMkH,EAAI,cAE1BmE,EAAUnmB,IAEQ,QAAtBomB,IACHA,EAAkBpmB,GAAK,eAKtBR,WAAasb,KAAKzV,KAAOkhB,GAAW3a,GAAWkP,MAC7CA,YAID0C,GAAP,YAAUnhB,EAASqE,EAAnB,UACQ,IAAIiG,MAAMtK,EAASqE,EAD3B,UAIOwH,KAAP,cAAY7L,EAASqE,UACbyF,GAAiB,EAAG+U,kBAGrB0C,YAAP,qBAAmBrJ,EAAO4C,EAAU9Q,EAAQjL,UACpC,IAAIuL,MAAMwQ,EAAU,EAAG,CAACvU,iBAAgB,EAAO0C,MAAK,EAAOgP,WAAU,EAAOC,MAAMA,EAAO0J,WAAW9G,EAAU0P,kBAAkB1P,EAAU+G,iBAAiB7X,EAAQygB,wBAAwBzgB,EAAQkR,cAAcnc,WAGlNqiB,OAAP,gBAAcphB,EAASqhB,EAAUC,UACzBxX,GAAiB,EAAG+U,kBAGrBH,IAAP,aAAW1e,EAASqE,UACnBA,EAAKwC,SAAW,EAChBxC,EAAKqb,cAAgBrb,EAAKoF,OAAS,GAC5B,IAAIa,MAAMtK,EAASqE,UAGpBsf,aAAP,sBAAoB3jB,EAAS8jB,EAAOC,UAC5Bxf,EAAgBof,aAAa3jB,EAAS8jB,EAAOC,WAvU3BpF,IA2U3B/a,GAAa0G,GAAM4G,UAAW,CAACmT,SAAS,GAAI1hB,MAAM,EAAGS,SAAS,EAAGmlB,IAAI,EAAGE,QAAQ,IAWhFznB,GAAa,sCAAuC,SAAApB,GACnD0K,GAAM1K,GAAQ,eACT4kB,EAAK,IAAI3a,GACZG,EAASgQ,GAAOK,KAAKwE,UAAW,UACjC7U,EAAOtJ,OAAgB,kBAATd,EAA2B,EAAI,EAAG,EAAG,GAC5C4kB,EAAG5kB,GAAMkU,MAAM0Q,EAAIxa,MA2BR,SAAnB0gB,GAAoBvqB,EAAQd,EAAUhB,UAAU8B,EAAOwqB,aAAatrB,EAAUhB,GAkDxD,SAAtBusB,GAAuBzqB,EAAQd,EAAUhB,EAAOmb,GAC/CA,EAAKqR,KAAK1qB,EAAQd,EAAUma,EAAK+N,EAAElN,KAAKb,EAAKlX,MAAOjE,EAAOmb,EAAKsR,IAAKtR,GAtDvE,IAAIsN,GAAe,SAAfA,aAAgB3mB,EAAQd,EAAUhB,UAAU8B,EAAOd,GAAYhB,GAClEwoB,GAAc,SAAdA,YAAe1mB,EAAQd,EAAUhB,UAAU8B,EAAOd,GAAUhB,IAC5DuoB,GAAuB,SAAvBA,qBAAwBzmB,EAAQd,EAAUhB,EAAOmb,UAASrZ,EAAOd,GAAUma,EAAKgO,GAAInpB,IAEpFwS,GAAa,SAAbA,WAAc1Q,EAAQd,UAAaf,EAAY6B,EAAOd,IAAawnB,GAAcroB,EAAa2B,EAAOd,KAAcc,EAAOwqB,aAAeD,GAAmB5D,IAC5JY,GAAe,SAAfA,aAAgB1I,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAGrC,KAAKC,MAAkC,KAA3BiY,EAAKzK,EAAIyK,EAAK7G,EAAIqM,IAAoB,IAASxF,IACpHiO,GAAiB,SAAjBA,eAAkBzI,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,KAAM6V,EAAKzK,EAAIyK,EAAK7G,EAAIqM,GAAQxF,IACxF6N,GAAuB,SAAvBA,qBAAgCrI,EAAOxF,OAClCmM,EAAKnM,EAAKxQ,IACb+F,EAAI,OACAiQ,GAASxF,EAAKjM,EAClBwB,EAAIyK,EAAKjM,OACH,GAAc,IAAVyR,GAAexF,EAAK4M,EAC9BrX,EAAIyK,EAAK4M,MACH,MACCT,GACN5W,EAAI4W,EAAGhiB,GAAKgiB,EAAG4B,EAAI5B,EAAG4B,EAAE5B,EAAG5W,EAAI4W,EAAGhT,EAAIqM,GAAU1d,KAAKC,MAA8B,KAAvBokB,EAAG5W,EAAI4W,EAAGhT,EAAIqM,IAAkB,KAAUjQ,EACtG4W,EAAKA,EAAGrgB,MAETyJ,GAAKyK,EAAK7G,EAEX6G,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAGoL,EAAGyK,IAE7BrJ,GAAoB,SAApBA,kBAA6B6O,EAAOxF,WAC/BmM,EAAKnM,EAAKxQ,IACP2c,GACNA,EAAG3T,EAAEgN,EAAO2G,EAAGhZ,GACfgZ,EAAKA,EAAGrgB,OAGVkL,GAAqB,SAArBA,mBAA8BD,EAAUjO,EAAOnC,EAAQd,WAErDmG,EADGmgB,EAAKlH,KAAKzV,IAEP2c,GACNngB,EAAOmgB,EAAGrgB,MACVqgB,EAAGhiB,IAAMtE,GAAYsmB,EAAGpV,SAASA,EAAUjO,EAAOnC,GAClDwlB,EAAKngB,GAGP8K,GAAoB,SAApBA,kBAA6BjR,WAE3B0rB,EAA0BvlB,EADvBmgB,EAAKlH,KAAKzV,IAEP2c,GACNngB,EAAOmgB,EAAGrgB,MACLqgB,EAAGhiB,IAAMtE,IAAasmB,EAAGqF,IAAOrF,EAAGqF,KAAO3rB,EAC9CkG,GAAsBkZ,KAAMkH,EAAI,OACrBA,EAAGsF,MACdF,EAA2B,GAE5BpF,EAAKngB,SAEEulB,GAKTvC,GAA4B,SAA5BA,0BAA4BlkB,WAE1BkB,EAAM0lB,EAAKC,EAAOC,EADfzF,EAAKrhB,EAAO0E,IAGT2c,GAAI,KACVngB,EAAOmgB,EAAGrgB,MACV4lB,EAAMC,EACCD,GAAOA,EAAIG,GAAK1F,EAAG0F,IACzBH,EAAMA,EAAI5lB,OAENqgB,EAAGtgB,MAAQ6lB,EAAMA,EAAI7lB,MAAQ+lB,GACjCzF,EAAGtgB,MAAMC,MAAQqgB,EAEjBwF,EAAQxF,GAEJA,EAAGrgB,MAAQ4lB,GACfA,EAAI7lB,MAAQsgB,EAEZyF,EAAOzF,EAERA,EAAKngB,EAENlB,EAAO0E,IAAMmiB,GAIF7Z,wBAiBZf,SAAA,kBAASrP,EAAMoB,EAAOnC,QAChB0qB,KAAOpM,KAAKoM,MAAQpM,KAAKC,SACzBA,IAAMkM,QACNrD,EAAIrmB,OACJ4pB,GAAK3qB,OACLmC,MAAQA,iCApBFkD,EAAMrF,EAAQgR,EAAMzP,EAAO4pB,EAAQC,EAAU/R,EAAMmN,EAAQX,QACjE7gB,EAAIhF,OACJ4O,EAAIrN,OACJiR,EAAI2Y,OACJ3nB,EAAIwN,OACJa,EAAIuZ,GAAY7D,QAChB/a,EAAI6M,GAAQiF,UACZC,IAAMiI,GAAUG,QAChBuE,GAAKrF,GAAY,QACjB1gB,MAAQE,KAEZA,EAAKH,MAAQoZ,MAgBhBzd,GAAaqY,GAAiB,sOAAuO,SAAAzZ,UAAQwR,GAAexR,GAAQ,IACpSV,GAASssB,SAAWtsB,GAASusB,UAAYnhB,GACzCpL,GAASwsB,aAAexsB,GAASysB,YAAc9hB,GAC/CtF,EAAkB,IAAIsF,GAAS,CAACoX,cAAc,EAAOpd,SAAUmU,EAAWrS,oBAAoB,EAAM6Y,GAAG,OAAQ/W,mBAAmB,IAClIiQ,EAAQ4O,aAAe/S,GAoBV,SAAZqY,GAAY7hB,UAASyN,GAAWzN,IAAS8hB,IAAarZ,IAAI,SAAA0K,UAAKA,MAC9C,SAAjB4O,SACK/oB,EAAOsZ,KAAKC,MACfyP,EAAU,GACiB,EAAxBhpB,EAAOipB,KACVJ,GAAU,kBACVK,GAAO7qB,QAAQ,SAAAuR,OAGbpP,EAAOI,EAAGuoB,EAAUC,EAFjBC,EAAUzZ,EAAEyZ,QACfC,EAAa1Z,EAAE0Z,eAEX1oB,KAAKyoB,GACT7oB,EAAQuH,EAAKwhB,WAAWF,EAAQzoB,IAAIooB,WAC1BG,EAAW,GACjB3oB,IAAU8oB,EAAW1oB,KACxB0oB,EAAW1oB,GAAKJ,EAChB4oB,EAAU,GAGRA,IACHxZ,EAAEtM,SACF6lB,GAAYH,EAAQ1iB,KAAKsJ,MAG3BiZ,GAAU,oBACVG,EAAQ3qB,QAAQ,SAAAuR,UAAKA,EAAE4Z,QAAQ5Z,KAC/BqZ,GAAiBjpB,EACjB6oB,GAAU,eA/Bb,OAAIK,GAAS,GACZzU,GAAa,GACbqU,GAAc,GACdG,GAAiB,EACjBQ,GAAa,EA+BRC,2BASLrc,IAAA,aAAIxQ,EAAMsB,EAAMnC,GAYV,SAAJme,SAGEjK,EAFG7N,EAAOkR,EACVoW,EAAe/L,EAAK5V,gBAErB3F,GAAQA,IAASub,GAAQvb,EAAKoU,KAAKnQ,KAAKsX,GACxC5hB,IAAU4hB,EAAK5V,SAAWA,GAAShM,IACnCuX,EAAWqK,EACX1N,EAAS/R,EAAK4S,MAAM6M,EAAM9B,WAC1BvgB,EAAY2U,IAAW0N,EAAKgM,GAAGtjB,KAAK4J,GACpCqD,EAAWlR,EACXub,EAAK5V,SAAW2hB,EAChB/L,EAAKiM,YAAa,EACX3Z,EAlBL3U,EAAYsB,KACfb,EAAQmC,EACRA,EAAOtB,EACPA,EAAOtB,OAEJqiB,EAAOlC,YAeXkC,EAAKyK,KAAOlO,GACLtd,IAAStB,EAAc4e,GAAEyD,GAAQ/gB,EAAQ+gB,EAAK/gB,GAAQsd,GAAKA,OAEnE2P,OAAA,gBAAO3rB,OACFkE,EAAOkR,EACXA,EAAW,KACXpV,EAAKud,MACLnI,EAAWlR,MAEZ0nB,UAAA,yBACKtqB,EAAI,eACHgX,KAAKpY,QAAQ,SAAAglB,UAAMA,aAAaqG,QAAWjqB,EAAE6G,WAAF7G,EAAU4jB,EAAE0G,aAAgB1G,aAAa9b,MAAY8b,EAAE9hB,QAA4B,WAAlB8hB,EAAE9hB,OAAOkV,OAAsBhX,EAAE6G,KAAK+c,KAChJ5jB,MAER8iB,MAAA,sBACMqH,GAAGpsB,OAASke,KAAKjF,KAAKjZ,OAAS,MAErCkP,KAAA,cAAKpJ,EAAQimB,iBACRjmB,EAAQ,KACPgd,EAAS5E,KAAKqO,iBACbtT,KAAKpY,QAAQ,SAAA+D,GACF,WAAXA,EAAEqU,OACLrU,EAAEkB,SACFlB,EAAEie,aAAY,GAAM,GAAM,GAAOhiB,QAAQ,SAAAkB,UAAS+gB,EAAO3iB,OAAO2iB,EAAOjhB,QAAQE,GAAQ,QAIzF+gB,EAAO7Q,IAAI,SAAArN,SAAc,CAAC8M,EAAG9M,EAAEqa,WAAW,GAAIra,EAAAA,KAAKoG,KAAK,SAAC/I,EAAG+K,UAAMA,EAAE0E,EAAIzP,EAAEyP,IAAM,IAAG7Q,QAAQ,SAAA2rB,UAAKA,EAAE5nB,EAAEkB,OAAOA,UACtGmT,KAAKpY,QAAQ,SAAAglB,UAAKA,aAAavc,GAAuB,WAAXuc,EAAE5M,MAAsB4M,EAAE3W,SAAW2W,aAAa9b,KAAU8b,EAAE/f,QAAU+f,EAAE/f,OAAOA,UAC5HsmB,GAAGvrB,QAAQ,SAAA8b,UAAKA,EAAE7W,EAAQ2mB,UAC1BJ,YAAa,YAEbpT,KAAKpY,QAAQ,SAAAglB,UAAKA,EAAE3W,MAAQ2W,EAAE3W,iBAE/B6V,QACDgH,UACCpsB,EAAI+rB,GAAO1rB,OACRL,KACN+rB,GAAO/rB,GAAGse,KAAOC,KAAKD,IAAMyN,GAAOvrB,OAAOR,EAAG,OAIhDmG,OAAA,gBAAOwJ,QACDJ,KAAKI,GAAU,+BA7ET3O,EAAMnC,QACZgM,SAAWhM,GAASgM,GAAShM,QAC7Bya,KAAO,QACPmT,GAAK,QACLC,YAAa,OACbpO,GAAKgO,KACVtrB,GAAQud,KAAKrO,IAAIlP,UA8Eb+rB,8BAKL7c,IAAA,aAAIic,EAAYnrB,EAAMnC,GACrBN,EAAU4tB,KAAgBA,EAAa,CAACN,QAASM,QAGhDa,EAAIvpB,EAAGwpB,EAFJnS,EAAU,IAAIyR,GAAQ,EAAG1tB,GAAS0f,KAAK1f,OAC1CquB,EAAOpS,EAAQqR,WAAa,OAMxB1oB,KAJL2S,IAAa0E,EAAQjQ,WAAaiQ,EAAQjQ,SAAWuL,EAASvL,eACzDsiB,SAAShkB,KAAK2R,GACnB9Z,EAAO8Z,EAAQ5K,IAAI,UAAWlP,GAC9B8Z,EAAQoR,QAAUC,EAEP,QAAN1oB,EACHwpB,EAAS,GAETD,EAAKpiB,EAAKwhB,WAAWD,EAAW1oB,OAE/BsoB,GAAO7pB,QAAQ4Y,GAAW,GAAKiR,GAAO5iB,KAAK2R,IAC1CoS,EAAKzpB,GAAKupB,EAAGnB,WAAaoB,EAAS,GACpCD,EAAGI,YAAcJ,EAAGI,YAAYxB,IAAkBoB,EAAGK,iBAAiB,SAAUzB,YAInFqB,GAAUjsB,EAAK8Z,GACRyD,SAWRpY,OAAA,gBAAOwJ,QACDJ,KAAKI,GAAU,QAErBJ,KAAA,cAAKpJ,QACCgnB,SAASjsB,QAAQ,SAAAuR,UAAKA,EAAElD,KAAKpJ,GAAQ,sCAzC/BtH,QACNsuB,SAAW,QACXtuB,MAAQA,EAkDf,IAAMqB,GAAQ,CACbotB,oEAAkBC,2BAAAA,kBACjBA,EAAKrsB,QAAQ,SAAAyO,UAAUD,GAAcC,MAEtCjI,2BAASvD,UACD,IAAIwF,GAASxF,IAErB2f,iCAAYhkB,EAAS+jB,UACbxf,EAAgByf,YAAYhkB,EAAS+jB,IAE7C2J,iCAAYvtB,EAAQd,EAAUsuB,EAAMC,GACnCxvB,EAAU+B,KAAYA,EAASS,GAAQT,GAAQ,QAC3C0tB,EAASltB,GAAUR,GAAU,IAAIwQ,IACpCmd,EAASH,EAAOjqB,GAAeL,SACvB,WAATsqB,IAAsBA,EAAO,IACrBxtB,EAAmBd,EAA8IyuB,GAAS7c,GAAS5R,IAAa4R,GAAS5R,GAAUsR,KAAQkd,GAAQ1tB,EAAQd,EAAUsuB,EAAMC,IAA7N,SAACvuB,EAAUsuB,EAAMC,UAAYE,GAAS7c,GAAS5R,IAAa4R,GAAS5R,GAAUsR,KAAQkd,GAAQ1tB,EAAQd,EAAUsuB,EAAMC,KAA5IztB,GAElB4tB,iCAAY5tB,EAAQd,EAAUsuB,MAET,GADpBxtB,EAASS,GAAQT,IACNI,OAAY,KAClBytB,EAAU7tB,EAAOqS,IAAI,SAAArN,UAAKhG,GAAK4uB,YAAY5oB,EAAG9F,EAAUsuB,KAC3DxrB,EAAI6rB,EAAQztB,cACN,SAAAlC,WACF6B,EAAIiC,EACFjC,KACL8tB,EAAQ9tB,GAAG7B,IAId8B,EAASA,EAAO,IAAM,OAClB4P,EAASkB,GAAS5R,GACrByM,EAAQnL,GAAUR,GAClBwD,EAAKmI,EAAMzL,UAAYyL,EAAMzL,QAAQyQ,SAAW,IAAIzR,IAAcA,EAClEsnB,EAAS5W,EAAS,SAAA1R,OACbsF,EAAI,IAAIoM,EACZ0G,EAAYzN,IAAM,EAClBrF,EAAEqM,KAAK7P,EAAQwtB,EAAOtvB,EAAQsvB,EAAOtvB,EAAOoY,EAAa,EAAG,CAACtW,IAC7DwD,EAAEf,OAAO,EAAGe,GACZ8S,EAAYzN,KAAOmH,GAAkB,EAAGsG,IACrC3K,EAAM4S,IAAIve,EAAQwD,UAChBoM,EAAS4W,EAAS,SAAAtoB,UAASsoB,EAAOxmB,EAAQwD,EAAGgqB,EAAOtvB,EAAQsvB,EAAOtvB,EAAOyN,EAAO,KAEzFmiB,yBAAQ9tB,EAAQd,EAAUgF,GAEjB,SAAPnD,GAAQ7C,EAAOqD,EAAO8nB,UAAoBlnB,EAAMinB,QAAQlqB,EAAUhB,EAAOqD,EAAO8nB,SAD7ElnB,EAAQnD,GAAKgiB,GAAGhhB,EAAQlB,WAASI,GAAW,UAAS+f,QAAQ,KAAO/a,GAAQ,YAEhFnD,GAAKoB,MAAQA,EACNpB,IAERgtB,+BAAWluB,UACiD,EAApDuE,EAAgByf,YAAYhkB,GAAS,GAAMO,QAEnDsD,2BAASxF,UACRA,GAASA,EAAMsN,OAAStN,EAAMsN,KAAOC,GAAWvN,EAAMsN,KAAMqM,EAAUrM,OAC/D7H,GAAWkU,EAAW3Z,GAAS,KAEvCwR,uBAAOxR,UACCyF,GAAW4T,EAASrZ,GAAS,KAErC8vB,8CAAgBvuB,IAAAA,KAAMwuB,IAAAA,OAAQC,IAAAA,QAASxqB,IAAAA,SAAUyqB,IAAAA,gBAC/CD,GAAW,IAAIltB,MAAM,KAAKC,QAAQ,SAAAmtB,UAAcA,IAAetd,GAASsd,KAAgBrvB,GAASqvB,IAAe/uB,EAAMI,EAAO,oBAAsB2uB,EAAa,cACjKpV,GAASvZ,GAAQ,SAACI,EAASqE,EAAMmgB,UAAO4J,EAAOxtB,GAAQZ,GAAU4D,GAAaS,GAAQ,GAAIR,GAAW2gB,IACjG8J,IACHzkB,GAASqH,UAAUtR,GAAQ,SAASI,EAASqE,EAAM4D,UAC3CwW,KAAKrO,IAAI+I,GAASvZ,GAAMI,EAASvB,EAAU4F,GAAQA,GAAQ4D,EAAW5D,IAAS,GAAIoa,MAAOxW,MAIpGumB,mCAAa5uB,EAAM+L,GAClBkI,GAASjU,GAAQgM,GAAWD,IAE7B8iB,6BAAU9iB,EAAMiS,UACRiB,UAAUte,OAASqL,GAAWD,EAAMiS,GAAe/J,IAE3D2P,yBAAQhF,UACAja,EAAgBif,QAAQhF,IAEhCkQ,+BAAWrqB,EAAWsqB,YAAXtqB,IAAAA,EAAO,QAEhBU,EAAOS,EADJgf,EAAK,IAAI3a,GAASxF,OAEtBmgB,EAAG/c,kBAAoB/I,EAAY2F,EAAKoD,mBACxClD,EAAgBqB,OAAO4e,GACvBA,EAAG3f,IAAM,EACT2f,EAAG9c,MAAQ8c,EAAG5d,OAASrC,EAAgBmD,MACvC3C,EAAQR,EAAgBuQ,OACjB/P,GACNS,EAAOT,EAAMO,OACTqpB,IAA0B5pB,EAAMiB,MAAQjB,aAAiBuF,IAASvF,EAAMV,KAAKud,aAAe7c,EAAMsf,SAAS,IAC9Grc,GAAewc,EAAIzf,EAAOA,EAAMkB,OAASlB,EAAMqD,QAEhDrD,EAAQS,SAETwC,GAAezD,EAAiBigB,EAAI,GAC7BA,GAERxJ,QAAS,iBAAC9Z,EAAMnC,UAAUmC,EAAO,IAAIurB,GAAQvrB,EAAMnC,GAASuX,GAC5DgW,WAAY,oBAAAvtB,UAAS,IAAIkuB,GAAWluB,IACpC6vB,kBAAmB,oCAAM3C,GAAO7qB,QAAQ,SAAAuR,OAEtCkc,EAAOlrB,EADJypB,EAAOza,EAAE0Z,eAER1oB,KAAKypB,EACLA,EAAKzpB,KACRypB,EAAKzpB,IAAK,EACVkrB,EAAQ,GAGVA,GAASlc,EAAEtM,YACNylB,MACNyB,2CAAiBxjB,EAAM+Q,OAClBtY,EAAIgV,GAAWzN,KAAUyN,GAAWzN,GAAQ,KAC/CvH,EAAEJ,QAAQ0Y,IAAatY,EAAE6G,KAAKyR,IAEhCgU,iDAAoB/kB,EAAM+Q,OACrBtY,EAAIgV,GAAWzN,GAClB7J,EAAIsC,GAAKA,EAAEJ,QAAQ0Y,GACf,GAAL5a,GAAUsC,EAAE9B,OAAOR,EAAG,IAEvB6uB,MAAO,CAAEC,KA7gFF,SAAPA,KAAgBliB,EAAKD,EAAKxO,OACrB4wB,EAAQpiB,EAAMC,SACXnI,EAASmI,GAAO4B,GAAW5B,EAAKkiB,KAAK,EAAGliB,EAAIvM,QAASsM,GAAOtC,GAAmBlM,EAAO,SAAAA,UAAW4wB,GAAS5wB,EAAQyO,GAAOmiB,GAASA,EAASniB,KA2gFpIoiB,SAzgFJ,SAAXA,SAAYpiB,EAAKD,EAAKxO,OACjB4wB,EAAQpiB,EAAMC,EACjBqiB,EAAgB,EAARF,SACFtqB,EAASmI,GAAO4B,GAAW5B,EAAKoiB,SAAS,EAAGpiB,EAAIvM,OAAS,GAAIsM,GAAOtC,GAAmBlM,EAAO,SAAAA,UAE7FyO,GAAgBmiB,GADvB5wB,GAAS8wB,GAAS9wB,EAAQyO,GAAOqiB,GAASA,GAAS,GAClBA,EAAQ9wB,EAASA,MAogF3BoN,WAAAA,GAAYD,OAAAA,GAAQqC,KAAAA,GAAMuhB,UA/gFvC,SAAZA,UAAatiB,EAAKD,EAAKxO,UAAUic,GAASxN,EAAKD,EAAK,EAAG,EAAGxO,IA+gFImM,QAAAA,GAAS6kB,MAroF/D,SAARA,MAASviB,EAAKD,EAAKxO,UAAUkM,GAAmBlM,EAAO,SAAAyC,UAAKgH,GAAOgF,EAAKD,EAAK/L,MAqoFC+Q,WAAAA,GAAYjR,QAAAA,GAASmK,SAAAA,GAAUuP,SAAAA,GAAUgV,KAjhFhH,SAAPA,kCAAWC,2BAAAA,yBAAc,SAAAlxB,UAASkxB,EAAUC,OAAO,SAAC1uB,EAAGoc,UAAMA,EAAEpc,IAAIzC,KAihF0DoxB,QAhhFnH,SAAVA,QAAWvuB,EAAMysB,UAAS,SAAAtvB,UAAS6C,EAAKY,WAAWzD,KAAWsvB,GAAQnjB,GAAQnM,MAghFwDqxB,YA/+ExH,SAAdA,YAAehuB,EAAOG,EAAK6N,EAAUigB,OAChCzuB,EAAO+K,MAAMvK,EAAQG,GAAO,EAAI,SAAA8B,UAAM,EAAIA,GAAKjC,EAAQiC,EAAI9B,OAC1DX,EAAM,KAGTyC,EAAGzD,EAAG0vB,EAAeztB,EAAG0tB,EAFrBC,EAAW1xB,EAAUsD,GACxBquB,EAAS,OAEG,IAAbrgB,IAAsBigB,EAAS,KAAOjgB,EAAW,MAC7CogB,EACHpuB,EAAQ,CAACiC,EAAGjC,GACZG,EAAM,CAAC8B,EAAG9B,QAEJ,GAAI8C,EAASjD,KAAWiD,EAAS9C,GAAM,KAC7C+tB,EAAgB,GAChBztB,EAAIT,EAAMnB,OACVsvB,EAAK1tB,EAAI,EACJjC,EAAI,EAAGA,EAAIiC,EAAGjC,IAClB0vB,EAAcvmB,KAAKqmB,YAAYhuB,EAAMxB,EAAE,GAAIwB,EAAMxB,KAElDiC,IACAjB,EAAO,cAAAyC,GACNA,GAAKxB,MACDjC,EAAIoB,KAAKwL,IAAI+iB,IAAMlsB,UAChBisB,EAAc1vB,GAAGyD,EAAIzD,IAE7BwP,EAAW7N,OACA8tB,IACXjuB,EAAQzC,GAAO0F,EAASjD,GAAS,GAAK,GAAIA,QAEtCkuB,EAAe,KACdjsB,KAAK9B,EACTwO,GAAcgK,KAAK0V,EAAQruB,EAAOiC,EAAG,MAAO9B,EAAI8B,IAEjDzC,EAAO,cAAAyC,UAAKwM,GAAkBxM,EAAGosB,KAAYD,EAAWpuB,EAAMiC,EAAIjC,YAG7D6I,GAAmBmF,EAAUxO,IA48E8GoK,QAAAA,IACnJ0kB,QAASlxB,EACTmxB,QAAS9W,GACT+W,OAAQ/mB,GACRqc,WAAY3b,GAAS2b,WACrB6I,QAASpd,GACTkf,eAAgB5rB,EAChB6rB,KAAM,CAAC9e,UAAAA,GAAW+e,QAAS1wB,EAAY2K,MAAAA,GAAOT,SAAAA,GAAU8U,UAAAA,GAAW2R,SAAU3vB,GAAW4E,sBAAAA,GAAuBgrB,UAAW,4BAAMrtB,GAAY8X,QAAS,iBAAAwV,UAAcA,GAASla,IAAYA,EAASkD,KAAKnQ,KAAKmnB,GAAQA,EAAMvV,KAAO3E,GAAiBA,GAAama,mBAAoB,4BAAApyB,UAASgY,EAAsBhY,KAGlT2C,GAAa,8CAA+C,SAAApB,UAAQQ,GAAMR,GAAQ0K,GAAM1K,KACxFuJ,GAAQiH,IAAIvG,GAAS2b,YACrB/O,EAAcrW,GAAM+gB,GAAG,GAAI,CAACta,SAAS,IAQX,SAAtB6pB,GAAuBhL,EAAQvU,WAC7BwU,EAAKD,EAAO1c,IACT2c,GAAMA,EAAGhiB,IAAMwN,GAAQwU,EAAGqF,KAAO7Z,GAAQwU,EAAG6B,KAAOrW,GACzDwU,EAAKA,EAAGrgB,aAEFqgB,EAkBe,SAAvBgL,GAAwB/wB,EAAM2Q,SACtB,CACN3Q,KAAMA,EACN6Q,QAAS,EACTT,mBAAK7P,EAAQkE,EAAM/B,GAClBA,EAAMmmB,QAAU,SAAAnmB,OACXsuB,EAAMjtB,KACNvF,EAAUiG,KACbusB,EAAO,GACP5vB,GAAaqD,EAAM,SAAAzE,UAAQgxB,EAAKhxB,GAAQ,IACxCyE,EAAOusB,GAEJrgB,EAAU,KAER5M,KADLitB,EAAO,GACGvsB,EACTusB,EAAKjtB,GAAK4M,EAASlM,EAAKV,IAEzBU,EAAOusB,GAjCI,SAAhBC,cAAiBvuB,EAAOwuB,OAErBntB,EAAGzD,EAAGylB,EADH3lB,EAAUsC,EAAM+hB,aAEf1gB,KAAKmtB,MACT5wB,EAAIF,EAAQO,OACLL,MAEKylB,GADXA,EAAKrjB,EAAMwc,UAAU5e,GAAGyD,KACRgiB,EAAGhZ,KACdgZ,EAAG3c,MACN2c,EAAK+K,GAAoB/K,EAAIhiB,IAE9BgiB,GAAMA,EAAGpV,UAAYoV,EAAGpV,SAASugB,EAAUntB,GAAIrB,EAAOtC,EAAQE,GAAIyD,IAwBnEktB,CAAcvuB,EAAO+B,MA1C1B,IAiDalF,GAAOiB,GAAMotB,eAAe,CACvC5tB,KAAK,OACLoQ,mBAAK7P,EAAQkE,EAAM/B,EAAOsM,EAAO5O,OAC5B2D,EAAGgiB,EAAI7kB,MAEN6C,UADArB,MAAQA,EACH+B,EACTvD,EAAIX,EAAOY,aAAa4C,IAAM,IAC9BgiB,EAAKlH,KAAKrO,IAAIjQ,EAAQ,gBAAiBW,GAAK,GAAK,GAAIuD,EAAKV,GAAIiL,EAAO5O,EAAS,EAAG,EAAG2D,IACjFqnB,GAAKrnB,EACRgiB,EAAGpY,EAAIzM,OACFmP,OAAO5G,KAAK1F,IAGnBf,uBAAOoc,EAAOxF,WACTmM,EAAKnM,EAAKxQ,IACP2c,GACNziB,EAAayiB,EAAGjH,IAAIiH,EAAGxgB,EAAGwgB,EAAGhiB,EAAGgiB,EAAGpY,EAAGoY,GAAMA,EAAG3T,EAAEgN,EAAO2G,EAAGhZ,GAC3DgZ,EAAKA,EAAGrgB,QAGR,CACF1F,KAAK,WACLoQ,mBAAK7P,EAAQ9B,WACR6B,EAAI7B,EAAMkC,OACPL,UACDkQ,IAAIjQ,EAAQD,EAAGC,EAAOD,IAAM,EAAG7B,EAAM6B,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,KAIhEywB,GAAqB,aAAcjjB,IACnCijB,GAAqB,aACrBA,GAAqB,OAAQ9iB,MACzBzN,GAELkK,GAAMwS,QAAUjT,GAASiT,QAAU3d,GAAK2d,QAAU,SAClDtG,EAAa,EACb7X,KAAmBqS,KCtoGD,SAAjB+f,GAAkB/R,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAIrC,KAAKC,MAAkC,KAA3BiY,EAAKzK,EAAIyK,EAAK7G,EAAIqM,IAAkB,IAASxF,EAAKhM,EAAGgM,GACxG,SAArBwX,GAAsBhS,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAa,IAAVqb,EAAcxF,EAAK4M,EAAK9kB,KAAKC,MAAkC,KAA3BiY,EAAKzK,EAAIyK,EAAK7G,EAAIqM,IAAkB,IAASxF,EAAKhM,EAAGgM,GAC1H,SAA9ByX,GAA+BjS,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAGqb,EAAS1d,KAAKC,MAAkC,KAA3BiY,EAAKzK,EAAIyK,EAAK7G,EAAIqM,IAAkB,IAASxF,EAAKhM,EAAIgM,EAAKjM,EAAGiM,GACnI,SAAxB0X,GAAyBlS,EAAOxF,OAC3Bnb,EAAQmb,EAAKzK,EAAIyK,EAAK7G,EAAIqM,EAC9BxF,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,KAAMtF,GAASA,EAAQ,GAAK,GAAK,KAAOmb,EAAKhM,EAAGgM,GAE7C,SAA1B2X,GAA2BnS,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAGqb,EAAQxF,EAAK4M,EAAI5M,EAAKjM,EAAGiM,GAC1D,SAAnC4X,GAAoCpS,EAAOxF,UAASA,EAAKkF,IAAIlF,EAAKrU,EAAGqU,EAAK7V,EAAa,IAAVqb,EAAcxF,EAAKjM,EAAIiM,EAAK4M,EAAG5M,GAC1F,SAAlB6X,GAAmBlxB,EAAQd,EAAUhB,UAAU8B,EAAO4lB,MAAM1mB,GAAYhB,EACvD,SAAjBizB,GAAkBnxB,EAAQd,EAAUhB,UAAU8B,EAAO4lB,MAAMwL,YAAYlyB,EAAUhB,GAC9D,SAAnBmzB,GAAoBrxB,EAAQd,EAAUhB,UAAU8B,EAAOC,MAAMf,GAAYhB,EAC1D,SAAfozB,GAAgBtxB,EAAQd,EAAUhB,UAAU8B,EAAOC,MAAMsxB,OAASvxB,EAAOC,MAAMuxB,OAAStzB,EAC/D,SAAzBuzB,GAA0BzxB,EAAQd,EAAUhB,EAAOmb,EAAMwF,OACpDlT,EAAQ3L,EAAOC,MACnB0L,EAAM4lB,OAAS5lB,EAAM6lB,OAAStzB,EAC9ByN,EAAM+lB,gBAAgB7S,EAAOlT,GAED,SAA7BgmB,GAA8B3xB,EAAQd,EAAUhB,EAAOmb,EAAMwF,OACxDlT,EAAQ3L,EAAOC,MACnB0L,EAAMzM,GAAYhB,EAClByN,EAAM+lB,gBAAgB7S,EAAOlT,GAIjB,SAAbimB,GAAsB1yB,EAAU2yB,cAC3B7xB,EAASse,KAAKte,OACjB4lB,EAAQ5lB,EAAO4lB,SACX1mB,KAAY4yB,IAAoBlM,EAAO,SACtCmM,IAAMzT,KAAKyT,KAAO,GACN,cAAb7yB,SAII8yB,GAAiBC,UAAUjxB,MAAM,KAAKC,QAAQ,SAAAuC,UAAKouB,GAAW1X,KAAK6G,EAAMvd,EAAGquB,UAHnF3yB,EAAW8yB,GAAiB9yB,IAAaA,GAC/B+C,QAAQ,KAAO/C,EAAS8B,MAAM,KAAKC,QAAQ,SAAAoB,UAAK0e,EAAKgR,IAAI1vB,GAAK6vB,GAAKlyB,EAAQqC,KAAOic,KAAKyT,IAAI7yB,GAAYc,EAAOC,MAAMqM,EAAItM,EAAOC,MAAMf,GAAYgzB,GAAKlyB,EAAQd,GAI/H,GAAtCof,KAAKqF,MAAM1hB,QAAQkwB,WACnBnyB,EAAOC,MAAMmyB,WACXC,KAAOryB,EAAOY,aAAa,wBAC3B+iB,MAAMza,KAAKopB,GAAsBT,EAAU,KAEjD3yB,EAAWizB,IAEXvM,GAASiM,IAAavT,KAAKqF,MAAMza,KAAKhK,EAAU2yB,EAAUjM,EAAM1mB,IAEnC,SAA/BqzB,GAA+B3M,GAC1BA,EAAM4M,YACT5M,EAAM6M,eAAe,aACrB7M,EAAM6M,eAAe,SACrB7M,EAAM6M,eAAe,WAGR,SAAfC,SAKE3yB,EAAGyD,EAJAmgB,EAAQrF,KAAKqF,MAChB3jB,EAASse,KAAKte,OACd4lB,EAAQ5lB,EAAO4lB,MACfja,EAAQ3L,EAAOC,UAEXF,EAAI,EAAGA,EAAI4jB,EAAMvjB,OAAQL,GAAG,EAChC4jB,EAAM5jB,EAAE,GAAKC,EAAO2jB,EAAM5jB,IAAM4jB,EAAM5jB,EAAE,GAAK4jB,EAAM5jB,EAAE,GAAM6lB,EAAMjC,EAAM5jB,IAAM4jB,EAAM5jB,EAAE,GAAM6lB,EAAM6M,eAAwC,OAAzB9O,EAAM5jB,GAAG6B,OAAO,EAAE,GAAc+hB,EAAM5jB,GAAK4jB,EAAM5jB,GAAGmT,QAAQyf,GAAU,OAAOtd,kBAE1LiJ,KAAKyT,IAAK,KACRvuB,KAAK8a,KAAKyT,IACdpmB,EAAMnI,GAAK8a,KAAKyT,IAAIvuB,GAEjBmI,EAAMymB,MACTzmB,EAAM+lB,kBACN1xB,EAAOwqB,aAAa,kBAAmBlM,KAAK+T,MAAQ,MAErDtyB,EAAIgD,OACQhD,EAAE+Y,SAAa8M,EAAMuM,MAChCI,GAA6B3M,GAC7Bja,EAAM8hB,QAAU,IAIF,SAAjBmF,GAAkB5yB,EAAQ6yB,OACrBC,EAAQ,CACX9yB,OAAAA,EACA2jB,MAAO,GACPzd,OAAQwsB,GACRK,KAAMnB,WAEP5xB,EAAOC,OAASjB,GAAKixB,KAAKE,SAASnwB,GACnC6yB,GAAcA,EAAW7xB,MAAM,KAAKC,QAAQ,SAAAuC,UAAKsvB,EAAMC,KAAKvvB,KACrDsvB,EAGS,SAAjBE,GAAkBppB,EAAMqpB,OACnBhN,EAAIhb,GAAKioB,gBAAkBjoB,GAAKioB,iBAAiBD,GAAM,gCAAgC/f,QAAQ,SAAU,QAAStJ,GAAQqB,GAAKC,cAActB,UAC1Iqc,EAAEL,MAAQK,EAAIhb,GAAKC,cAActB,GAElB,SAAvBupB,GAAwBnzB,EAAQd,EAAUk0B,OACrCC,EAAKC,iBAAiBtzB,UACnBqzB,EAAGn0B,IAAam0B,EAAGE,iBAAiBr0B,EAASgU,QAAQyf,GAAU,OAAOtd,gBAAkBge,EAAGE,iBAAiBr0B,KAAek0B,GAAsBD,GAAqBnzB,EAAQwzB,GAAiBt0B,IAAaA,EAAU,IAAO,GAczN,SAAZu0B,MAtHgB,SAAhBj1B,sBAAyC,oBAAZC,QAuHxBD,IAAmBC,OAAOge,WAC7B9R,GAAOlM,OACPwM,GAAON,GAAK8R,SACZiX,GAAczoB,GAAK0oB,gBACnBC,GAAWZ,GAAe,QAAU,CAACpN,MAAM,IAC1BoN,GAAe,OAChCb,GAAiBqB,GAAiBrB,IAClCG,GAAuBH,GAAiB,SACxCyB,GAAShO,MAAMiO,QAAU,2DACzBC,KAAgBN,GAAiB,eACjCzwB,GAAa/D,GAAKixB,KAAKG,UACvB2D,GAAiB,GAGJ,SAAfC,GAAwBC,OAKtBC,EAJG9B,EAAMY,GAAe,MAAQ1U,KAAK6V,iBAAmB7V,KAAK6V,gBAAgBvzB,aAAa,UAAa,8BACvGwzB,EAAY9V,KAAK+V,WACjBC,EAAahW,KAAKiW,YAClBC,EAASlW,KAAKsH,MAAMiO,WAErBH,GAAYe,YAAYrC,GACxBA,EAAIqC,YAAYnW,WACXsH,MAAM8O,QAAU,QACjBT,MAEFC,EAAO5V,KAAKqW,eACPC,UAAYtW,KAAKqW,aACjBA,QAAUX,GACd,MAAO/N,SACC3H,KAAKsW,YACfV,EAAO5V,KAAKsW,oBAETR,IACCE,EACHF,EAAUS,aAAavW,KAAMgW,GAE7BF,EAAUK,YAAYnW,OAGxBoV,GAAYoB,YAAY1C,QACnBxM,MAAMiO,QAAUW,EACdN,EAEiB,SAAzBa,GAA0B/0B,EAAQg1B,WAC7Bj1B,EAAIi1B,EAAgB50B,OACjBL,QACFC,EAAOi1B,aAAaD,EAAgBj1B,WAChCC,EAAOY,aAAao0B,EAAgBj1B,IAInC,SAAXm1B,GAAWl1B,OACNm1B,MAEHA,EAASn1B,EAAO20B,UACf,MAAOS,GACRD,EAASnB,GAAa9Z,KAAKla,GAAQ,UAEnCm1B,IAAWA,EAAOE,OAASF,EAAOG,SAAYt1B,EAAO20B,UAAYX,KAAiBmB,EAASnB,GAAa9Z,KAAKla,GAAQ,KAE9Gm1B,GAAWA,EAAOE,OAAUF,EAAO7oB,GAAM6oB,EAAO5oB,EAA8I4oB,EAAzI,CAAC7oB,GAAIyoB,GAAuB/0B,EAAQ,CAAC,IAAI,KAAK,QAAU,EAAGuM,GAAGwoB,GAAuB/0B,EAAQ,CAAC,IAAI,KAAK,QAAU,EAAGq1B,MAAM,EAAGC,OAAO,GAEzL,SAATC,GAAStP,YAAQA,EAAEuP,QAAYvP,EAAEoO,aAAcpO,EAAEkO,kBAAoBe,GAASjP,IAC5D,SAAlBwP,GAAmBz1B,EAAQd,MACtBA,EAAU,KACT0mB,EAAQ5lB,EAAO4lB,MACf1mB,KAAY4yB,IAAmB5yB,IAAaozB,KAC/CpzB,EAAWizB,IAERvM,EAAM6M,gBACoB,OAAzBvzB,EAAS0C,OAAO,EAAE,IAAwC,WAAzB1C,EAAS0C,OAAO,EAAE,KACtD1C,EAAW,IAAMA,GAElB0mB,EAAM6M,eAAevzB,EAASgU,QAAQyf,GAAU,OAAOtd,gBAEvDuQ,EAAM8P,gBAAgBx2B,IAIL,SAApBy2B,GAAqBpQ,EAAQvlB,EAAQd,EAAU02B,EAAWl0B,EAAKm0B,OAC1DrQ,EAAK,IAAIrU,GAAUoU,EAAO1c,IAAK7I,EAAQd,EAAU,EAAG,EAAG22B,EAAe5E,GAAmCD,WAC7GzL,EAAO1c,IAAM2c,GACVpY,EAAIwoB,EACPpQ,EAAGS,EAAIvkB,EACP6jB,EAAOzV,OAAO5G,KAAKhK,GACZsmB,EAKS,SAAjBsQ,GAAkB91B,EAAQd,EAAUhB,EAAOsvB,OAUzCuI,EAAI5xB,EAAQwH,EAAOqqB,EAThBC,EAAWt0B,WAAWzD,IAAU,EACnCg4B,GAAWh4B,EAAQ,IAAIoF,OAAO1B,QAAQq0B,EAAW,IAAI71B,SAAW,KAChEwlB,EAAQgO,GAAShO,MACjBuQ,EAAaC,GAAe7iB,KAAKrU,GACjCm3B,EAA6C,QAAjCr2B,EAAOs2B,QAAQjhB,cAC3BkhB,GAAmBF,EAAY,SAAW,WAAaF,EAAa,QAAU,UAE9EK,EAAoB,OAAThJ,EACXiJ,EAAqB,MAATjJ,SAETA,IAAS0I,IAAYD,GAAYS,GAAqBlJ,IAASkJ,GAAqBR,GAChFD,GAEK,OAAZC,GAAqBM,IAAcP,EAAWH,GAAe91B,EAAQd,EAAUhB,EAAO,OACvF83B,EAAQh2B,EAAOw1B,QAAUD,GAAOv1B,IAC3By2B,GAAyB,MAAZP,IAAqBpE,GAAgB5yB,MAAcA,EAAS+C,QAAQ,UAItF2jB,EAAMuQ,EAAa,QAAU,UAbnB,KAayCK,EAAWN,EAAU1I,GACxErpB,GAAWjF,EAAS+C,QAAQ,UAAsB,OAATurB,GAAiBxtB,EAAOy0B,cAAgB4B,EAAcr2B,EAASA,EAAOq0B,WAC3G2B,IACH7xB,GAAUnE,EAAOm0B,iBAAmB,IAAIE,YAEpClwB,GAAUA,IAAW8G,IAAS9G,EAAOswB,cACzCtwB,EAAS8G,GAAK0rB,OAEfhrB,EAAQxH,EAAOlE,QACFw2B,GAAa9qB,EAAM0pB,OAASc,GAAcxqB,EAAM/I,OAASoG,GAAQpG,OAAS+I,EAAM8hB,QACrFvsB,GAAO+0B,EAAWtqB,EAAM0pB,MAvBtB,OAyBRoB,GAAyB,MAAZP,GAAqBU,GAAoBzD,GAAqBhvB,EAAQ,cAAgByhB,EAAM9d,SAAWqrB,GAAqBnzB,EAAQ,aACjJmE,IAAWnE,IAAY4lB,EAAM9d,SAAW,UACzC3D,EAAOswB,YAAYb,IACnBmC,EAAKnC,GAAS2C,GACdpyB,EAAO2wB,YAAYlB,IACnBhO,EAAM9d,SAAW,WACbquB,GAAcM,KACjB9qB,EAAQnL,GAAU2D,IACZvB,KAAOoG,GAAQpG,KACrB+I,EAAM0pB,MAAQlxB,EAAOoyB,IAGhBr1B,GAAOs1B,EAAWT,EAAKE,EArCpB,IAqCwCF,GAAME,EArC9C,IAqCkEF,EAAKE,EAAW,MA3B3FF,EAAKC,EAAQh2B,EAAO20B,UAAUwB,EAAa,QAAU,UAAYn2B,EAAOu2B,GACjEr1B,GAAOu1B,EAAYR,EAAWF,EAX5B,IAW0CE,EAAW,IAAMF,KAiD7C,SAAzBc,GAAkC72B,EAAQgR,EAAMzP,EAAOG,OACjDH,GAAmB,SAAVA,EAAkB,KAC3BiC,EAAIgwB,GAAiBxiB,EAAMhR,EAAQ,GACtC4O,EAAIpL,GAAK2vB,GAAqBnzB,EAAQwD,EAAG,GACtCoL,GAAKA,IAAMrN,GACdyP,EAAOxN,EACPjC,EAAQqN,GACW,gBAAToC,IACVzP,EAAQ4xB,GAAqBnzB,EAAQ,uBAMtCqC,EAAGyQ,EAAQgkB,EAAa9P,EAAUhU,EAAO+jB,EAAYC,EAAUlQ,EAAQC,EAAOkQ,EAASC,EAHpF1R,EAAK,IAAIrU,GAAUmN,KAAKzV,IAAK7I,EAAO4lB,MAAO5U,EAAM,EAAG,EAAGkW,IAC1DzY,EAAQ,EACR0Y,EAAa,KAEd3B,EAAGpY,EAAI7L,EACPikB,EAAGS,EAAIvkB,EACPH,GAAS,GAEG,UADZG,GAAO,MAEN1B,EAAO4lB,MAAM5U,GAAQtP,EACrBA,EAAMyxB,GAAqBnzB,EAAQgR,IAAStP,EAC5C1B,EAAO4lB,MAAM5U,GAAQzP,GAGtB6R,GADA/Q,EAAI,CAACd,EAAOG,IAGZA,EAAMW,EAAE,GACRy0B,GAFAv1B,EAAQc,EAAE,IAEUe,MAAMsP,KAAoB,IAClChR,EAAI0B,MAAMsP,KAAoB,IAC5BtS,OAAQ,MACb0S,EAASJ,GAAgBnI,KAAK7I,IACrCs1B,EAAWlkB,EAAO,GAClBiU,EAAQrlB,EAAI4S,UAAU7F,EAAOqE,EAAOrE,OAChCuE,EACHA,GAASA,EAAQ,GAAK,EACS,UAArB+T,EAAMnlB,QAAQ,IAAuC,UAArBmlB,EAAMnlB,QAAQ,KACxDoR,EAAQ,GAELgkB,KAAcD,EAAaD,EAAY3P,MAAiB,MAC3DH,EAAWrlB,WAAWo1B,IAAe,EACrCG,EAAYH,EAAWn1B,QAAQolB,EAAW,IAAI5mB,QACtB,MAAvB42B,EAASv1B,OAAO,KAAgBu1B,EAAW11B,GAAe0lB,EAAUgQ,GAAYE,GACjFpQ,EAASnlB,WAAWq1B,GACpBC,EAAUD,EAASp1B,QAAQklB,EAAS,IAAI1mB,QACxCqO,EAAQiE,GAAgBY,UAAY2jB,EAAQ72B,OACvC62B,IACJA,EAAUA,GAAW1f,EAAQI,MAAM3G,IAASkmB,EACxCzoB,IAAU/M,EAAItB,SACjBsB,GAAOu1B,EACPzR,EAAGS,GAAKgR,IAGNC,IAAcD,IACjBjQ,EAAW8O,GAAe91B,EAAQgR,EAAM+lB,EAAYE,IAAY,GAGjEzR,EAAG3c,IAAM,CACR1D,MAAOqgB,EAAG3c,IACVrF,EAAIujB,GAAyB,IAAfI,EAAqBJ,EAAQ,IAC3CnY,EAAGoY,EACHxU,EAAGsU,EAASE,EACZI,EAAIpU,GAASA,EAAQ,GAAe,WAAThC,EAAoB7P,KAAKC,MAAQ,IAI/DokB,EAAGhT,EAAK/D,EAAQ/M,EAAItB,OAAUsB,EAAI4S,UAAU7F,EAAO/M,EAAItB,QAAU,QAEjEolB,EAAG3T,EAAa,YAATb,GAA8B,SAARtP,EAAiBuvB,GAAmCD,UAElFpY,GAAQrF,KAAK7R,KAAS8jB,EAAGS,EAAI,QACxBpd,IAAM2c,EAIoB,SAAhC2R,GAAgCj5B,OAC3B8C,EAAQ9C,EAAM8C,MAAM,KACvBsL,EAAItL,EAAM,GACVuL,EAAIvL,EAAM,IAAM,YACP,QAANsL,GAAqB,WAANA,GAAwB,SAANC,GAAsB,UAANA,IACpDrO,EAAQoO,EACRA,EAAIC,EACJA,EAAIrO,GAEL8C,EAAM,GAAKo2B,GAAkB9qB,IAAMA,EACnCtL,EAAM,GAAKo2B,GAAkB7qB,IAAMA,EAC5BvL,EAAMiS,KAAK,KAEC,SAApBokB,GAAqBxY,EAAOxF,MACvBA,EAAKlX,OAASkX,EAAKlX,MAAMoF,QAAU8R,EAAKlX,MAAM0D,KAAM,KAKtDmL,EAAMsmB,EAAiBv3B,EAJpBC,EAASqZ,EAAKrU,EACjB4gB,EAAQ5lB,EAAO4lB,MACfjC,EAAQtK,EAAKhM,EACb1B,EAAQ3L,EAAOC,SAEF,QAAV0jB,IAA6B,IAAVA,EACtBiC,EAAMiO,QAAU,GAChByD,EAAkB,WAGlBv3B,GADA4jB,EAAQA,EAAM3iB,MAAM,MACVZ,QACI,IAALL,GACRiR,EAAO2S,EAAM5jB,GACT+xB,GAAgB9gB,KACnBsmB,EAAkB,EAClBtmB,EAAiB,oBAATA,EAA8BshB,GAAuBH,IAE9DsD,GAAgBz1B,EAAQgR,GAGtBsmB,IACH7B,GAAgBz1B,EAAQmyB,IACpBxmB,IACHA,EAAMymB,KAAOpyB,EAAO01B,gBAAgB,aACpC6B,GAAgBv3B,EAAQ,GACxB2L,EAAM8hB,QAAU,EAChB8E,GAA6B3M,MA6Fd,SAAnB4R,GAAmBt5B,SAAoB,6BAAVA,GAAkD,SAAVA,IAAqBA,EACrD,SAArCu5B,GAAqCz3B,OAChC03B,EAAevE,GAAqBnzB,EAAQmyB,WACzCqF,GAAiBE,GAAgBC,GAAoBD,EAAa91B,OAAO,GAAGwB,MAAM+O,IAASE,IAAInR,IAE1F,SAAb02B,GAAc53B,EAAQ63B,OAIpB1zB,EAAQowB,EAAa9D,EAAMqH,EAHxBnsB,EAAQ3L,EAAOC,OAASO,GAAUR,GACrC4lB,EAAQ5lB,EAAO4lB,MACfmS,EAASN,GAAmCz3B,UAEzC2L,EAAMymB,KAAOpyB,EAAOY,aAAa,aAGP,iBAD7Bm3B,EAAS,EADTtH,EAAOzwB,EAAOiyB,UAAU+F,QAAQC,cAAcF,QAC/B11B,EAAGouB,EAAKrjB,EAAGqjB,EAAKje,EAAGie,EAAKjkB,EAAGikB,EAAKxK,EAAGwK,EAAK1T,IACxC9J,KAAK,KAA0B0kB,GAAoBI,GACxDA,IAAWJ,IAAsB33B,EAAOk4B,cAAgBl4B,IAAW0zB,IAAgB/nB,EAAMymB,MAEnG3B,EAAO7K,EAAM8O,QACb9O,EAAM8O,QAAU,SAChBvwB,EAASnE,EAAOq0B,aACAr0B,EAAOk4B,eACtBJ,EAAa,EACbvD,EAAcv0B,EAAOm4B,mBACrBzE,GAAYe,YAAYz0B,IAEzB+3B,EAASN,GAAmCz3B,GAC5CywB,EAAQ7K,EAAM8O,QAAUjE,EAAQgF,GAAgBz1B,EAAQ,WACpD83B,IACHvD,EAAcpwB,EAAO0wB,aAAa70B,EAAQu0B,GAAepwB,EAASA,EAAOswB,YAAYz0B,GAAU0zB,GAAYoB,YAAY90B,KAGjH63B,GAA2B,EAAhBE,EAAO33B,OAAc,CAAC23B,EAAO,GAAIA,EAAO,GAAIA,EAAO,GAAIA,EAAO,GAAIA,EAAO,IAAKA,EAAO,KAAOA,GAE9F,SAAlBK,GAAmBp4B,EAAQq4B,EAAQC,EAAkBC,EAAQC,EAAaC,OAgBxEtD,EAAQuD,EAAgBnsB,EAfrBZ,EAAQ3L,EAAOC,MAClB83B,EAASS,GAAeZ,GAAW53B,GAAQ,GAC3C24B,EAAahtB,EAAMitB,SAAW,EAC9BC,EAAaltB,EAAMmtB,SAAW,EAC9BC,EAAaptB,EAAMqtB,SAAW,EAC9BC,EAAattB,EAAMutB,SAAW,EAC9B72B,EAAI01B,EAAO,GACX3qB,EAAI2qB,EAAO,GACXvlB,EAAIulB,EAAO,GACXvrB,EAAIurB,EAAO,GACXoB,EAAKpB,EAAO,GACZqB,EAAKrB,EAAO,GACZsB,EAAchB,EAAOr3B,MAAM,KAC3B43B,EAAUj3B,WAAW03B,EAAY,KAAO,EACxCP,EAAUn3B,WAAW03B,EAAY,KAAO,EAEpCf,EAIMP,IAAWJ,KAAsBe,EAAer2B,EAAImK,EAAIY,EAAIoF,KAEtEjG,EAAIqsB,IAAYxrB,EAAIsrB,GAAeI,GAAWz2B,EAAIq2B,IAAiBr2B,EAAI+2B,EAAKhsB,EAAI+rB,GAAMT,EACtFE,EAFIA,GAAWpsB,EAAIksB,GAAeI,IAAYtmB,EAAIkmB,IAAiBlmB,EAAI4mB,EAAK5sB,EAAI2sB,GAAMT,EAGtFI,EAAUvsB,IANVqsB,GADAzD,EAASD,GAASl1B,IACDsM,IAAM+sB,EAAY,GAAGp3B,QAAQ,KAAO22B,EAAU,IAAMzD,EAAOE,MAAQuD,GACpFE,EAAU3D,EAAO5oB,KAAQ8sB,EAAY,IAAMA,EAAY,IAAIp3B,QAAQ,KAAQ62B,EAAU,IAAM3D,EAAOG,OAASwD,IAOxGP,IAAsB,IAAXA,GAAoB5sB,EAAM4sB,QACxCY,EAAKP,EAAUD,EACfS,EAAKN,EAAUD,EACfltB,EAAMqtB,QAAUD,GAAcI,EAAK92B,EAAI+2B,EAAK5mB,GAAK2mB,EACjDxtB,EAAMutB,QAAUD,GAAcE,EAAK/rB,EAAIgsB,EAAK5sB,GAAK4sB,GAEjDztB,EAAMqtB,QAAUrtB,EAAMutB,QAAU,EAEjCvtB,EAAMitB,QAAUA,EAChBjtB,EAAMmtB,QAAUA,EAChBntB,EAAM4sB,SAAWA,EACjB5sB,EAAM0sB,OAASA,EACf1sB,EAAM2sB,mBAAqBA,EAC3Bt4B,EAAO4lB,MAAM0M,IAAwB,UACjCmG,IACH9C,GAAkB8C,EAAyB9sB,EAAO,UAAWgtB,EAAYC,GACzEjD,GAAkB8C,EAAyB9sB,EAAO,UAAWktB,EAAYC,GACzEnD,GAAkB8C,EAAyB9sB,EAAO,UAAWotB,EAAYptB,EAAMqtB,SAC/ErD,GAAkB8C,EAAyB9sB,EAAO,UAAWstB,EAAYttB,EAAMutB,UAEhFl5B,EAAOwqB,aAAa,kBAAmBoO,EAAU,IAAME,GAsKtC,SAAlBQ,GAAmBt5B,EAAQuB,EAAOrD,OAC7BsvB,EAAOnjB,GAAQ9I,UACZL,GAAOS,WAAWJ,GAASI,WAAWm0B,GAAe91B,EAAQ,IAAK9B,EAAQ,KAAMsvB,KAAUA,EAmHxE,SAA1B+L,GAAmChU,EAAQvlB,EAAQd,EAAU8nB,EAAUgQ,OAMrEwC,EAAWhU,EALRiU,EAAM,IACT9J,EAAW1xB,EAAU+4B,GAErB7L,EADSxpB,WAAWq1B,IAAcrH,IAAaqH,EAAS/0B,QAAQ,OAAUy3B,GAAW,GACnE1S,EAClB2S,EAAc3S,EAAWmE,EAAU,aAEhCwE,IAEe,WADlB6J,EAAYxC,EAASh2B,MAAM,KAAK,MAE/BmqB,GAAUsO,KACKtO,QACdA,GAAWA,EAAS,EAAKsO,GAAOA,GAGhB,OAAdD,GAAsBrO,EAAS,EAClCA,GAAWA,EAASsO,MAAiBA,KAAUtO,EAASsO,GAAOA,EACvC,QAAdD,GAAgC,EAATrO,IACjCA,GAAWA,EAASsO,MAAiBA,KAAUtO,EAASsO,GAAOA,IAGjElU,EAAO1c,IAAM2c,EAAK,IAAIrU,GAAUoU,EAAO1c,IAAK7I,EAAQd,EAAU8nB,EAAUmE,EAAQ0F,IAChFrL,EAAGS,EAAI0T,EACPnU,EAAGnY,EAAI,MACPkY,EAAOzV,OAAO5G,KAAKhK,GACZsmB,EAEE,SAAVoU,GAAW55B,EAAQ65B,OACb,IAAIr2B,KAAKq2B,EACb75B,EAAOwD,GAAKq2B,EAAOr2B,UAEbxD,EAEc,SAAtB85B,GAAuBvU,EAAQwU,EAAY/5B,OAIzCg6B,EAAUx2B,EAAGuzB,EAAYC,EAAUhQ,EAAUF,EAAmBmQ,EAH7DgD,EAAaL,GAAQ,GAAI55B,EAAOC,OAEnC2lB,EAAQ5lB,EAAO4lB,UAeXpiB,KAbDy2B,EAAW7H,KACd2E,EAAa/2B,EAAOY,aAAa,aACjCZ,EAAOwqB,aAAa,YAAa,IACjC5E,EAAMuM,IAAkB4H,EACxBC,EAAWzC,GAAgBv3B,EAAQ,GACnCy1B,GAAgBz1B,EAAQmyB,IACxBnyB,EAAOwqB,aAAa,YAAauM,KAEjCA,EAAazD,iBAAiBtzB,GAAQmyB,IACtCvM,EAAMuM,IAAkB4H,EACxBC,EAAWzC,GAAgBv3B,EAAQ,GACnC4lB,EAAMuM,IAAkB4E,GAEfjF,IACTiF,EAAakD,EAAWz2B,OACxBwzB,EAAWgD,EAASx2B,KAlBV,gDAmB6BvB,QAAQuB,GAAK,IAGnDwjB,EAFY3c,GAAQ0sB,MACpBE,EAAU5sB,GAAQ2sB,IACmBlB,GAAe91B,EAAQwD,EAAGuzB,EAAYE,GAAWt1B,WAAWo1B,GACjGjQ,EAASnlB,WAAWq1B,GACpBzR,EAAO1c,IAAM,IAAIsI,GAAUoU,EAAO1c,IAAKmxB,EAAUx2B,EAAGwjB,EAAUF,EAASE,EAAU4J,IACjFrL,EAAO1c,IAAIwE,EAAI4pB,GAAW,EAC1B1R,EAAOzV,OAAO5G,KAAK1F,IAGrBo2B,GAAQI,EAAUC,OAh5BhBtvB,GAAMM,GAAMyoB,GAAaK,GAAgBH,GAA0BsG,GAAqBn3B,GAkG3F+wB,GDijGcqG,GAA4IzmB,GAA5IymB,OAAQC,GAAoI1mB,GAApI0mB,OAAQC,GAA4H3mB,GAA5H2mB,OAAQC,GAAoH5mB,GAApH4mB,OAAQC,GAA4G7mB,GAA5G6mB,OAAQxc,GAAoGrK,GAApGqK,OAAQyc,GAA4F9mB,GAA5F8mB,KAAMC,GAAsF/mB,GAAtF+mB,MAAOC,GAA+EhnB,GAA/EgnB,MAAOC,GAAwEjnB,GAAxEinB,MAAOC,GAAiElnB,GAAjEknB,OAAQC,GAAyDnnB,GAAzDmnB,QAASC,GAAgDpnB,GAAhDonB,KAAM5c,GAA0CxK,GAA1CwK,YAAa6c,GAA6BrnB,GAA7BqnB,OAAQC,GAAqBtnB,GAArBsnB,KAAMC,GAAevnB,GAAfunB,KAAMC,GAASxnB,GAATwnB,KCjpGjJpJ,GAAkB,GAClB4H,GAAW,IAAMv4B,KAAK6W,GACtBmjB,GAAWh6B,KAAK6W,GAAK,IACrBojB,GAASj6B,KAAKk6B,MAEd1I,GAAW,WACXyD,GAAiB,uCACjBkF,GAAc,YACdtJ,GAAmB,CAACuJ,UAAU,qBAAsBC,MAAM,gBAAiBC,MAAM,WAwBjFtJ,GAAiB,YACjBG,GAAuBH,GAAiB,SAwExCuJ,GAAY,qBAAqB16B,MAAM,KACvCwyB,GAAmB,SAAnBA,iBAAoBt0B,EAAUy8B,EAASC,OAErChtB,GADO+sB,GAAW/H,IACZhO,MACN7lB,EAAI,KACDb,KAAY0P,IAAMgtB,SACd18B,MAERA,EAAWA,EAASuC,OAAO,GAAGyP,cAAgBhS,EAAS0C,OAAO,GACvD7B,OAAU27B,GAAU37B,GAAGb,KAAa0P,YACnC7O,EAAI,EAAK,MAAe,IAANA,EAAW,KAAa,GAALA,EAAU27B,GAAU37B,GAAK,IAAMb,GA0F7Ew3B,GAAuB,CAACmF,IAAI,EAAGC,IAAI,EAAGC,KAAK,GAC3CnF,GAAsB,CAAC9pB,KAAK,EAAGkvB,KAAK,GAgDpC9J,GAAO,SAAPA,KAAQlyB,EAAQd,EAAUsuB,EAAMC,OAC3BvvB,SACJ61B,IAAkBN,KACbv0B,KAAY8yB,IAAkC,cAAb9yB,KACrCA,EAAW8yB,GAAiB9yB,IACd+C,QAAQ,OACrB/C,EAAWA,EAAS8B,MAAM,KAAK,IAG7B8wB,GAAgB5yB,IAA0B,cAAbA,GAChChB,EAAQq5B,GAAgBv3B,EAAQytB,GAChCvvB,EAAsB,oBAAbgB,EAAkChB,EAAMgB,GAAYhB,EAAMk0B,IAAMl0B,EAAMm6B,OAAS4D,GAAc9I,GAAqBnzB,EAAQsyB,KAAyB,IAAMp0B,EAAMg+B,QAAU,OAElLh+B,EAAQ8B,EAAO4lB,MAAM1mB,KACG,SAAVhB,IAAoBuvB,MAAavvB,EAAQ,IAAI+D,QAAQ,WAClE/D,EAASi+B,GAAcj9B,IAAai9B,GAAcj9B,GAAUc,EAAQd,EAAUsuB,IAAU2F,GAAqBnzB,EAAQd,IAAawB,GAAaV,EAAQd,KAA2B,YAAbA,EAAyB,EAAI,IAG7LsuB,MAAWtvB,EAAQ,IAAIoF,OAAOrB,QAAQ,KAAO6zB,GAAe91B,EAAQd,EAAUhB,EAAOsvB,GAAQA,EAAOtvB,GA6E5Gk5B,GAAoB,CAACgF,IAAI,KAAMC,OAAO,OAAQpvB,KAAK,KAAMqvB,MAAM,OAAQpwB,OAAO,OAgD9EiwB,GAAgB,CACfI,+BAAWhX,EAAQvlB,EAAQd,EAAU83B,EAAU70B,MAC3B,gBAAfA,EAAMkX,KAAwB,KAC7BmM,EAAKD,EAAO1c,IAAM,IAAIsI,GAAUoU,EAAO1c,IAAK7I,EAAQd,EAAU,EAAG,EAAGm4B,WACxE7R,EAAGnY,EAAI2pB,EACPxR,EAAG0F,IAAM,GACT1F,EAAGrjB,MAAQA,EACXojB,EAAOzV,OAAO5G,KAAKhK,GACZ,KA6EVy4B,GAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAC/B6E,GAAwB,GAkFxBjF,GAAkB,SAAlBA,gBAAmBv3B,EAAQytB,OACtB9hB,EAAQ3L,EAAOC,OAAS,IAAIK,GAAQN,MACpC,MAAO2L,IAAU8hB,IAAY9hB,EAAM8hB,eAC/B9hB,MAQPW,EAAGC,EAAGkwB,EAAGlL,EAAQC,EAAQkL,EAAUC,EAAWC,EAAWC,EAAOC,EAAOC,EAAanE,EAASE,EAC7Ff,EAAQiF,EAAO3kB,EAAKC,EAAKjW,EAAG+K,EAAGoF,EAAGhG,EAAGywB,EAAKC,EAAKC,EAAIC,EAAIC,EAAIC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAPjF/X,EAAQ5lB,EAAO4lB,MAClBgY,EAAiBjyB,EAAM4lB,OAAS,EAEhCsK,EAAM,MACNxI,EAAKC,iBAAiBtzB,GACtBq4B,EAASlF,GAAqBnzB,EAAQsyB,KAAyB,WAGhEhmB,EAAIC,EAAIkwB,EAAIC,EAAWC,EAAYC,EAAYC,EAAQC,EAAQC,EAAc,EAC7ExL,EAASC,EAAS,EAClB7lB,EAAMymB,OAASpyB,EAAOw1B,SAAUD,GAAOv1B,IAEnCqzB,EAAGb,YACe,SAAjBa,EAAGb,WAAqC,SAAba,EAAGmI,OAAkC,SAAdnI,EAAGwK,SACxDjY,EAAMuM,KAAoC,SAAjBkB,EAAGb,UAAuB,gBAAkBa,EAAGb,UAAY,QAAQxxB,MAAM,KAAKsB,MAAM,EAAG,GAAG2Q,KAAK,MAAQ,KAAO,KAAqB,SAAdogB,EAAGwK,OAAoB,UAAYxK,EAAGwK,OAAS,KAAO,KAAoB,SAAbxK,EAAGmI,MAAmB,SAAWnI,EAAGmI,MAAMx6B,MAAM,KAAKiS,KAAK,KAAO,KAAO,KAA8B,SAAvBogB,EAAGlB,IAA6BkB,EAAGlB,IAAkB,KAEhVvM,EAAM4V,MAAQ5V,EAAMiY,OAASjY,EAAM4M,UAAY,QAGhDuF,EAASH,GAAW53B,EAAQ2L,EAAMymB,KAC9BzmB,EAAMymB,MAIR+K,EAHGxxB,EAAM8hB,SACT2P,EAAKp9B,EAAO20B,UACZ0D,EAAU1sB,EAAMitB,QAAUwE,EAAG9wB,EAAK,OAASX,EAAMmtB,QAAUsE,EAAG7wB,GAAK,KAC9D,KAECkhB,GAAWztB,EAAOY,aAAa,mBAEtCw3B,GAAgBp4B,EAAQm9B,GAAM9E,IAAU8E,GAAMxxB,EAAM2sB,kBAAmC,IAAjB3sB,EAAM4sB,OAAkBR,IAE/Fa,EAAUjtB,EAAMitB,SAAW,EAC3BE,EAAUntB,EAAMmtB,SAAW,EACvBf,IAAWJ,KACdt1B,EAAI01B,EAAO,GACX3qB,EAAI2qB,EAAO,GACXvlB,EAAIulB,EAAO,GACXvrB,EAAIurB,EAAO,GACXzrB,EAAI2wB,EAAMlF,EAAO,GACjBxrB,EAAI2wB,EAAMnF,EAAO,GAGK,IAAlBA,EAAO33B,QACVmxB,EAASpwB,KAAKgX,KAAK9V,EAAIA,EAAI+K,EAAIA,GAC/BokB,EAASrwB,KAAKgX,KAAK3L,EAAIA,EAAIgG,EAAIA,GAC/BkqB,EAAYr6B,GAAK+K,EAAKguB,GAAOhuB,EAAG/K,GAAKq3B,GAAW,GAChDmD,EAASrqB,GAAKhG,EAAK4uB,GAAO5oB,EAAGhG,GAAKktB,GAAWgD,EAAW,KAC9ClL,GAAUrwB,KAAK+F,IAAI/F,KAAKkX,IAAIwkB,EAAQ1B,MAC1CxvB,EAAMymB,MACT9lB,GAAKssB,GAAWA,EAAUv2B,EAAIy2B,EAAUtmB,GACxCjG,GAAKusB,GAAWF,EAAUxrB,EAAI0rB,EAAUtsB,MAKzCmxB,EAAM5F,EAAO,GACb0F,EAAM1F,EAAO,GACbuF,EAAMvF,EAAO,GACbwF,EAAMxF,EAAO,GACbyF,EAAMzF,EAAO,IACb2F,EAAM3F,EAAO,IACbzrB,EAAIyrB,EAAO,IACXxrB,EAAIwrB,EAAO,IACX0E,EAAI1E,EAAO,IAGX4E,GADAK,EAAQ5B,GAAOuC,EAAKH,IACA9D,GAEhBsD,IAGHG,EAAKF,GAFL5kB,EAAMlX,KAAKkX,KAAK2kB,IAEHM,GADbhlB,EAAMnX,KAAKmX,KAAK0kB,IAEhBI,EAAKF,EAAI7kB,EAAIklB,EAAIjlB,EACjB+kB,EAAKM,EAAItlB,EAAImlB,EAAIllB,EACjBglB,EAAML,GAAK3kB,EAAIglB,EAAIjlB,EACnBklB,EAAML,GAAK5kB,EAAIilB,EAAIllB,EACnBmlB,EAAMG,GAAKrlB,EAAIklB,EAAInlB,EACnBqlB,EAAMD,GAAKnlB,EAAIolB,EAAIrlB,EACnB4kB,EAAME,EACND,EAAME,EACNO,EAAMN,GAIPT,GADAI,EAAQ5B,IAAQ5oB,EAAGgrB,IACC9D,GAChBsD,IACH3kB,EAAMlX,KAAKkX,KAAK2kB,GAKhBU,EAAMlxB,GAJN8L,EAAMnX,KAAKmX,KAAK0kB,IAIJU,EAAIrlB,EAChBhW,EAJA86B,EAAK96B,EAAEgW,EAAIilB,EAAIhlB,EAKflL,EAJAgwB,EAAKhwB,EAAEiL,EAAIklB,EAAIjlB,EAKf9F,EAJA6qB,EAAK7qB,EAAE6F,EAAImlB,EAAIllB,GAQhBokB,GADAM,EAAQ5B,GAAOhuB,EAAG/K,IACCq3B,GACfsD,IAGHG,EAAK96B,GAFLgW,EAAMlX,KAAKkX,IAAI2kB,IAEJ5vB,GADXkL,EAAMnX,KAAKmX,IAAI0kB,IAEfI,EAAKH,EAAI5kB,EAAI6kB,EAAI5kB,EACjBlL,EAAIA,EAAEiL,EAAIhW,EAAEiW,EACZ4kB,EAAMA,EAAI7kB,EAAI4kB,EAAI3kB,EAClBjW,EAAI86B,EACJF,EAAMG,GAGHT,GAAwD,MAA3Cx7B,KAAK+F,IAAIy1B,GAAax7B,KAAK+F,IAAIw1B,KAC/CC,EAAYD,EAAW,EACvBE,EAAY,IAAMA,GAEnBrL,EAASrwB,GAAOC,KAAKgX,KAAK9V,EAAIA,EAAI+K,EAAIA,EAAIoF,EAAIA,IAC9Cgf,EAAStwB,GAAOC,KAAKgX,KAAK+kB,EAAMA,EAAMS,EAAMA,IAC5CX,EAAQ5B,GAAO6B,EAAKC,GACpBL,EAA2B,KAAlB17B,KAAK+F,IAAI81B,GAAmBA,EAAQtD,GAAW,EACxDqD,EAAcW,EAAM,GAAMA,EAAM,GAAMA,EAAMA,GAAO,GAGhD/xB,EAAMymB,MACT+K,EAAKn9B,EAAOY,aAAa,aACzB+K,EAAMmyB,SAAW99B,EAAOwqB,aAAa,YAAa,MAASgN,GAAiBrE,GAAqBnzB,EAAQmyB,KACzGgL,GAAMn9B,EAAOwqB,aAAa,YAAa2S,KAInB,GAAlBh8B,KAAK+F,IAAI21B,IAAe17B,KAAK+F,IAAI21B,GAAS,MACzCe,GACHrM,IAAW,EACXsL,GAAUH,GAAY,EAAK,KAAO,IAClCA,GAAaA,GAAY,EAAK,KAAO,MAErClL,IAAW,EACXqL,GAAUA,GAAS,EAAK,KAAO,MAGjCpP,EAAUA,GAAW9hB,EAAM8hB,QAC3B9hB,EAAMW,EAAIA,IAAMX,EAAMoyB,SAAWzxB,KAAQmhB,GAAW9hB,EAAMoyB,WAAc58B,KAAKC,MAAMpB,EAAOg+B,YAAc,KAAO78B,KAAKC,OAAOkL,IAAM,GAAK,KAAOtM,EAAOg+B,YAAcryB,EAAMoyB,SAAW,IAAM,GAxInL,KAyINpyB,EAAMY,EAAIA,IAAMZ,EAAMsyB,SAAW1xB,KAAQkhB,GAAW9hB,EAAMsyB,WAAc98B,KAAKC,MAAMpB,EAAOk+B,aAAe,KAAO/8B,KAAKC,OAAOmL,IAAM,GAAK,KAAOvM,EAAOk+B,aAAevyB,EAAMsyB,SAAW,IAAM,GAzIrL,KA0INtyB,EAAM8wB,EAAIA,EA1IJ,KA2IN9wB,EAAM4lB,OAASrwB,GAAOqwB,GACtB5lB,EAAM6lB,OAAStwB,GAAOswB,GACtB7lB,EAAM+wB,SAAWx7B,GAAOw7B,GAAYb,EACpClwB,EAAMgxB,UAAYz7B,GAAOy7B,GAAad,EACtClwB,EAAMixB,UAAY17B,GAAO07B,GAAaf,EACtClwB,EAAMkxB,MAAQA,EAAQhB,EACtBlwB,EAAMmxB,MAAQA,EAAQjB,EACtBlwB,EAAMwyB,qBAAuBpB,EAlJvB,MAmJDpxB,EAAMuwB,QAAUv6B,WAAW02B,EAAOr3B,MAAM,KAAK,KAAO,KACxD4kB,EAAM0M,IAAwB2J,GAAc5D,IAE7C1sB,EAAMqtB,QAAUrtB,EAAMutB,QAAU,EAChCvtB,EAAM8L,QAAUF,EAAQE,QACxB9L,EAAM+lB,gBAAkB/lB,EAAMymB,IAAMgM,GAAuBtK,GAAcuK,GAAuBC,GAChG3yB,EAAM8hB,QAAU,EACT9hB,GAERswB,GAAgB,SAAhBA,cAAgB/9B,UAAUA,EAAQA,EAAM8C,MAAM,MAAM,GAAK,IAAM9C,EAAM,IAKrEogC,GAAyB,SAAzBA,uBAA0Bzf,EAAOlT,GAChCA,EAAM8wB,EAAI,MACV9wB,EAAMixB,UAAYjxB,EAAMgxB,UAAY,OACpChxB,EAAM8L,QAAU,EAChB4mB,GAAqBxf,EAAOlT,IAE7B4yB,GAAW,OACXC,GAAU,MACVC,GAAkB,KAClBJ,GAAuB,SAAvBA,qBAAgCxf,EAAOlT,SAC4GA,GAAS2S,KAAtJyf,IAAAA,SAAUE,IAAAA,SAAU3xB,IAAAA,EAAGC,IAAAA,EAAGkwB,IAAAA,EAAGC,IAAAA,SAAUE,IAAAA,UAAWD,IAAAA,UAAWE,IAAAA,MAAOC,IAAAA,MAAOvL,IAAAA,OAAQC,IAAAA,OAAQ2M,IAAAA,qBAAsB1mB,IAAAA,QAASzX,IAAAA,OAAQk8B,IAAAA,QACtInC,EAAa,GACb2E,EAAqB,SAAZjnB,GAAsBoH,GAAmB,IAAVA,IAA4B,IAAZpH,KAGrDykB,IAAYS,IAAc4B,IAAY3B,IAAc2B,IAAW,KAIjElmB,EAHG2kB,EAAQr7B,WAAWi7B,GAAazB,GACnCmC,EAAMn8B,KAAKmX,IAAI0kB,GACfQ,EAAMr8B,KAAKkX,IAAI2kB,GAEhBA,EAAQr7B,WAAWg7B,GAAaxB,GAChC9iB,EAAMlX,KAAKkX,IAAI2kB,GACf1wB,EAAIgtB,GAAgBt5B,EAAQsM,EAAGgxB,EAAMjlB,GAAO6jB,GAC5C3vB,EAAI+sB,GAAgBt5B,EAAQuM,GAAIpL,KAAKmX,IAAI0kB,IAAUd,GACnDO,EAAInD,GAAgBt5B,EAAQy8B,EAAGe,EAAMnlB,GAAO6jB,EAAUA,GAGnDiC,IAAyBK,KAC5BzE,GAAc,eAAiBoE,EAAuBM,KAEnDV,GAAYE,KACflE,GAAc,aAAegE,EAAW,MAAQE,EAAW,QAExDS,GAASpyB,IAAMkyB,IAAWjyB,IAAMiyB,IAAW/B,IAAM+B,KACpDzE,GAAe0C,IAAM+B,IAAWE,EAAS,eAAiBpyB,EAAI,KAAOC,EAAI,KAAOkwB,EAAI,KAAO,aAAenwB,EAAI,KAAOC,EAAIkyB,IAEtH/B,IAAa6B,KAChBxE,GAAc,UAAY2C,EAAW+B,IAElC7B,IAAc2B,KACjBxE,GAAc,WAAa6C,EAAY6B,IAEpC9B,IAAc4B,KACjBxE,GAAc,WAAa4C,EAAY8B,IAEpC5B,IAAU0B,IAAYzB,IAAUyB,KACnCxE,GAAc,QAAU8C,EAAQ,KAAOC,EAAQ2B,IAEjC,IAAXlN,GAA2B,IAAXC,IACnBuI,GAAc,SAAWxI,EAAS,KAAOC,EAASiN,IAEnDz+B,EAAO4lB,MAAMuM,IAAkB4H,GAAc,mBAE9CqE,GAAuB,SAAvBA,qBAAgCvf,EAAOlT,OAIrCgzB,EAAKC,EAAK3B,EAAKC,EAAKzM,IAH0G9kB,GAAS2S,KAAnIyf,IAAAA,SAAUE,IAAAA,SAAU3xB,IAAAA,EAAGC,IAAAA,EAAGmwB,IAAAA,SAAUG,IAAAA,MAAOC,IAAAA,MAAOvL,IAAAA,OAAQC,IAAAA,OAAQxxB,IAAAA,OAAQ44B,IAAAA,QAASE,IAAAA,QAASE,IAAAA,QAASE,IAAAA,QAAS4E,IAAAA,SAClH3E,EAAKx3B,WAAW2K,GAChB8sB,EAAKz3B,WAAW4K,GAEjBmwB,EAAW/6B,WAAW+6B,GACtBG,EAAQl7B,WAAWk7B,IACnBC,EAAQn7B,WAAWm7B,MAGlBD,GADAC,EAAQn7B,WAAWm7B,GAEnBJ,GAAYI,GAETJ,GAAYG,GACfH,GAAYvB,GACZ0B,GAAS1B,GACTwD,EAAMx9B,KAAKkX,IAAIqkB,GAAYnL,EAC3BqN,EAAMz9B,KAAKmX,IAAIokB,GAAYnL,EAC3B0L,EAAM97B,KAAKmX,IAAIokB,EAAWG,IAAUrL,EACpC0L,EAAM/7B,KAAKkX,IAAIqkB,EAAWG,GAASrL,EAC/BqL,IACHC,GAAS3B,GACT1K,EAAOtvB,KAAK09B,IAAIhC,EAAQC,GAExBG,GADAxM,EAAOtvB,KAAKgX,KAAK,EAAIsY,EAAOA,GAE5ByM,GAAOzM,EACHqM,IACHrM,EAAOtvB,KAAK09B,IAAI/B,GAEhB6B,GADAlO,EAAOtvB,KAAKgX,KAAK,EAAIsY,EAAOA,GAE5BmO,GAAOnO,IAGTkO,EAAMz9B,GAAOy9B,GACbC,EAAM19B,GAAO09B,GACb3B,EAAM/7B,GAAO+7B,GACbC,EAAMh8B,GAAOg8B,KAEbyB,EAAMpN,EACN2L,EAAM1L,EACNoN,EAAM3B,EAAM,IAER9D,MAAS7sB,EAAI,IAAIrK,QAAQ,OAAWm3B,MAAS7sB,EAAI,IAAItK,QAAQ,SACjEk3B,EAAKrD,GAAe91B,EAAQ,IAAKsM,EAAG,MACpC8sB,EAAKtD,GAAe91B,EAAQ,IAAKuM,EAAG,QAEjCqsB,GAAWE,GAAWE,GAAWE,KACpCC,EAAKj4B,GAAOi4B,EAAKP,GAAWA,EAAU+F,EAAM7F,EAAUmE,GAAOjE,GAC7DI,EAAKl4B,GAAOk4B,EAAKN,GAAWF,EAAUgG,EAAM9F,EAAUoE,GAAOhE,KAE1D6E,GAAYE,KAEfxN,EAAOzwB,EAAO20B,UACdwE,EAAKj4B,GAAOi4B,EAAK4E,EAAW,IAAMtN,EAAK4E,OACvC+D,EAAKl4B,GAAOk4B,EAAK6E,EAAW,IAAMxN,EAAK6E,SAExC7E,EAAO,UAAYkO,EAAM,IAAMC,EAAM,IAAM3B,EAAM,IAAMC,EAAM,IAAM/D,EAAK,IAAMC,EAAK,IACnFp5B,EAAOwqB,aAAa,YAAaiG,GACjCqN,IAAa99B,EAAO4lB,MAAMuM,IAAkB1B,IAsE9C5vB,GAAa,8BAA+B,SAACpB,EAAMgP,OAEjDoD,EAAI,QACJzE,EAAI,SACJpL,EAAI,OACJ2hB,GAASlV,EAAQ,EAAI,CAJd,MAIiBoD,EAAEzE,EAAEpL,GAAK,CAJ1B,MAI6BA,EAJ7B,MAIkC6P,EAAGzE,EAAEyE,EAAGzE,EAAEpL,IAAIqQ,IAAI,SAAAysB,UAAQrwB,EAAQ,EAAIhP,EAAOq/B,EAAO,SAAWA,EAAOr/B,IAChH08B,GAAuB,EAAR1tB,EAAY,SAAWhP,EAAOA,GAAS,SAAS8lB,EAAQvlB,EAAQd,EAAU83B,EAAU70B,OAC9FE,EAAG6B,KACHwa,UAAUte,OAAS,SACtBiC,EAAIshB,EAAMtR,IAAI,SAAArB,UAAQkhB,GAAK3M,EAAQvU,EAAM9R,KAEN,KADnCgF,EAAO7B,EAAE4Q,KAAK,MACFjS,MAAMqB,EAAE,IAAIjC,OAAeiC,EAAE,GAAK6B,EAE/C7B,GAAK20B,EAAW,IAAIh2B,MAAM,KAC1BkD,EAAO,GACPyf,EAAM1iB,QAAQ,SAAC+P,EAAMjR,UAAMmE,EAAK8M,GAAQ3O,EAAEtC,GAAKsC,EAAEtC,IAAMsC,GAAKtC,EAAI,GAAK,EAAK,KAC1EwlB,EAAO1V,KAAK7P,EAAQkE,EAAM/B,UAoLlB48B,GAAkBrC,GACvBsC,GAhLQC,GAAY,CACxBx/B,KAAM,MACNmR,SAAU6iB,GACVpzB,+BAAWL,UACHA,EAAO4lB,OAAS5lB,EAAO0K,UAE/BmF,mBAAK7P,EAAQkE,EAAM/B,EAAOsM,EAAO5O,OAI/Bk3B,EAAYC,EAAUlQ,EAAQE,EAAUpd,EAAMs1B,EAAa17B,EAAG0zB,EAAWD,EAASkI,EAAUC,EAAoBC,EAAoB1zB,EAAO4sB,EAAQ9Q,EAAa6X,EAH7J3b,EAAQrF,KAAKxO,OAChB8V,EAAQ5lB,EAAO4lB,MACf1b,EAAU/H,EAAM+B,KAAKgG,YAOjB1G,KALLuwB,IAAkBN,UAEb8L,OAASjhB,KAAKihB,QAAU3M,GAAe5yB,GAC5Cs/B,EAAchhB,KAAKihB,OAAO5b,WACrBxhB,MAAQA,EACH+B,KACC,cAANV,IAGJwzB,EAAW9yB,EAAKV,IACZsN,GAAStN,KAAM8hB,GAAa9hB,EAAGU,EAAM/B,EAAOsM,EAAOzO,EAAQH,OAG/D+J,SAAcotB,EACdkI,EAAc/C,GAAc34B,GACf,aAAToG,IAEHA,SADAotB,EAAWA,EAAS9c,KAAK/X,EAAOsM,EAAOzO,EAAQH,KAGnC,WAAT+J,IAAsBotB,EAAS/0B,QAAQ,aAC1C+0B,EAAWtoB,GAAesoB,IAEvBkI,EACHA,EAAY5gB,KAAMte,EAAQwD,EAAGwzB,EAAU70B,KAAWslB,EAAc,QAC1D,GAAsB,OAAlBjkB,EAAE5B,OAAO,EAAE,GACrBm1B,GAAczD,iBAAiBtzB,GAAQuzB,iBAAiB/vB,GAAK,IAAIF,OACjE0zB,GAAY,GACZvkB,GAAUa,UAAY,EACjBb,GAAUc,KAAKwjB,KACnBG,EAAY7sB,GAAQ0sB,GACpBE,EAAU5sB,GAAQ2sB,IAEnBC,EAAUC,IAAcD,IAAYF,EAAajB,GAAe91B,EAAQwD,EAAGuzB,EAAYE,GAAWA,GAAWC,IAAcF,GAAYE,QAClIjnB,IAAI2V,EAAO,cAAemR,EAAYC,EAAUvoB,EAAO5O,EAAS,EAAG,EAAG2D,GAC3EmgB,EAAMza,KAAK1F,GACX87B,EAAYp2B,KAAK1F,EAAG,EAAGoiB,EAAMpiB,SACvB,GAAa,cAAToG,EAAsB,IAC5BM,GAAW1G,KAAK0G,GACnB6sB,EAAoC,mBAAhB7sB,EAAQ1G,GAAqB0G,EAAQ1G,GAAG0W,KAAK/X,EAAOsM,EAAOzO,EAAQH,GAAWqK,EAAQ1G,GAC1GvF,EAAU84B,KAAgBA,EAAW90B,QAAQ,aAAe80B,EAAaroB,GAAeqoB,IACxF1sB,GAAQ0sB,EAAa,MAAQA,GAAcxf,EAAQI,MAAMnU,IAAM6G,GAAQ6nB,GAAKlyB,EAAQwD,KAAO,IAC3D,OAA/BuzB,EAAa,IAAIt1B,OAAO,KAAes1B,EAAa7E,GAAKlyB,EAAQwD,KAElEuzB,EAAa7E,GAAKlyB,EAAQwD,GAE3BwjB,EAAWrlB,WAAWo1B,IACtBoI,EAAqB,WAATv1B,GAA4C,MAAvBotB,EAASv1B,OAAO,IAAeu1B,EAASp1B,OAAO,EAAG,MACtEo1B,EAAWA,EAASp1B,OAAO,IACxCklB,EAASnlB,WAAWq1B,GAChBxzB,KAAKwuB,KACE,cAANxuB,IACc,IAAbwjB,GAAiD,WAA/BkL,GAAKlyB,EAAQ,eAA8B8mB,IAChEE,EAAW,GAEZsY,EAAYp2B,KAAK,aAAc,EAAG0c,EAAM4Z,YACxC7J,GAAkBrX,KAAMsH,EAAO,aAAcoB,EAAW,UAAY,SAAUF,EAAS,UAAY,UAAWA,IAErG,UAANtjB,GAAuB,cAANA,KACpBA,EAAIwuB,GAAiBxuB,IAClBvB,QAAQ,OAASuB,EAAIA,EAAExC,MAAM,KAAK,KAIvCo+B,EAAsB57B,KAAKsuB,WAIrByN,OAAOxM,KAAKvvB,GACZ67B,KACJ1zB,EAAQ3L,EAAOC,OACRyxB,kBAAoBxtB,EAAKu7B,gBAAmBlI,GAAgBv3B,EAAQkE,EAAKu7B,gBAChFlH,GAAgC,IAAtBr0B,EAAKw7B,cAA0B/zB,EAAM4sB,QAC/C8G,EAAqB/gB,KAAKzV,IAAM,IAAIsI,GAAUmN,KAAKzV,IAAK+c,EAAOuM,GAAgB,EAAG,EAAGxmB,EAAM+lB,gBAAiB/lB,EAAO,GAAI,IACpGmf,IAAM,GAEhB,UAANtnB,OACEqF,IAAM,IAAIsI,GAAUmN,KAAKzV,IAAK8C,EAAO,SAAUA,EAAM6lB,QAAU2N,EAAW79B,GAAeqK,EAAM6lB,OAAQ2N,EAAWrY,GAAUA,GAAUnb,EAAM6lB,QAAW,EAAGZ,SAC1J/nB,IAAIwE,EAAI,EACbsW,EAAMza,KAAK,SAAU1F,GACrBA,GAAK,QACC,CAAA,GAAU,oBAANA,EAAyB,CACnC87B,EAAYp2B,KAAKopB,GAAsB,EAAG1M,EAAM0M,KAChD0E,EAAWG,GAA8BH,GACrCrrB,EAAMymB,IACTgG,GAAgBp4B,EAAQg3B,EAAU,EAAGuB,EAAQ,EAAGja,QAEhD2Y,EAAUt1B,WAAWq1B,EAASh2B,MAAM,KAAK,KAAO,KACpC2K,EAAMuwB,SAAWvG,GAAkBrX,KAAM3S,EAAO,UAAWA,EAAMuwB,QAASjF,GACtFtB,GAAkBrX,KAAMsH,EAAOpiB,EAAGy4B,GAAclF,GAAakF,GAAcjF,cAGtE,GAAU,cAANxzB,EAAmB,CAC7B40B,GAAgBp4B,EAAQg3B,EAAU,EAAGuB,EAAQ,EAAGja,eAE1C,GAAI9a,KAAKg5B,GAAuB,CACtCjD,GAAwBjb,KAAM3S,EAAOnI,EAAGwjB,EAAUmY,EAAW79B,GAAe0lB,EAAUmY,EAAWnI,GAAYA,YAGvG,GAAU,iBAANxzB,EAAsB,CAChCmyB,GAAkBrX,KAAM3S,EAAO,SAAUA,EAAM4sB,OAAQvB,YAEjD,GAAU,YAANxzB,EAAiB,CAC3BmI,EAAMnI,GAAKwzB,WAEL,GAAU,cAANxzB,EAAmB,CAC7Bs2B,GAAoBxb,KAAM0Y,EAAUh3B,kBAGzBwD,KAAKoiB,IACjBpiB,EAAIgwB,GAAiBhwB,IAAMA,MAGxB47B,IAAwBtY,GAAqB,IAAXA,KAAkBE,GAAyB,IAAbA,KAAoBsU,GAAY/nB,KAAKyjB,IAAcxzB,KAAKoiB,EAEhHkB,EAAXA,GAAoB,GADpBoQ,GAAaH,EAAa,IAAIn1B,QAAQolB,EAAW,IAAI5mB,YAErD62B,EAAU5sB,GAAQ2sB,KAAexzB,KAAK+T,EAAQI,MAASJ,EAAQI,MAAMnU,GAAK0zB,MAChDlQ,EAAW8O,GAAe91B,EAAQwD,EAAGuzB,EAAYE,SACtEpuB,IAAM,IAAIsI,GAAUmN,KAAKzV,IAAKu2B,EAAqBzzB,EAAQia,EAAOpiB,EAAGwjB,GAAWmY,EAAW79B,GAAe0lB,EAAUmY,EAAWrY,GAAUA,GAAUE,EAAYoY,GAAmC,OAAZnI,GAA0B,WAANzzB,IAAsC,IAAnBU,EAAKy7B,UAA+C/O,GAAxBG,SACzPloB,IAAIwE,EAAI4pB,GAAW,EACpBC,IAAcD,GAAuB,MAAZA,SACvBpuB,IAAIuE,EAAI2pB,OACRluB,IAAIgJ,EAAIif,SAER,GAAMttB,KAAKoiB,EAQjBiR,GAAuB3c,KAAKoE,KAAMte,EAAQwD,EAAGuzB,EAAYoI,EAAWA,EAAWnI,EAAWA,WAPtFxzB,KAAKxD,OACHiQ,IAAIjQ,EAAQwD,EAAGuzB,GAAc/2B,EAAOwD,GAAI27B,EAAWA,EAAWnI,EAAWA,EAAUvoB,EAAO5O,QACzF,GAAU,mBAAN2D,EAAwB,CAClCvE,EAAeuE,EAAGwzB,YAMpBoI,IAAuB57B,KAAKoiB,EAAQ0Z,EAAYp2B,KAAK1F,EAAG,EAAGoiB,EAAMpiB,IAAM87B,EAAYp2B,KAAK1F,EAAG,EAAGuzB,GAAc/2B,EAAOwD,KACnHmgB,EAAMza,KAAK1F,GAGbikB,GAAeY,GAA0B/J,OAG1C7b,uBAAOoc,EAAOxF,MACTA,EAAKlX,MAAMoF,QAAUxE,aACpByiB,EAAKnM,EAAKxQ,IACP2c,GACNA,EAAG3T,EAAEgN,EAAO2G,EAAGhZ,GACfgZ,EAAKA,EAAGrgB,WAGTkU,EAAKkmB,OAAOr5B,UAGdsK,IAAK0hB,GACLvhB,QAASqhB,GACTvhB,6BAAUzQ,EAAQd,EAAUqmB,OACvB/hB,EAAIwuB,GAAiB9yB,UACxBsE,GAAKA,EAAEvB,QAAQ,KAAO,IAAO/C,EAAWsE,GACjCtE,KAAY4yB,IAAmB5yB,IAAaozB,KAAyBtyB,EAAOC,MAAMqM,GAAK4lB,GAAKlyB,EAAQ,MAAUulB,GAAU2U,KAAwB3U,EAAuB,UAAbrmB,EAAuBoyB,GAAeD,IAAqB6I,GAAsB3U,GAAU,MAAqB,UAAbrmB,EAAuBuyB,GAAyBE,IAA+B3xB,EAAO4lB,QAAUvnB,EAAa2B,EAAO4lB,MAAM1mB,IAAagyB,IAAmBhyB,EAAS+C,QAAQ,KAAOkvB,GAAiBzgB,GAAW1Q,EAAQd,IAE5d+wB,KAAM,CAAEwF,gBAAAA,GAAiBmC,WAAAA,KAI1B54B,GAAK4vB,MAAMgR,YAAcpM,GACzBx0B,GAAKixB,KAAK4P,cAAgBjN,GAErBoM,GAAMn+B,IADDk+B,GAQP,+CAPwC,KADfrC,GAQsB,4CAPU,iFAAc,SAAAj9B,GAASqyB,GAAgBryB,GAAQ,IAC1GoB,GAAa67B,GAAU,SAAAj9B,GAAS8X,EAAQI,MAAMlY,GAAQ,MAAO+8B,GAAsB/8B,GAAQ,IAC3FuyB,GAAiBgN,GAAI,KAAOD,GAAmB,IAAMrC,GACrD77B,GAI8K,6FAJxJ,SAAApB,OACjBuB,EAAQvB,EAAKuB,MAAM,KACvBgxB,GAAiBhxB,EAAM,IAAMg+B,GAAIh+B,EAAM,MAGzCH,GAAa,+EAAgF,SAAApB,GAAS8X,EAAQI,MAAMlY,GAAQ,OAE5HT,GAAKquB,eAAe4R,QC/mCda,GAAc9gC,GAAKquB,eAAe4R,KAAcjgC,GACrD+gC,GAAkBD,GAAY7P,KAAK9lB"} \ No newline at end of file diff --git a/attachments/russia/js/moonMain.js b/attachments/russia/js/moonMain.js new file mode 100644 index 0000000..bf9916e --- /dev/null +++ b/attachments/russia/js/moonMain.js @@ -0,0 +1,324 @@ + +// PARSING +//--------------------------------------------------------------- + +// Graph plotter function take from +// From http://blog.hvidtfeldts.net/index.php/2011/07/plotting-high-frequency-functions-using-a-gpu/ +var preFunction = "\n\ +#ifdef GL_ES\n\ +precision mediump float;\n\ +#endif\n\ +\n\ +#define PI 3.14159265359\n\ +\n\ +uniform vec2 u_resolution;\n\ +uniform vec2 u_mouse;\n\ +uniform float u_time;\n\ +\n\ +float lineJitter = 0.5;\n\ +float lineWidth = 7.0;\n\ +float gridWidth = 1.7;\n\ +float scale = 0.0013;\n\ +float zoom = 2.5;\n\ +vec2 offset = vec2(0.5);\n\ +\n\ +float rand (in float _x) {\n\ + return fract(sin(_x)*1e4);\n\ +}\n\ +\n\ +float rand (in vec2 co) {\n\ + return fract(sin(dot(co.xy,vec2(12.9898,78.233)))*43758.5453);\n\ +}\n\ +\n\ +float noise (in float _x) {\n\ + float i = floor(_x);\n\ + float f = fract(_x);\n\ + float u = f * f * (3.0 - 2.0 * f);\n\ + return mix(rand(i), rand(i + 1.0), u);\n\ +}\n\ +\n\ +float noise (in vec2 _st) {\n\ + vec2 i = floor(_st);\n\ + vec2 f = fract(_st);\n\ + // Four corners in 2D of a tile\n\ + float a = rand(i);\n\ + float b = rand(i + vec2(1.0, 0.0));\n\ + float c = rand(i + vec2(0.0, 1.0));\n\ + float d = rand(i + vec2(1.0, 1.0));\n\ + vec2 u = f * f * (3.0 - 2.0 * f);\n\ + return mix(a, b, u.x) + \n\ + (c - a)* u.y * (1.0 - u.x) + \n\ + (d - b) * u.x * u.y;\n\ +}\n\ +\n\ +float function(in float x) {\n\ + float y = 0.0;\n"; + +var postFunction = "\n\ + return y;\n\ +}\n\ +\n\ +vec3 plot2D(in vec2 _st, in float _width ) {\n\ + const float samples = 3.0;\n\ +\n\ + vec2 steping = _width*vec2(scale)/samples;\n\ + \n\ + float count = 0.0;\n\ + float mySamples = 0.0;\n\ + for (float i = 0.0; i < samples; i++) {\n\ + for (float j = 0.0;j < samples; j++) {\n\ + if (i*i+j*j>samples*samples) \n\ + continue;\n\ + mySamples++;\n\ + float ii = i + lineJitter*rand(vec2(_st.x+ i*steping.x,_st.y+ j*steping.y));\n\ + float jj = j + lineJitter*rand(vec2(_st.y + i*steping.x,_st.x+ j*steping.y));\n\ + float f = function(_st.x+ ii*steping.x)-(_st.y+ jj*steping.y);\n\ + count += (f>0.) ? 1.0 : -1.0;\n\ + }\n\ + }\n\ + vec3 color = vec3(1.0);\n\ + if (abs(count)!=mySamples)\n\ + color = vec3(abs(float(count))/float(mySamples));\n\ + return color;\n\ +}\n\ +\n\ +vec3 grid2D( in vec2 _st, in float _width ) {\n\ + float axisDetail = _width*scale;\n\ + if (abs(_st.x){ + styleCodeBlocks(); + loadGlslElements(); + captionizeImages(); + // window.scrollTo(0, 0); + // setTimeout(function () { + // window.scrollTo(0, 0); + // }, 500); +}; +/* +window.addEventListener("load", function(){ + // enableThemeSwitcher(); + styleCodeBlocks(); + loadGlslElements(); + captionizeImages(); + window.scrollTo(0, 0); + setTimeout(function () { + window.scrollTo(0, 0); + }, 500); + }); + */ diff --git a/attachments/russia/js/pannellum.css b/attachments/russia/js/pannellum.css new file mode 100644 index 0000000..592b034 --- /dev/null +++ b/attachments/russia/js/pannellum.css @@ -0,0 +1,2 @@ +/* Pannellum 2.5.6, https://github.com/mpetroff/pannellum */ +.pnlm-container{margin:0;padding:0;overflow:hidden;position:relative;cursor:default;width:100%;height:100%;font-family:Helvetica,"Nimbus Sans L","Liberation Sans",Arial,sans-serif;background:#f4f4f4 url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2267%22%20height%3D%22100%22%20viewBox%3D%220%200%2067%20100%22%3E%0A%3Cpath%20stroke%3D%22%23ccc%22%20fill%3D%22none%22%20d%3D%22M33.5%2C50%2C0%2C63%2C33.5%2C75%2C67%2C63%2C33.5%2C50m-33.5-50%2C67%2C25m-0.5%2C0%2C0%2C75m-66.5-75%2C67-25m-33.5%2C75%2C0%2C25m0-100%2C0%2C50%22%2F%3E%0A%3C%2Fsvg%3E%0A') repeat;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;outline:0;line-height:1.4;contain:content}.pnlm-container *{box-sizing:content-box}.pnlm-ui{position:absolute;width:100%;height:100%;z-index:1}.pnlm-grab{cursor:grab;cursor:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s6.38-6.73%204.64-8.24-3.47%201.01-3.47%201.01%203.61-5.72%201.41-6.49c-2.2-0.769-3.33%204.36-3.33%204.36s0.873-5.76-1.06-5.76-1.58%205.39-1.58%205.39-0.574-4.59-2.18-4.12c-1.61%200.468-0.572%205.51-0.572%205.51s-1.58-4.89-2.93-3.79c-1.35%201.11%200.258%205.25%200.572%206.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default}.pnlm-grabbing{cursor:grabbing;cursor:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2226%22%20width%3D%2226%22%3E%0A%3Cpath%20stroke%3D%22%23000%22%20stroke-width%3D%221px%22%20fill%3D%22%23fff%22%20d%3D%22m15.3%2020.5s5.07-5.29%203.77-6.74c-1.31-1.45-2.53%200.14-2.53%200.14s2.74-3.29%200.535-4.06c-2.2-0.769-2.52%201.3-2.52%201.3s0.81-2.13-1.12-2.13-1.52%201.77-1.52%201.77-0.261-1.59-1.87-1.12c-1.61%200.468-0.874%202.17-0.874%202.17s-0.651-1.55-2-0.445c-1.35%201.11-0.68%202.25-0.365%203.62%200.836%202.43%202.03%202.94%202.17%205.55%22%2F%3E%0A%3C%2Fsvg%3E%0A') 12 8,default}.pnlm-sprite{background-image:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2226%22%20height%3D%22208%22%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22117%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20fill-opacity%3D%22.78%22%20cy%3D%22143%22%20cx%3D%2213%22%20r%3D%2211%22%20fill%3D%22%23fff%22%2F%3E%0A%3Ccircle%20cy%3D%22169%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cy%3D%22195%22%20cx%3D%2213%22%20r%3D%227%22%20fill%3D%22none%22%20stroke%3D%22%23000%22%20stroke-width%3D%222%22%2F%3E%0A%3Ccircle%20cx%3D%2213%22%20cy%3D%22195%22%20r%3D%222.5%22%2F%3E%0A%3Cpath%20d%3D%22m5%2083v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-5%205v6h6v-6zm-5%205v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20110a7%207%200%200%200%20-7%207%207%207%200%200%200%207%207%207%207%200%200%200%207%20-7%207%207%200%200%200%20-7%20-7zm-1%203h2v2h-2zm0%203h2v5h-2z%22%2F%3E%0A%3Cpath%20d%3D%22m5%2057v6h2v-4h4v-2zm10%200v2h4v4h2v-6zm-10%2010v6h6v-2h-4v-4zm14%200v4h-4v2h6v-6z%22%2F%3E%0A%3Cpath%20d%3D%22m17%2038v2h-8v-2z%22%2F%3E%0A%3Cpath%20d%3D%22m12%209v3h-3v2h3v3h2v-3h3v-2h-3v-3z%22%2F%3E%0A%3Cpath%20d%3D%22m13%20136-6.125%206.125h4.375v7.875h3.5v-7.875h4.375z%22%2F%3E%0A%3Cpath%20d%3D%22m10.428%20173.33v-5.77l5-2.89v5.77zm1-1.73%203-1.73-3.001-1.74z%22%2F%3E%0A%3C%2Fsvg%3E%0A')}.pnlm-container:-moz-full-screen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:-webkit-full-screen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:-ms-fullscreen{height:100%!important;width:100%!important;position:static!important}.pnlm-container:fullscreen{height:100%!important;width:100%!important;position:static!important}.pnlm-render-container{cursor:inherit;position:absolute;height:100%;width:100%}.pnlm-controls{margin-top:4px;background-color:#fff;border:1px solid #999;border-color:rgba(0,0,0,0.4);border-radius:3px;cursor:pointer;z-index:2;-webkit-transform:translateZ(9999px);transform:translateZ(9999px)}.pnlm-control:hover{background-color:#f8f8f8}.pnlm-controls-container{position:absolute;top:0;left:4px;z-index:1}.pnlm-zoom-controls{width:26px;height:52px}.pnlm-zoom-in{width:100%;height:50%;position:absolute;top:0;border-radius:3px 3px 0 0}.pnlm-zoom-out{width:100%;height:50%;position:absolute;bottom:0;background-position:0 -26px;border-top:1px solid #ddd;border-top-color:rgba(0,0,0,0.10);border-radius:0 0 3px 3px}.pnlm-fullscreen-toggle-button,.pnlm-orientation-button,.pnlm-hot-spot-debug-indicator{width:26px;height:26px}.pnlm-hot-spot-debug-indicator{position:absolute;top:50%;left:50%;width:26px;height:26px;margin:-13px 0 0 -13px;background-color:rgba(255,255,255,0.5);border-radius:13px;display:none}.pnlm-orientation-button-inactive{background-position:0 -156px}.pnlm-orientation-button-active{background-position:0 -182px}.pnlm-fullscreen-toggle-button-inactive{background-position:0 -52px}.pnlm-fullscreen-toggle-button-active{background-position:0 -78px}.pnlm-panorama-info{position:absolute;bottom:4px;background-color:rgba(0,0,0,0.7);border-radius:0 3px 3px 0;padding-right:10px;color:#fff;text-align:left;display:none;z-index:2;-webkit-transform:translateZ(9999px);transform:translateZ(9999px)}.pnlm-title-box{position:relative;font-size:20px;display:table;padding-left:5px;margin-bottom:3px}.pnlm-author-box{position:relative;font-size:12px;display:table;padding-left:5px}.pnlm-load-box{position:absolute;top:50%;left:50%;width:200px;height:150px;margin:-75px 0 0 -100px;background-color:rgba(0,0,0,0.7);border-radius:3px;text-align:center;font-size:20px;display:none;color:#fff}.pnlm-load-box p{margin:20px 0}.pnlm-lbox{position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;display:none}.pnlm-loading{animation-duration:1.5s;-webkit-animation-duration:1.5s;animation-name:pnlm-mv;-webkit-animation-name:pnlm-mv;animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-timing-function:linear;height:10px;width:10px;background-color:#fff;position:relative}@keyframes pnlm-mv{from{left:0;top:0}25%{left:10px;top:0}50%{left:10px;top:10px}75%{left:0;top:10px}to{left:0;top:0}}@-webkit-keyframes pnlm-mv{from{left:0;top:0}25%{left:10px;top:0}50%{left:10px;top:10px}75%{left:0;top:10px}to{left:0;top:0}}.pnlm-load-button{position:absolute;top:50%;left:50%;width:200px;height:100px;margin:-50px 0 0 -100px;background-color:rgba(0,0,0,.7);border-radius:3px;text-align:center;font-size:20px;display:table;color:#fff;cursor:pointer}.pnlm-load-button:hover{background-color:rgba(0,0,0,.8)}.pnlm-load-button p{display:table-cell;vertical-align:middle}.pnlm-info-box{font-size:15px;position:absolute;top:50%;left:50%;width:200px;height:150px;margin:-75px 0 0 -100px;background-color:#000;border-radius:3px;display:table;text-align:center;color:#fff;table-layout:fixed}.pnlm-info-box a,.pnlm-author-box a{color:#fff;word-wrap:break-word;overflow-wrap:break-word}.pnlm-info-box p{display:table-cell;vertical-align:middle;padding:0 5px 0 5px}.pnlm-error-msg{display:none}.pnlm-about-msg{font-size:11px;line-height:11px;color:#fff;padding:5px 8px 5px 8px;background:rgba(0,0,0,0.7);border-radius:3px;position:absolute;top:50px;left:50px;display:none;opacity:0;-moz-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;z-index:1}.pnlm-about-msg a:link,.pnlm-about-msg a:visited{color:#fff}.pnlm-about-msg a:hover,.pnlm-about-msg a:active{color:#eee}.pnlm-hotspot-base{position:absolute;visibility:hidden;cursor:default;vertical-align:middle;top:0;z-index:1}.pnlm-hotspot{height:26px;width:26px;border-radius:13px}.pnlm-hotspot:hover{background-color:rgba(255,255,255,0.2)}.pnlm-hotspot.pnlm-info{background-position:0 -104px}.pnlm-hotspot.pnlm-scene{background-position:0 -130px}div.pnlm-tooltip span{visibility:hidden;position:absolute;border-radius:3px;background-color:rgba(0,0,0,0.7);color:#fff;text-align:center;max-width:200px;padding:5px 10px;margin-left:-220px;cursor:default}div.pnlm-tooltip:hover span{visibility:visible}div.pnlm-tooltip:hover span:after{content:'';position:absolute;width:0;height:0;border-width:10px;border-style:solid;border-color:rgba(0,0,0,0.7) transparent transparent transparent;bottom:-20px;left:-10px;margin:0 50%}.pnlm-compass{position:absolute;width:50px;height:50px;right:4px;bottom:4px;border-radius:25px;background-image:url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2250%22%20width%3D%2250%22%3E%0A%3Cpath%20d%3D%22m24.5078%206-3.2578%2018h7.5l-3.25781-18h-0.984376zm-3.2578%2020%203.2578%2018h0.9844l3.2578-18h-7.5zm1.19531%200.9941h5.10938l-2.5547%2014.1075-2.5547-14.1075z%22%2F%3E%0A%3C%2Fsvg%3E%0A');cursor:default;display:none}.pnlm-world{position:absolute;left:50%;top:50%}.pnlm-face{position:absolute;-webkit-transform-origin:0 0;transform-origin:0 0}.pnlm-dragfix,.pnlm-preview-img{position:absolute;height:100%;width:100%}.pnlm-preview-img{background-size:cover;background-position:center}.pnlm-lbar{width:150px;margin:0 auto;border:#fff 1px solid;height:6px}.pnlm-lbar-fill{background:#fff;height:100%;width:0}.pnlm-lmsg{font-size:12px}.pnlm-fade-img{position:absolute;top:0;left:0}.pnlm-pointer{cursor:pointer} \ No newline at end of file diff --git a/attachments/russia/js/pannellum.htm b/attachments/russia/js/pannellum.htm new file mode 100644 index 0000000..7180acd --- /dev/null +++ b/attachments/russia/js/pannellum.htm @@ -0,0 +1,116 @@ + + +Pannellum
    \ No newline at end of file diff --git a/attachments/russia/js/pannellum.js b/attachments/russia/js/pannellum.js new file mode 100644 index 0000000..22bbb7d --- /dev/null +++ b/attachments/russia/js/pannellum.js @@ -0,0 +1,110 @@ +// Pannellum 2.5.6, https://github.com/mpetroff/pannellum +window.libpannellum=function(E,g,p){function Ba(K){function ja(a,e){return 1==a.level&&1!=e.level?-1:1==e.level&&1!=a.level?1:e.timestamp-a.timestamp}function Q(a,e){return a.level!=e.level?a.level-e.level:a.diff-e.diff}function ka(a,e,c,g,l,h){this.vertices=a;this.side=e;this.level=c;this.x=g;this.y=l;this.path=h.replace("%s",e).replace("%l",c).replace("%x",g).replace("%y",l)}function Ja(a,e,g,p,l){var h;var d=e.vertices;h=la(a,d.slice(0,3));var u=la(a,d.slice(3,6)),x=la(a,d.slice(6,9)),d=la(a,d.slice(9, +12)),t=h[0]+u[0]+x[0]+d[0];-4==t||4==t?h=!1:(t=h[1]+u[1]+x[1]+d[1],h=-4==t||4==t?!1:4!=h[2]+u[2]+x[2]+d[2]);if(h){h=e.vertices;u=h[0]+h[3]+h[6]+h[9];x=h[1]+h[4]+h[7]+h[10];d=h[2]+h[5]+h[8]+h[11];t=Math.sqrt(u*u+x*x+d*d);d=Math.asin(d/t);u=Math.atan2(x,u)-p;u+=u>Math.PI?-2*Math.PI:u<-Math.PI?2*Math.PI:0;u=Math.abs(u);e.diff=Math.acos(Math.sin(g)*Math.sin(d)+Math.cos(g)*Math.cos(d)*Math.cos(u));u=!1;for(x=0;xg&&(h[0]=-1);1l&&(h[1]=-1);1c||1t;t++)0==m[t].width&&(m[t]=a)}}e===p&&(e="equirectangular");if("equirectangular"!=e&&"cubemap"!=e&&"multires"!=e)throw console.log("Error: invalid image type specified!"), +{type:"config error"};z=e;m=L;F=Ca;va=u||{};if(c){U&&(a.detachShader(c,U),a.deleteShader(U));V&&(a.detachShader(c,V),a.deleteShader(V));a.bindBuffer(a.ARRAY_BUFFER,null);a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,null);c.texture&&a.deleteTexture(c.texture);if(c.nodeCache)for(L=0;Lt;t++)0d;d++)c[4*(b+a.width)+d]=c[4*(b+2*a.width)+d],c[4*(b+a.width*(a.height-2))+d]=c[4*(b+a.width*(a.height-3))+d];for(b=2;bd;d++)c[4*(b*a.width+1)+d]=c[4*(b*a.width+2)+d],c[4*((b+1)*a.width-2)+d]=c[4*((b+1)*a.width-3)+d];for(d=0;4>d;d++)c[4*(a.width+1)+d]=c[4*(2*a.width+2)+d],c[4*(2*a.width-2)+d]=c[4*(3*a.width-3)+d],c[4*(a.width*(a.height-2)+1)+d]=c[4* +(a.width*(a.height-3)+2)+d],c[4*(a.width*(a.height-1)-2)+d]=c[4*(a.width*(a.height-2)-3)+d];for(b=1;bd;d++)c[4*b+d]=c[4*(b+a.width)+d],c[4*(b+a.width*(a.height-1))+d]=c[4*(b+a.width*(a.height-2))+d];for(b=1;bd;d++)c[b*a.width*4+d]=c[4*(b*a.width+1)+d],c[4*((b+1)*a.width-1)+d]=c[4*((b+1)*a.width-2)+d];for(d=0;4>d;d++)c[d]=c[4*(a.width+1)+d],c[4*(a.width-1)+d]=c[4*(2*a.width-2)+d],c[a.width*(a.height-1)*4+d]=c[4*(a.width*(a.height-2)+1)+d],c[4*(a.width* +a.height-1)+d]=c[4*(a.width*(a.height-1)-2)+d];e.putImageData(h,0,0);D.call(this)};var D=function(){0t;t++)h=new Image,h.crossOrigin=va.crossOrigin?va.crossOrigin:"anonymous",h.side=t,h.onload=l,h.onerror=D,h.src="multires"==z?H.replace("%s",Q[t])+"."+m.extension:m[t].src;x($)}else{if(!a)throw console.log("Error: no WebGL support detected!"), +{type:"no webgl"};"cubemap"==z&&x(y);m.fullpath=m.basePath?m.basePath+m.path:m.path;m.invTileResolution=1/m.tileResolution;L=ta();wa=[];for(t=0;6>t;t++)wa[t]=L.slice(12*t,12*t+12),L=ta();L=0;if("equirectangular"==z){if(L=a.getParameter(a.MAX_TEXTURE_SIZE),Math.max(m.width/2,m.height)>L)throw console.log("Error: The image is too big; it's "+m.width+"px wide, but this device's maximum supported size is "+2*L+"px."),{type:"webgl size error",width:m.width,maxWidth:2*L};}else if("cubemap"==z&&y>a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE))throw console.log("Error: The image is too big; it's "+ +y+"px wide, but this device's maximum supported size is "+L+"px."),{type:"webgl size error",width:y,maxWidth:L};u===p||u.horizonPitch===p&&u.horizonRoll===p||(ga=[u.horizonPitch==p?0:u.horizonPitch,u.horizonRoll==p?0:u.horizonRoll]);y=a.TEXTURE_2D;a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight);a.getShaderPrecisionFormat&&(e=a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT))&&1>e.precision&&(oa=oa.replace("highp","mediump"));U=a.createShader(a.VERTEX_SHADER);e=s;"multires"==z&& +(e=k);a.shaderSource(U,e);a.compileShader(U);V=a.createShader(a.FRAGMENT_SHADER);e=pa;"cubemap"==z?(y=a.TEXTURE_CUBE_MAP,e=qa):"multires"==z&&(e=bb);a.shaderSource(V,e);a.compileShader(V);c=a.createProgram();a.attachShader(c,U);a.attachShader(c,V);a.linkProgram(c);a.getShaderParameter(U,a.COMPILE_STATUS)||console.log(a.getShaderInfoLog(U));a.getShaderParameter(V,a.COMPILE_STATUS)||console.log(a.getShaderInfoLog(V));a.getProgramParameter(c,a.LINK_STATUS)||console.log(a.getProgramInfoLog(c));a.useProgram(c); +c.drawInProgress=!1;e=u.backgroundColor?u.backgroundColor:[0,0,0];a.clearColor(e[0],e[1],e[2],1);a.clear(a.COLOR_BUFFER_BIT);c.texCoordLocation=a.getAttribLocation(c,"a_texCoord");a.enableVertexAttribArray(c.texCoordLocation);"multires"!=z?(ca||(ca=a.createBuffer()),a.bindBuffer(a.ARRAY_BUFFER,ca),a.bufferData(a.ARRAY_BUFFER,new Float32Array([-1,1,1,1,1,-1,-1,1,1,-1,-1,-1]),a.STATIC_DRAW),a.vertexAttribPointer(c.texCoordLocation,2,a.FLOAT,!1,0,0),c.aspectRatio=a.getUniformLocation(c,"u_aspectRatio"), +a.uniform1f(c.aspectRatio,a.drawingBufferWidth/a.drawingBufferHeight),c.psi=a.getUniformLocation(c,"u_psi"),c.theta=a.getUniformLocation(c,"u_theta"),c.f=a.getUniformLocation(c,"u_f"),c.h=a.getUniformLocation(c,"u_h"),c.v=a.getUniformLocation(c,"u_v"),c.vo=a.getUniformLocation(c,"u_vo"),c.rot=a.getUniformLocation(c,"u_rot"),a.uniform1f(c.h,H/(2*Math.PI)),a.uniform1f(c.v,l/Math.PI),a.uniform1f(c.vo,h/Math.PI*2),"equirectangular"==z&&(c.backgroundColor=a.getUniformLocation(c,"u_backgroundColor"),a.uniform4fv(c.backgroundColor, +e.concat([1]))),c.texture=a.createTexture(),a.bindTexture(y,c.texture),"cubemap"==z?(a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[1]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_X,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[3]),a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[4]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[5]),a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_Z,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[0]),a.texImage2D(a.TEXTURE_CUBE_MAP_NEGATIVE_Z, +0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m[2])):m.width<=L?(a.uniform1i(a.getUniformLocation(c,"u_splitImage"),0),a.texImage2D(y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m)):(a.uniform1i(a.getUniformLocation(c,"u_splitImage"),1),H=g.createElement("canvas"),H.width=m.width/2,H.height=m.height,H=H.getContext("2d"),H.drawImage(m,0,0),l=H.getImageData(0,0,m.width/2,m.height),a.texImage2D(y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,l),c.texture2=a.createTexture(),a.activeTexture(a.TEXTURE1),a.bindTexture(y,c.texture2),a.uniform1i(a.getUniformLocation(c, +"u_image1"),1),H.drawImage(m,-m.width/2,0),l=H.getImageData(0,0,m.width/2,m.height),a.texImage2D(y,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,l),a.texParameteri(y,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(y,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texParameteri(y,a.TEXTURE_MIN_FILTER,a.LINEAR),a.texParameteri(y,a.TEXTURE_MAG_FILTER,a.LINEAR),a.activeTexture(a.TEXTURE0)),a.texParameteri(y,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(y,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texParameteri(y,a.TEXTURE_MIN_FILTER, +a.LINEAR),a.texParameteri(y,a.TEXTURE_MAG_FILTER,a.LINEAR)):(c.vertPosLocation=a.getAttribLocation(c,"a_vertCoord"),a.enableVertexAttribArray(c.vertPosLocation),Fa||(Fa=a.createBuffer()),Y||(Y=a.createBuffer()),na||(na=a.createBuffer()),a.bindBuffer(a.ARRAY_BUFFER,Y),a.bufferData(a.ARRAY_BUFFER,new Float32Array([0,0,1,0,1,1,0,1]),a.STATIC_DRAW),a.bindBuffer(a.ELEMENT_ARRAY_BUFFER,na),a.bufferData(a.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,1,2,0,2,3]),a.STATIC_DRAW),c.perspUniform=a.getUniformLocation(c, +"u_perspMatrix"),c.cubeUniform=a.getUniformLocation(c,"u_cubeMatrix"),c.level=-1,c.currentNodes=[],c.nodeCache=[],c.nodeCacheTimestamp=0);H=a.getError();if(0!==H)throw console.log("Error: Something went wrong with WebGL!",H),{type:"webgl error"};d()}};this.destroy=function(){K!==p&&(A!==p&&K.contains(A)&&K.removeChild(A),R!==p&&K.contains(R)&&K.removeChild(R));if(a){var c=a.getExtension("WEBGL_lose_context");c&&c.loseContext()}};this.resize=function(){var g=E.devicePixelRatio||1;A.width=A.clientWidth* +g;A.height=A.clientHeight*g;a&&(1286==a.getError()&&Ea(),a.viewport(0,0,a.drawingBufferWidth,a.drawingBufferHeight),"multires"!=z&&a.uniform1f(c.aspectRatio,A.clientWidth/A.clientHeight))};this.resize();this.setPose=function(a,c){ga=[a,c]};this.render=function(g,e,k,s){var l,h=0;s===p&&(s={});s.roll&&(h=s.roll);if(ga!==p){l=ga[0];var d=ga[1],u=g,x=e,t=Math.cos(d)*Math.sin(g)*Math.sin(l)+Math.cos(g)*(Math.cos(l)*Math.cos(e)+Math.sin(d)*Math.sin(l)*Math.sin(e)),E=-Math.sin(g)*Math.sin(d)+Math.cos(g)* +Math.cos(d)*Math.sin(e);g=Math.cos(d)*Math.cos(l)*Math.sin(g)+Math.cos(g)*(-Math.cos(e)*Math.sin(l)+Math.cos(l)*Math.sin(d)*Math.sin(e));g=Math.asin(Math.max(Math.min(g,1),-1));e=Math.atan2(E,t);l=[Math.cos(u)*(Math.sin(d)*Math.sin(l)*Math.cos(x)-Math.cos(l)*Math.sin(x)),Math.cos(u)*Math.cos(d)*Math.cos(x),Math.cos(u)*(Math.cos(l)*Math.sin(d)*Math.cos(x)+Math.sin(x)*Math.sin(l))];d=[-Math.cos(g)*Math.sin(e),Math.cos(g)*Math.cos(e)];d=Math.acos(Math.max(Math.min((l[0]*d[0]+l[1]*d[1])/(Math.sqrt(l[0]* +l[0]+l[1]*l[1]+l[2]*l[2])*Math.sqrt(d[0]*d[0]+d[1]*d[1])),1),-1));0>l[2]&&(d=2*Math.PI-d);h+=d}if(a||"multires"!=z&&"cubemap"!=z){if("multires"!=z)k=2*Math.atan(Math.tan(0.5*k)/(a.drawingBufferWidth/a.drawingBufferHeight)),k=1/Math.tan(0.5*k),a.uniform1f(c.psi,e),a.uniform1f(c.theta,g),a.uniform1f(c.rot,h),a.uniform1f(c.f,k),!0===F&&"equirectangular"==z&&(a.bindTexture(a.TEXTURE_2D,c.texture),a.texImage2D(a.TEXTURE_2D,0,a.RGB,a.RGB,a.UNSIGNED_BYTE,m)),a.drawArrays(a.TRIANGLES,0,6);else{l=a.drawingBufferWidth/ +a.drawingBufferHeight;d=2*Math.atan(Math.tan(k/2)*a.drawingBufferHeight/a.drawingBufferWidth);d=1/Math.tan(d/2);l=[d/l,0,0,0,0,d,0,0,0,0,100.1/-99.9,20/-99.9,0,0,-1,0];for(d=1;dm.tileResolution*Math.pow(2,d-1)*Math.tan(k/2)*0.707;)d++;c.level=d;d=[1,0,0,0,1,0,0,0,1];d=ua(d,-h,"z");d=ua(d,-g,"x");d=ua(d,e,"y");d=[d[0],d[1],d[2],0,d[3],d[4],d[5],0,d[6],d[7],d[8],0,0,0,0,1];a.uniformMatrix4fv(c.perspUniform,!1,new Float32Array(ma(l)));a.uniformMatrix4fv(c.cubeUniform, +!1,new Float32Array(ma(d)));h=[l[0]*d[0],l[0]*d[1],l[0]*d[2],0,l[5]*d[4],l[5]*d[5],l[5]*d[6],0,l[10]*d[8],l[10]*d[9],l[10]*d[10],l[11],-d[8],-d[9],-d[10],0];c.nodeCache.sort(ja);if(200c.currentNodes.length+50)for(l=c.nodeCache.splice(200,c.nodeCache.length-200),d=0;dl;l++)u=new ka(wa[l],d[l],1,0,0,m.fullpath),Ja(h,u,g,e,k);c.currentNodes.sort(Q);for(g=S.length-1;0<= +g;g--)-1===c.currentNodes.indexOf(S[g].node)&&(S[g].node.textureLoad=!1,S.splice(g,1));if(0===S.length)for(g=0;gg;g++)if(h=R.querySelector(".pnlm-"+k[g]+"face"))h.style.webkitTransform=e+s[k[g]],h.style.transform=e+s[k[g]]};this.isLoading= +function(){if(a&&"multires"==z)for(var g=0;g u_h || coord.y < -u_v + u_vo || coord.y > u_v + u_vo)\ngl_FragColor = u_backgroundColor;\nelse {\nif(u_splitImage) {\nif(coord.x < 0.0)\ngl_FragColor = texture2D(u_image0, vec2((coord.x + u_h) / u_h, (-coord.y + u_v + u_vo) / (u_v * 2.0)));\nelse\ngl_FragColor = texture2D(u_image1, vec2((coord.x + u_h) / u_h - 1.0, (-coord.y + u_v + u_vo) / (u_v * 2.0)));\n} else {\ngl_FragColor = texture2D(u_image0, vec2((coord.x + u_h) / (u_h * 2.0), (-coord.y + u_v + u_vo) / (u_v * 2.0)));\n}\n}\n}", +bb="varying mediump vec2 v_texCoord;uniform sampler2D u_sampler;void main(void) {gl_FragColor = texture2D(u_sampler, v_texCoord);}";return{renderer:function(g,k,p,s){return new Ba(g,k,p,s)}}}(window,document); +window.pannellum=function(E,g,p){function Ba(s,k){function oa(){var a=g.createElement("div");a.innerHTML="\x3c!--[if lte IE 9]>a;a++)P.push(new Image),P[a].crossOrigin=b.crossOrigin;q.load.lbox.style.display="block";q.load.lbar.style.display="none"}else if("multires"==b.type)a=JSON.parse(JSON.stringify(b.multiRes)),b.basePath&&b.multiRes.basePath&&!/^(?:[a-z]+:)?\/\//i.test(b.multiRes.basePath)? +a.basePath=b.basePath+b.multiRes.basePath:b.multiRes.basePath?a.basePath=b.multiRes.basePath:b.basePath&&(a.basePath=b.basePath),P=a;else if(!0===b.dynamic)P=b.panorama;else{if(b.panorama===p){K(b.strings.noPanoramaError);return}P=new Image}if("cubemap"==b.type)for(var n=6,c=function(){n--;0===n&&pa()},d=function(a){var ea=g.createElement("a");ea.href=a.target.src;ea.textContent=ea.href;K(b.strings.fileAccessError.replace("%s",ea.outerHTML))},a=0;ac||65536")+12),e=function(a){var b;0<=d.indexOf(a+'="')?(b=d.substring(d.indexOf(a+'="')+a.length+2),b=b.substring(0,b.indexOf('"'))):0<=d.indexOf(a+">")&&(b=d.substring(d.indexOf(a+">")+a.length+1),b=b.substring(0, +b.indexOf("<")));return b!==p?Number(b):null},n=e("GPano:FullPanoWidthPixels"),c=e("GPano:CroppedAreaImageWidthPixels"),g=e("GPano:FullPanoHeightPixels"),h=e("GPano:CroppedAreaImageHeightPixels"),l=e("GPano:CroppedAreaTopPixels"),k=e("GPano:PoseHeadingDegrees"),m=e("GPano:PosePitchDegrees"),e=e("GPano:PoseRollDegrees");null!==n&&null!==c&&null!==g&&null!==h&&null!==l&&(0>aa.indexOf("haov")&&(b.haov=c/n*360),0>aa.indexOf("vaov")&&(b.vaov=h/g*180),0>aa.indexOf("vOffset")&&(b.vOffset=-180*((l+h/2)/g- +0.5)),null!==k&&0>aa.indexOf("northOffset")&&(b.northOffset=k,!1!==b.compass&&(b.compass=!0)),null!==m&&null!==e&&(0>aa.indexOf("horizonPitch")&&(b.horizonPitch=m),0>aa.indexOf("horizonRoll")&&(b.horizonRoll=e)))}P.src=E.URL.createObjectURL(a)});f.readAsBinaryString!==p?f.readAsBinaryString(a):f.readAsText(a)}function K(a){a===p&&(a=b.strings.genericWebGLError);q.errorMsg.innerHTML="

    "+a+"

    ";v.load.style.display="none";q.load.box.style.display="none";q.errorMsg.style.display="table";Na=!0;G= +p;M.style.display="none";B("error",a)}function ja(a){var b=Q(a);fa.style.left=b.x+"px";fa.style.top=b.y+"px";clearTimeout(ja.t1);clearTimeout(ja.t2);fa.style.display="block";fa.style.opacity=1;ja.t1=setTimeout(function(){fa.style.opacity=0},2E3);ja.t2=setTimeout(function(){fa.style.display="none"},2500);a.preventDefault()}function Q(a){var b=s.getBoundingClientRect(),n={};n.x=(a.clientX||a.pageX)-b.left;n.y=(a.clientY||a.pageY)-b.top;return n}function ka(a){a.preventDefault();s.focus();if(G&&b.draggable){var f= +Q(a);if(b.hotSpotDebug){var n=ta(a);console.log("Pitch: "+n[0]+", Yaw: "+n[1]+", Center Pitch: "+b.pitch+", Center Yaw: "+b.yaw+", HFOV: "+b.hfov)}t();Da();b.roll=0;w.hfov=0;ha=!0;N=Date.now();xa=f.x;ya=f.y;Oa=b.yaw;Pa=b.pitch;J.classList.add("pnlm-grabbing");J.classList.remove("pnlm-grab");B("mousedown",a);F()}}function Ja(a){b.minHfov===b.hfov?da.setHfov(ra,1E3):(a=ta(a),da.lookAt(a[0],a[1],b.minHfov,1E3))}function ta(a){var f=Q(a);a=C.getCanvas();var n=a.clientWidth,c=a.clientHeight;a=f.x/n*2- +1;var c=(1-f.y/c*2)*c/n,e=1/Math.tan(b.hfov*Math.PI/360),d=Math.sin(b.pitch*Math.PI/180),g=Math.cos(b.pitch*Math.PI/180),f=e*g-c*d,n=Math.sqrt(a*a+f*f),c=180*Math.atan((c*g+e*d)/n)/Math.PI;a=180*Math.atan2(a/n,f/n)/Math.PI+b.yaw;-180>a&&(a+=360);180a.wheelDelta?1:-1):a.wheelDelta?(x(b.hfov-0.05*a.wheelDelta),w.hfov=0>a.wheelDelta?1:-1):a.detail&&(x(b.hfov+1.5*a.detail),w.hfov=0 +b.capturedKeyNumbers.indexOf(f)||(a.preventDefault(),27==f?Aa&&h():wa(f,!0))}function $(){for(var a=0;10>a;a++)r[a]=!1}function R(a){var f=a.which||a.keycode;0>b.capturedKeyNumbers.indexOf(f)||(a.preventDefault(),wa(f,!1))}function wa(a,b){var n=!1;switch(a){case 109:case 189:case 17:case 173:r[0]!=b&&(n=!0);r[0]=b;break;case 107:case 187:case 16:case 61:r[1]!=b&&(n=!0);r[1]=b;break;case 38:r[2]!=b&&(n=!0);r[2]=b;break;case 87:r[6]!=b&&(n=!0);r[6]=b;break;case 40:r[3]!=b&&(n=!0);r[3]=b;break;case 83:r[7]!= +b&&(n=!0);r[7]=b;break;case 37:r[4]!=b&&(n=!0);r[4]=b;break;case 65:r[8]!=b&&(n=!0);r[8]=b;break;case 39:r[5]!=b&&(n=!0);r[5]=b;break;case 68:r[9]!=b&&(n=!0),r[9]=b}n&&b&&(ba="undefined"!==typeof performance&&performance.now()?performance.now():Date.now(),F())}function ga(){if(G){var a=!1,f=b.pitch,n=b.yaw,c=b.hfov,e;e="undefined"!==typeof performance&&performance.now()?performance.now():Date.now();ba===p&&(ba=e);var d=(e-ba)*b.hfov/1700,d=Math.min(d,1);r[0]&&!0===b.keyboardZoom&&(x(b.hfov+(0.8*w.hfov+ +0.5)*d),a=!0);r[1]&&!0===b.keyboardZoom&&(x(b.hfov+(0.8*w.hfov-0.2)*d),a=!0);if(r[2]||r[6])b.pitch+=(0.8*w.pitch+0.2)*d,a=!0;if(r[3]||r[7])b.pitch+=(0.8*w.pitch-0.2)*d,a=!0;if(r[4]||r[8])b.yaw+=(0.8*w.yaw-0.2)*d,a=!0;if(r[5]||r[9])b.yaw+=(0.8*w.yaw+0.2)*d,a=!0;a&&(N=Date.now());if(b.autoRotate){if(0.001=b.autoRotateStopDelay&& +(b.autoRotateStopDelay=!1,Z=b.autoRotate,b.autoRotate=0))}O.pitch&&(m("pitch"),f=b.pitch);O.yaw&&(m("yaw"),n=b.yaw);O.hfov&&(m("hfov"),c=b.hfov);0f.startPosition&&n>=f.endPosition||f.endPositionb.autoRotateInactivityDelay&&!b.autoRotate&&(b.autoRotate=Z,da.lookAt(Ga,p,ra,3E3)),requestAnimationFrame(ca); +else if(C&&(C.isLoading()||!0===b.dynamic&&Ma))requestAnimationFrame(ca);else{B("animatefinished",{pitch:da.getPitch(),yaw:da.getYaw(),hfov:da.getHfov()});Ta=!1;ba=p;var a=b.autoRotateInactivityDelay-(Date.now()-N);0b.yaw&&(b.yaw+=360));a=b.yaw;var n=0;if(b.avoidShowingBackground){var c= +b.hfov/2,d=180*Math.atan2(Math.tan(c/180*Math.PI),f.width/f.height)/Math.PI;b.vaov>b.haov?Math.min(Math.cos((b.pitch-c)/180*Math.PI),Math.cos((b.pitch+c)/180*Math.PI)):n=c*(1-Math.min(Math.cos((b.pitch-d)/180*Math.PI),Math.cos((b.pitch+d)/180*Math.PI)))}var c=b.maxYaw-b.minYaw,d=-180,e=180;360>c&&(d=b.minYaw+b.hfov/2+n,e=b.maxYaw-b.hfov/2-n,cb.yaw&&(b.yaw+=360));!1!==b.autoRotate&&a!=b.yaw&&ba!== +p&&(b.autoRotate*=-1);a=2*Math.atan(Math.tan(b.hfov/180*Math.PI*0.5)/(f.width/f.height))/Math.PI*180;f=b.minPitch+a/2;n=b.maxPitch-a/2;b.maxPitch-b.minPitchX?X+=1:10===X?($a=f[2]/Math.PI*180+b.yaw,X=!0,requestAnimationFrame(ca)):(b.pitch=f[0]/Math.PI*180,b.roll=-f[1]/Math.PI*180,b.yaw=-f[2]/Math.PI*180+$a)}function va(){try{var a={};b.horizonPitch!==p&&(a.horizonPitch=b.horizonPitch*Math.PI/180);b.horizonRoll!==p&&(a.horizonRoll=b.horizonRoll*Math.PI/180);b.backgroundColor!==p&&(a.backgroundColor=b.backgroundColor);C.init(P,b.type,b.dynamic,b.haov*Math.PI/180, +b.vaov*Math.PI/180,b.vOffset*Math.PI/180,S,a);!0!==b.dynamic&&(P=p)}catch(f){if("webgl error"==f.type||"no webgl"==f.type)K();else if("webgl size error"==f.type)K(b.strings.textureSizeError.replace("%s",f.width).replace("%s",f.maxWidth));else throw K(b.strings.unknownError),f;}}function S(){if(b.sceneFadeDuration&&C.fadeImg!==p){C.fadeImg.style.opacity=0;var a=C.fadeImg;delete C.fadeImg;setTimeout(function(){M.removeChild(a);B("scenechangefadedone")},b.sceneFadeDuration)}Ia.style.display=b.compass? +"inline":"none";L();q.load.box.style.display="none";sa!==p&&(M.removeChild(sa),sa=p);G=!0;B("load");F()}function La(a){a.pitch=Number(a.pitch)||0;a.yaw=Number(a.yaw)||0;var f=g.createElement("div");f.className="pnlm-hotspot-base";f.className=a.cssClass?f.className+(" "+a.cssClass):f.className+(" pnlm-hotspot pnlm-sprite pnlm-"+D(a.type));var c=g.createElement("span");a.text&&(c.innerHTML=D(a.text));var d;if(a.video){d=g.createElement("video");var e=a.video;b.basePath&&!qa(e)&&(e=b.basePath+e);d.src= +I(e);d.controls=!0;d.style.width=a.width+"px";M.appendChild(f);c.appendChild(d)}else if(a.image){e=a.image;b.basePath&&!qa(e)&&(e=b.basePath+e);d=g.createElement("a");d.href=I(a.URL?a.URL:e,!0);d.target="_blank";c.appendChild(d);var h=g.createElement("img");h.src=I(e);h.style.width=a.width+"px";h.style.paddingTop="5px";M.appendChild(f);d.appendChild(h);c.style.maxWidth="initial"}else if(a.URL){d=g.createElement("a");d.href=I(a.URL,!0);if(a.attributes)for(e in a.attributes)d.setAttribute(e,a.attributes[e]); +else d.target="_blank";M.appendChild(d);f.className+=" pnlm-pointer";c.className+=" pnlm-pointer";d.appendChild(f)}else a.sceneId&&(f.onclick=f.ontouchend=function(){f.clicked||(f.clicked=!0,y(a.sceneId,a.targetPitch,a.targetYaw,a.targetHfov));return!1},f.className+=" pnlm-pointer",c.className+=" pnlm-pointer"),M.appendChild(f);if(a.createTooltipFunc)a.createTooltipFunc(f,a.createTooltipArgs);else if(a.text||a.video||a.image)f.classList.add("pnlm-tooltip"),f.appendChild(c),c.style.width=c.scrollWidth- +20+"px",c.style.marginLeft=-(c.scrollWidth-f.offsetWidth)/2+"px",c.style.marginTop=-c.scrollHeight-12+"px";a.clickHandlerFunc&&(f.addEventListener("click",function(b){a.clickHandlerFunc(b,a.clickHandlerArgs)},"false"),f.className+=" pnlm-pointer",c.className+=" pnlm-pointer");a.div=f}function L(){Ua||(b.hotSpots?(b.hotSpots=b.hotSpots.sort(function(a,b){return a.pitch=a.yaw&&-90=h||(90=a.yaw)&&0>=h)a.div.style.visibility="hidden";else{var l=Math.sin((-a.yaw+b.yaw)*Math.PI/180),k=Math.tan(b.hfov*Math.PI/ +360);a.div.style.visibility="visible";var m=C.getCanvas(),p=m.clientWidth,m=m.clientHeight,f=[-p/k*l*c/h/2,-p/k*(f*e-c*g*d)/h/2],c=Math.sin(b.roll*Math.PI/180),d=Math.cos(b.roll*Math.PI/180),f=[f[0]*d-f[1]*c,f[0]*c+f[1]*d];f[0]+=(p-a.div.offsetWidth)/2;f[1]+=(m-a.div.offsetHeight)/2;p="translate("+f[0]+"px, "+f[1]+"px) translateZ(9999px) rotate("+b.roll+"deg)";a.scale&&(p+=" scale("+ra/b.hfov/h+")");a.div.style.webkitTransform=p;a.div.style.MozTransform=p;a.div.style.transform=p}}function H(a){b= +{};var f,c,d="haov vaov vOffset northOffset horizonPitch horizonRoll".split(" ");aa=[];for(f in Va)Va.hasOwnProperty(f)&&(b[f]=Va[f]);for(f in k.default)if(k.default.hasOwnProperty(f))if("strings"==f)for(c in k.default.strings)k.default.strings.hasOwnProperty(c)&&(b.strings[c]=D(k.default.strings[c]));else b[f]=k.default[f],0<=d.indexOf(f)&&aa.push(f);if(null!==a&&""!==a&&k.scenes&&k.scenes[a]){var e=k.scenes[a];for(f in e)if(e.hasOwnProperty(f))if("strings"==f)for(c in e.strings)e.strings.hasOwnProperty(c)&& +(b.strings[c]=D(e.strings[c]));else b[f]=e[f],0<=d.indexOf(f)&&aa.push(f);b.scene=a}for(f in k)if(k.hasOwnProperty(f))if("strings"==f)for(c in k.strings)k.strings.hasOwnProperty(c)&&(b.strings[c]=D(k.strings[c]));else b[f]=k[f],0<=d.indexOf(f)&&aa.push(f)}function l(a){if((a=a?a:!1)&&"preview"in b){var c=b.preview;b.basePath&&!qa(c)&&(c=b.basePath+c);sa=g.createElement("div");sa.className="pnlm-preview-img";sa.style.backgroundImage="url('"+I(c).replace(/"/g,"%22").replace(/'/g,"%27")+"')";M.appendChild(sa)}var c= +b.title,d=b.author;a&&("previewTitle"in b&&(b.title=b.previewTitle),"previewAuthor"in b&&(b.author=b.previewAuthor));b.hasOwnProperty("title")||(q.title.innerHTML="");b.hasOwnProperty("author")||(q.author.innerHTML="");b.hasOwnProperty("title")||b.hasOwnProperty("author")||(q.container.style.display="none");v.load.innerHTML="

    "+b.strings.loadButtonLabel+"

    ";q.load.boxp.innerHTML=b.strings.loadingLabel;for(var e in b)if(b.hasOwnProperty(e))switch(e){case "title":q.title.innerHTML=D(b[e]);q.container.style.display= +"inline";break;case "author":var h=D(b[e]);b.authorURL&&(h=g.createElement("a"),h.href=I(b.authorURL,!0),h.target="_blank",h.innerHTML=D(b[e]),h=h.outerHTML);q.author.innerHTML=b.strings.bylineLabel.replace("%s",h);q.container.style.display="inline";break;case "fallback":h=g.createElement("a");h.href=I(b[e],!0);h.target="_blank";h.textContent="Click here to view this panorama in an alternative viewer.";var k=g.createElement("p");k.textContent="Your browser does not support WebGL.";k.appendChild(g.createElement("br")); +k.appendChild(h);q.errorMsg.innerHTML="";q.errorMsg.appendChild(k);break;case "hfov":x(Number(b[e]));break;case "autoLoad":!0===b[e]&&C===p&&(q.load.box.style.display="inline",v.load.style.display="none",oa());break;case "showZoomCtrl":v.zoom.style.display=b[e]&&!1!=b.showControls?"block":"none";break;case "showFullscreenCtrl":v.fullscreen.style.display=b[e]&&!1!=b.showControls&&("fullscreen"in g||"mozFullScreen"in g||"webkitIsFullScreen"in g||"msFullscreenElement"in g)?"block":"none";break;case "hotSpotDebug":Wa.style.display= +b[e]?"block":"none";break;case "showControls":b[e]||(v.orientation.style.display="none",v.zoom.style.display="none",v.fullscreen.style.display="none");break;case "orientationOnByDefault":b[e]&&Ra()}a&&(c?b.title=c:delete b.title,d?b.author=d:delete b.author)}function h(){if(G&&!Na)if(Aa)g.exitFullscreen?g.exitFullscreen():g.mozCancelFullScreen?g.mozCancelFullScreen():g.webkitCancelFullScreen?g.webkitCancelFullScreen():g.msExitFullscreen&&g.msExitFullscreen();else try{s.requestFullscreen?s.requestFullscreen(): +s.mozRequestFullScreen?s.mozRequestFullScreen():s.msRequestFullscreen?s.msRequestFullscreen():s.webkitRequestFullScreen()}catch(a){}}function d(a){g.fullscreenElement||g.fullscreen||g.mozFullScreen||g.webkitIsFullScreen||g.msFullscreenElement?(v.fullscreen.classList.add("pnlm-fullscreen-toggle-button-active"),Aa=!0):(v.fullscreen.classList.remove("pnlm-fullscreen-toggle-button-active"),Aa=!1);"resize"!==a&&B("fullscreenchange",Aa);C.resize();x(b.hfov);F()}function u(a){var c=b.minHfov;"multires"== +b.type&&C&&!b.multiResMinHfov&&(c=Math.min(c,C.getCanvas().width/(b.multiRes.cubeResolution/90*0.9)));if(c>b.maxHfov)return console.log("HFOV bounds do not make sense (minHfov > maxHfov)."),b.hfov;var d=b.hfov,d=ab.maxHfov?b.maxHfov:a;b.avoidShowingBackground&&C&&(a=C.getCanvas(),d=Math.min(d,360*Math.atan(Math.tan((b.maxPitch-b.minPitch)/360*Math.PI)/a.height*a.width)/Math.PI));return d}function x(a){b.hfov=u(a);B("zoomchange",b.hfov)}function t(){O={};Z=b.autoRotate?b.autoRotate:Z;b.autoRotate= +!1}function Ya(){Na&&(q.load.box.style.display="none",q.errorMsg.style.display="none",Na=!1,M.style.display="block",B("errorcleared"));G=!1;v.load.style.display="none";q.load.box.style.display="inline";oa()}function y(a,c,d,h,g){G||(g=!0);G=!1;O={};var m,q;if(b.sceneFadeDuration&&!g&&(m=C.render(b.pitch*Math.PI/180,b.yaw*Math.PI/180,b.hfov*Math.PI/180,{returnImage:!0}),m!==p)){g=new Image;g.className="pnlm-fade-img";g.style.transition="opacity "+b.sceneFadeDuration/1E3+"s";g.style.width="100%";g.style.height= +"100%";g.onload=function(){y(a,c,d,h,!0)};g.src=m;M.appendChild(g);C.fadeImg=g;return}g="same"===c?b.pitch:c;m="same"===d?b.yaw:"sameAzimuth"===d?b.yaw+(b.northOffset||0)-(k.scenes[a].northOffset||0):d;q="same"===h?b.hfov:h;e();H(a);w.yaw=w.pitch=w.hfov=0;l();g!==p&&(b.pitch=g);m!==p&&(b.yaw=m);q!==p&&(b.hfov=q);B("scenechange",a);Ya()}function Da(){E.removeEventListener("deviceorientation",na);v.orientation.classList.remove("pnlm-orientation-button-active");X=!1}function Ra(){"function"===typeof DeviceMotionEvent.requestPermission? +DeviceOrientationEvent.requestPermission().then(function(a){"granted"==a&&(X=1,E.addEventListener("deviceorientation",na),v.orientation.classList.add("pnlm-orientation-button-active"))}):(X=1,E.addEventListener("deviceorientation",na),v.orientation.classList.add("pnlm-orientation-button-active"))}function D(a){return k.escapeHTML?String(a).split(/&/g).join("&").split('"').join(""").split("'").join("'").split("<").join("<").split(">").join(">").split("/").join("/").split("\n").join("
    "): +String(a).split("\n").join("
    ")}function I(a,b){try{var c=decodeURIComponent(ab(a)).replace(/[^\w:]/g,"").toLowerCase()}catch(d){return"about:blank"}return 0===c.indexOf("javascript:")||0===c.indexOf("vbscript:")?(console.log("Script URL removed."),"about:blank"):b&&0===c.indexOf("data:")?(console.log("Data URI removed from link."),"about:blank"):a}function ab(a){return a.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,function(a,b){b=b.toLowerCase();return"colon"===b?":":"#"===b.charAt(0)? +"x"===b.charAt(1)?String.fromCharCode(parseInt(b.substring(2),16)):String.fromCharCode(+b.substring(1)):""})}function B(a){if(a in T)for(var b=T[a].length;0a?2*a*a:-1+(4-2*a)*a},draggable:!0,disableKeyboardCtrl:!1,crossOrigin:"anonymous", +touchPanSpeedCoeffFactor:1,capturedKeyNumbers:[16,17,27,37,38,39,40,61,65,68,83,87,107,109,173,187,189],friction:0.15,strings:{loadButtonLabel:"Click to
    Load
    Panorama",loadingLabel:"Loading...",bylineLabel:"by %s",noPanoramaError:"No panorama image was specified.",fileAccessError:"The file %s could not be accessed.",malformedURLError:"There is something wrong with the panorama URL.",iOS8WebGLError:"Due to iOS 8's broken WebGL implementation, only progressive encoded JPEGs work for your device (this panorama uses standard encoding).", +genericWebGLError:"Your browser does not have the necessary WebGL support to display this panorama.",textureSizeError:"This panorama is too big for your device! It's %spx wide, but your device only supports images up to %spx wide. Try another device. (If you're the author, try scaling down the image.)",unknownError:"Unknown error. Check developer console."}};s="string"===typeof s?g.getElementById(s):s;s.classList.add("pnlm-container");s.tabIndex=0;var J=g.createElement("div");J.className="pnlm-ui"; +s.appendChild(J);var M=g.createElement("div");M.className="pnlm-render-container";s.appendChild(M);var W=g.createElement("div");W.className="pnlm-dragfix";J.appendChild(W);var fa=g.createElement("span");fa.className="pnlm-about-msg";fa.innerHTML='Pannellum 2.5.6';J.appendChild(fa);W.addEventListener("contextmenu",ja);var q={},Wa=g.createElement("div");Wa.className="pnlm-sprite pnlm-hot-spot-debug-indicator";J.appendChild(Wa);q.container=g.createElement("div"); +q.container.className="pnlm-panorama-info";q.title=g.createElement("div");q.title.className="pnlm-title-box";q.container.appendChild(q.title);q.author=g.createElement("div");q.author.className="pnlm-author-box";q.container.appendChild(q.author);J.appendChild(q.container);q.load={};q.load.box=g.createElement("div");q.load.box.className="pnlm-load-box";q.load.boxp=g.createElement("p");q.load.box.appendChild(q.load.boxp);q.load.lbox=g.createElement("div");q.load.lbox.className="pnlm-lbox";q.load.lbox.innerHTML= +'
    ';q.load.box.appendChild(q.load.lbox);q.load.lbar=g.createElement("div");q.load.lbar.className="pnlm-lbar";q.load.lbarFill=g.createElement("div");q.load.lbarFill.className="pnlm-lbar-fill";q.load.lbar.appendChild(q.load.lbarFill);q.load.box.appendChild(q.load.lbar);q.load.msg=g.createElement("p");q.load.msg.className="pnlm-lmsg";q.load.box.appendChild(q.load.msg);J.appendChild(q.load.box);q.errorMsg=g.createElement("div");q.errorMsg.className="pnlm-error-msg pnlm-info-box"; +J.appendChild(q.errorMsg);var v={};v.container=g.createElement("div");v.container.className="pnlm-controls-container";J.appendChild(v.container);v.load=g.createElement("div");v.load.className="pnlm-load-button";v.load.addEventListener("click",function(){l();Ya()});J.appendChild(v.load);v.zoom=g.createElement("div");v.zoom.className="pnlm-zoom-controls pnlm-controls";v.zoomIn=g.createElement("div");v.zoomIn.className="pnlm-zoom-in pnlm-sprite pnlm-control";v.zoomIn.addEventListener("click",function(){G&& +(x(b.hfov-5),F())});v.zoom.appendChild(v.zoomIn);v.zoomOut=g.createElement("div");v.zoomOut.className="pnlm-zoom-out pnlm-sprite pnlm-control";v.zoomOut.addEventListener("click",function(){G&&(x(b.hfov+5),F())});v.zoom.appendChild(v.zoomOut);v.container.appendChild(v.zoom);v.fullscreen=g.createElement("div");v.fullscreen.addEventListener("click",h);v.fullscreen.className="pnlm-fullscreen-toggle-button pnlm-sprite pnlm-fullscreen-toggle-button-inactive pnlm-controls pnlm-control";(g.fullscreenEnabled|| +g.mozFullScreenEnabled||g.webkitFullscreenEnabled||g.msFullscreenEnabled)&&v.container.appendChild(v.fullscreen);v.orientation=g.createElement("div");v.orientation.addEventListener("click",function(a){X?Da():Ra()});v.orientation.addEventListener("mousedown",function(a){a.stopPropagation()});v.orientation.addEventListener("touchstart",function(a){a.stopPropagation()});v.orientation.addEventListener("pointerdown",function(a){a.stopPropagation()});v.orientation.className="pnlm-orientation-button pnlm-orientation-button-inactive pnlm-sprite pnlm-controls pnlm-control"; +var Xa=!1;E.DeviceOrientationEvent&&"https:"==location.protocol&&0<=navigator.userAgent.toLowerCase().indexOf("mobi")&&(v.container.appendChild(v.orientation),Xa=!0);var Ia=g.createElement("div");Ia.className="pnlm-compass pnlm-controls pnlm-control";J.appendChild(Ia);k.firstScene?H(k.firstScene):k.default&&k.default.firstScene?H(k.default.firstScene):H(null);l(!0);var ia=[],za=[];Y.prototype.multiply=function(a){return new Y(this.w*a.w-this.x*a.x-this.y*a.y-this.z*a.z,this.x*a.w+this.w*a.x+this.y* +a.z-this.z*a.y,this.y*a.w+this.w*a.y+this.z*a.x-this.x*a.z,this.z*a.w+this.w*a.z+this.x*a.y-this.y*a.x)};Y.prototype.toEulerAngles=function(){var a=Math.atan2(2*(this.w*this.x+this.y*this.z),1-2*(this.x*this.x+this.y*this.y)),b=Math.asin(2*(this.w*this.y-this.z*this.x)),c=Math.atan2(2*(this.w*this.z+this.x*this.y),1-2*(this.y*this.y+this.z*this.z));return[a,b,c]};this.isLoaded=function(){return Boolean(G)};this.getPitch=function(){return b.pitch};this.setPitch=function(a,c,d,e){N=Date.now();if(1E-6>= +Math.abs(a-b.pitch))return"function"==typeof d&&d(e),this;(c=c==p?1E3:Number(c))?(O.pitch={startTime:Date.now(),startPosition:b.pitch,endPosition:a,duration:c},"function"==typeof d&&setTimeout(function(){d(e)},c)):b.pitch=a;F();return this};this.getPitchBounds=function(){return[b.minPitch,b.maxPitch]};this.setPitchBounds=function(a){b.minPitch=Math.max(-90,Math.min(a[0],90));b.maxPitch=Math.max(-90,Math.min(a[1],90));return this};this.getYaw=function(){return(b.yaw+540)%360-180};this.setYaw=function(a, +c,d,e){N=Date.now();if(1E-6>=Math.abs(a-b.yaw))return"function"==typeof d&&d(e),this;c=c==p?1E3:Number(c);a=(a+180)%360-180;c?(180=Math.abs(a-b.hfov))return"function"==typeof d&&d(e),this;(c=c==p?1E3:Number(c))?(O.hfov={startTime:Date.now(),startPosition:b.hfov,endPosition:u(a),duration:c},"function"==typeof d&&setTimeout(function(){d(e)},c)):x(a);F();return this};this.getHfovBounds=function(){return[b.minHfov,b.maxHfov]};this.setHfovBounds=function(a){b.minHfov=Math.max(0,a[0]);b.maxHfov=Math.max(0,a[1]);return this};this.lookAt=function(a, +c,d,e,g,h){e=e==p?1E3:Number(e);a!==p&&1E-6 + + + testsvg + + + + +
    + + + + + + n + drew + + + + + @2023 + + + + +
    + + + + \ No newline at end of file diff --git a/attachments/russia/upload.sh b/attachments/russia/upload.sh new file mode 100755 index 0000000..ec1b2c8 --- /dev/null +++ b/attachments/russia/upload.sh @@ -0,0 +1,2 @@ +#!/bin/bash +ossutil sync . oss://icodetest/bookdemo/20220328/etc/ppt/russia/ --delete -u -f diff --git a/attachments/russia/vidProc.sh b/attachments/russia/vidProc.sh new file mode 100755 index 0000000..2844df6 --- /dev/null +++ b/attachments/russia/vidProc.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +filename=$(basename -- "$1") +extension="${filename##*.}" +filename="${filename%.*}" + +ffmpeg -i $1 -vf scale=800:480 videos/${filename}.dest.${extension} + +echo "" | pbcopy diff --git a/attachments/russia/vidVProc.sh b/attachments/russia/vidVProc.sh new file mode 100755 index 0000000..92661df --- /dev/null +++ b/attachments/russia/vidVProc.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +filename=$(basename -- "$1") +extension="${filename##*.}" +filename="${filename%.*}" + +ffmpeg -i $1 -vf scale=480:800 videos/${filename}.dest.${extension} + +echo "" | pbcopy diff --git a/attachments/russia/videos/VID_20230530_121508.dest.mp4 b/attachments/russia/videos/VID_20230530_121508.dest.mp4 new file mode 100644 index 0000000..95857e2 Binary files /dev/null and b/attachments/russia/videos/VID_20230530_121508.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230530_152056.dest.mp4 b/attachments/russia/videos/VID_20230530_152056.dest.mp4 new file mode 100644 index 0000000..c7e34d0 Binary files /dev/null and b/attachments/russia/videos/VID_20230530_152056.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230530_160533.dest.mp4 b/attachments/russia/videos/VID_20230530_160533.dest.mp4 new file mode 100644 index 0000000..0be68ac Binary files /dev/null and b/attachments/russia/videos/VID_20230530_160533.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230530_164516.dest.mp4 b/attachments/russia/videos/VID_20230530_164516.dest.mp4 new file mode 100644 index 0000000..32f650c Binary files /dev/null and b/attachments/russia/videos/VID_20230530_164516.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230531_135742.dest.mp4 b/attachments/russia/videos/VID_20230531_135742.dest.mp4 new file mode 100644 index 0000000..407f8a0 Binary files /dev/null and b/attachments/russia/videos/VID_20230531_135742.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230601_101037.dest.mp4 b/attachments/russia/videos/VID_20230601_101037.dest.mp4 new file mode 100644 index 0000000..386cc29 Binary files /dev/null and b/attachments/russia/videos/VID_20230601_101037.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230602_122750.dest.mp4 b/attachments/russia/videos/VID_20230602_122750.dest.mp4 new file mode 100644 index 0000000..90a13d5 Binary files /dev/null and b/attachments/russia/videos/VID_20230602_122750.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230603_114158.dest.mp4 b/attachments/russia/videos/VID_20230603_114158.dest.mp4 new file mode 100644 index 0000000..48a15e4 Binary files /dev/null and b/attachments/russia/videos/VID_20230603_114158.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230603_160713.dest.mp4 b/attachments/russia/videos/VID_20230603_160713.dest.mp4 new file mode 100644 index 0000000..5d99ba8 Binary files /dev/null and b/attachments/russia/videos/VID_20230603_160713.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230604_071849.dest.mp4 b/attachments/russia/videos/VID_20230604_071849.dest.mp4 new file mode 100644 index 0000000..158c0e0 Binary files /dev/null and b/attachments/russia/videos/VID_20230604_071849.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230604_120913.dest.mp4 b/attachments/russia/videos/VID_20230604_120913.dest.mp4 new file mode 100644 index 0000000..db9c666 Binary files /dev/null and b/attachments/russia/videos/VID_20230604_120913.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230604_165125.dest.mp4 b/attachments/russia/videos/VID_20230604_165125.dest.mp4 new file mode 100644 index 0000000..80df4ed Binary files /dev/null and b/attachments/russia/videos/VID_20230604_165125.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230604_165513.dest.mp4 b/attachments/russia/videos/VID_20230604_165513.dest.mp4 new file mode 100644 index 0000000..9c64eea Binary files /dev/null and b/attachments/russia/videos/VID_20230604_165513.dest.mp4 differ diff --git a/attachments/russia/videos/VID_20230605_103828.dest.mp4 b/attachments/russia/videos/VID_20230605_103828.dest.mp4 new file mode 100644 index 0000000..cb434f8 Binary files /dev/null and b/attachments/russia/videos/VID_20230605_103828.dest.mp4 differ