From d905152e63346d611186a99eab9f8781a14d0564 Mon Sep 17 00:00:00 2001 From: Mo Beigi Date: Fri, 13 Nov 2020 17:23:08 +1100 Subject: [PATCH 1/2] Refactor to introduce __meta__ file --- src/__init__.py | 45 +++++++++++++++++---------------------------- src/__meta__.py | 13 +++++++++++++ src/_version.py | 2 -- 3 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 src/__meta__.py delete mode 100644 src/_version.py diff --git a/src/__init__.py b/src/__init__.py index 441d5c1..5e2a855 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,28 +1,17 @@ -""" - fb2cal - Facebook Birthday Events to ICS file converter - Created by: mobeigi - - This program is free software: you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) any later - version. - - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along with - this program. If not, see . -""" - -from _version import __version_info__, __version__ - -__author__ = 'Mo Beigi' -__copyright__ = 'Copyright 2019' -__email__ = 'me@mobeigi.com' -__license__ = "GPLv3" -__maintainer__ = 'Mo Beigi' -__status__ = 'Production' -__website__ = 'https://git.io/fjMwr' - -# Make metadata public to script -__all__ = ['__author__', '__copyright__', '__email__', '__license__', '__maintainer__', '__status__', '__website__', '__version_info__', '__version__'] \ No newline at end of file +""" + fb2cal - Facebook Birthday Events to ICS file converter + Created by: mobeigi + + This program is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with + this program. If not, see . +""" + +from .__meta__ import * \ No newline at end of file diff --git a/src/__meta__.py b/src/__meta__.py new file mode 100644 index 0000000..39da19a --- /dev/null +++ b/src/__meta__.py @@ -0,0 +1,13 @@ +__author__ = 'Mo Beigi' +__copyright__ = 'Copyright 2019-2020' +__email__ = 'me@mobeigi.com' +__license__ = "GPLv3" +__maintainer__ = 'Mo Beigi' +__status__ = 'Production' +__website__ = 'https://git.io/fjMwr' +__version_info__ = (1, 2, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +# Make metadata public to script +__all__ = ['__author__', '__copyright__', '__email__', '__license__', '__maintainer__', '__status__', '__website__', '__version_info__', '__version__'] \ No newline at end of file diff --git a/src/_version.py b/src/_version.py deleted file mode 100644 index 044bf42..0000000 --- a/src/_version.py +++ /dev/null @@ -1,2 +0,0 @@ -__version_info__ = (1, 1, 0) -__version__ = '.'.join(map(str, __version_info__)) \ No newline at end of file From f5e08e1cdcadd05125d2a701ab67a271ceaa03ff Mon Sep 17 00:00:00 2001 From: Mo Beigi Date: Fri, 13 Nov 2020 18:56:26 +1100 Subject: [PATCH 2/2] Add tests and refactor code into a module --- .gitignore | 6 +- README.md | 8 +- config/config-template.ini | 2 +- {src => fb2cal}/__init__.py | 6 +- fb2cal/__main__.py | 96 + {src => fb2cal}/__meta__.py | 0 {src => fb2cal}/config.py | 4 +- {src => fb2cal}/facebook_browser.py | 3 +- {src => fb2cal}/facebook_user.py | 0 {src => fb2cal}/ics_writer.py | 7 +- {src => fb2cal}/logger.py | 2 +- {src => fb2cal}/transformer.py | 8 +- src/fb2cal.py | 97 - tests/mocks/birthday_comet_root_mocks.py | 3445 ++++++++++++++++++++++ tests/test_ics_writer.py | 136 + tests/test_transformer.py | 42 + 16 files changed, 3744 insertions(+), 118 deletions(-) rename {src => fb2cal}/__init__.py (82%) create mode 100644 fb2cal/__main__.py rename {src => fb2cal}/__meta__.py (100%) rename {src => fb2cal}/config.py (87%) rename {src => fb2cal}/facebook_browser.py (97%) rename {src => fb2cal}/facebook_user.py (100%) rename {src => fb2cal}/ics_writer.py (91%) rename {src => fb2cal}/logger.py (90%) rename {src => fb2cal}/transformer.py (84%) delete mode 100644 src/fb2cal.py create mode 100644 tests/mocks/birthday_comet_root_mocks.py create mode 100644 tests/test_ics_writer.py create mode 100644 tests/test_transformer.py diff --git a/.gitignore b/.gitignore index fe9890c..6b05253 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,11 @@ # Config file config/config.ini -# Sensitive credentials -src/credentials.json -src/token.json - # Logs logs/ # Output files -*.ics +out/ # Github.com gitignore/Python.gitignore # Byte-compiled / optimized / DLL files diff --git a/README.md b/README.md index 4418e5a..181745a 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ After gathering a list of birthdays for all the users friends for a full year, i 1. Clone repo `git clone git@github.com:mobeigi/fb2cal.git` 2. Rename `config/config-template.ini` to `config/config.ini` and enter your Facebook email and password (no quotes). -3. Install required python modules +3. Set up pipenv environment `pipenv install` -4. Run the script manually: -`pipenv run python src/fb2cal.py` -5. Import the created `birthdays.ics` file into Calendar applications (i.e. Google Calendar) +4. Run the `fb2cal` module +`pipenv run python -m fb2cal` +5. Check the output folder (`out` by default) for the created `birthdays.ics` file ## Configuration This tool can be configured by editing the `config/config.ini` configuration file. diff --git a/config/config-template.ini b/config/config-template.ini index 60d0465..a3feb6d 100644 --- a/config/config-template.ini +++ b/config/config-template.ini @@ -5,7 +5,7 @@ fb_pass = [FILESYSTEM] save_to_file = True -ics_file_path = ./birthdays.ics +ics_file_path = ./out/birthdays.ics [LOGGING] level = INFO diff --git a/src/__init__.py b/fb2cal/__init__.py similarity index 82% rename from src/__init__.py rename to fb2cal/__init__.py index 5e2a855..96dcd46 100644 --- a/src/__init__.py +++ b/fb2cal/__init__.py @@ -14,4 +14,8 @@ this program. If not, see . """ -from .__meta__ import * \ No newline at end of file +from .__meta__ import * +from .transformer import * +from .facebook_user import * +from .facebook_browser import * +from .ics_writer import * diff --git a/fb2cal/__main__.py b/fb2cal/__main__.py new file mode 100644 index 0000000..bc61235 --- /dev/null +++ b/fb2cal/__main__.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + +""" + fb2cal - Facebook Birthday Events to ICS file converter + Created by: mobeigi + + This program is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with + this program. If not, see . +""" + +import os +import sys +import logging +from distutils import util + +from .ics_writer import ICSWriter +from .logger import Logger +from .config import Config +from .facebook_browser import FacebookBrowser +from .transformer import Transformer + +from .__init__ import __version__, __status__, __website__, __license__ + +# Set CWD to script directory +os.chdir(sys.path[0]) + +# Init logger +logger = Logger('fb2cal').getLogger() +logger.info(f'Starting fb2cal v{__version__} ({__status__}) [{__website__}]') +logger.info(f'This project is released under the {__license__} license.') + +try: + # Read config + logger.info(f'Attemping to parse config file...') + config = Config().getConfig() + logger.info('Config successfully loaded.') + + # Set logging level based on config + try: + logger.setLevel(getattr(logging, config['LOGGING']['level'])) + logging.getLogger().setLevel(logger.level) # Also set root logger level + except AttributeError: + logger.error(f'Invalid logging level specified. Level: {config["LOGGING"]["level"]}') + raise SystemError + + logger.info(f'Logging level set to: {logging.getLevelName(logger.level)}') + + # Init Facebook browser + facebook_browser = FacebookBrowser() + + # Attempt login + logger.info('Attemping to authenticate with Facebook...') + facebook_browser.authenticate(config['AUTH']['FB_EMAIL'], config['AUTH']['FB_PASS']) + logger.info('Successfully authenticated with Facebook.') + + # Fetch birthdays for a full calendar year and transform them + facebook_users = [] + transformer = Transformer() + + # Endpoint will return all birthdays for offset_month plus the following 2 consecutive months. + logger.info('Fetching all Birthdays via BirthdayCometRootQuery endpoint...') + for offset_month in [1, 4, 7, 10]: + birthday_comet_root_json = facebook_browser.query_graph_ql_birthday_comet_root(offset_month) + facebook_users_for_quarter = transformer.transform_birthday_comet_root_to_birthdays(birthday_comet_root_json) + facebook_users.extend(facebook_users_for_quarter) + + if len(facebook_users) == 0: + logger.warning(f'Facebook user list is empty. Failed to fetch any birthdays.') + raise SystemError + + logger.info(f'A total of {len(facebook_users)} birthdays were found.') + + # Generate ICS + ics_writer = ICSWriter(facebook_users) + logger.info('Creating birthday ICS file...') + ics_writer.generate() + logger.info('ICS file created successfully.') + + # Save to file system + if util.strtobool(config['FILESYSTEM']['SAVE_TO_FILE']): + ics_writer.write(config['FILESYSTEM']['ICS_FILE_PATH']) + + logger.info('Done! Terminating gracefully.') +except SystemExit: + logger.critical(f'Critical error encountered. Terminating.') + sys.exit() +finally: + logging.shutdown() diff --git a/src/__meta__.py b/fb2cal/__meta__.py similarity index 100% rename from src/__meta__.py rename to fb2cal/__meta__.py diff --git a/src/config.py b/fb2cal/config.py similarity index 87% rename from src/config.py rename to fb2cal/config.py index d24e44c..912fab8 100644 --- a/src/config.py +++ b/fb2cal/config.py @@ -1,8 +1,8 @@ import configparser -from logger import Logger +from .logger import Logger CONFIG_FILE_NAME = 'config.ini' -CONFIG_FILE_PATH = f'../config/{CONFIG_FILE_NAME}' +CONFIG_FILE_PATH = f'config/{CONFIG_FILE_NAME}' CONFIG_FILE_TEMPLATE_NAME = 'config-template.ini' class Config: diff --git a/src/facebook_browser.py b/fb2cal/facebook_browser.py similarity index 97% rename from src/facebook_browser.py rename to fb2cal/facebook_browser.py index 50fb360..62c40c7 100644 --- a/src/facebook_browser.py +++ b/fb2cal/facebook_browser.py @@ -2,7 +2,8 @@ import re import requests import json -from logger import Logger + +from .logger import Logger class FacebookBrowser: def __init__(self): diff --git a/src/facebook_user.py b/fb2cal/facebook_user.py similarity index 100% rename from src/facebook_user.py rename to fb2cal/facebook_user.py diff --git a/src/ics_writer.py b/fb2cal/ics_writer.py similarity index 91% rename from src/ics_writer.py rename to fb2cal/ics_writer.py index 11fd08c..9fc22c0 100644 --- a/src/ics_writer.py +++ b/fb2cal/ics_writer.py @@ -5,9 +5,9 @@ from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta import calendar -from logger import Logger -from __init__ import __version__, __status__, __website__ +from .logger import Logger +from .__init__ import __version__, __status__, __website__ """ Write Birthdays to an ICS file """ class ICSWriter: @@ -66,3 +66,6 @@ def write(self, ics_file_path): with open(ics_file_path, mode='w', encoding="UTF-8") as ics_file: ics_file.write(ics_str) self.logger.info(f'Successfully saved ICS file to {os.path.abspath(ics_file_path)}') + + def get_birthday_calendar(self): + return self.birthday_calendar diff --git a/src/logger.py b/fb2cal/logger.py similarity index 90% rename from src/logger.py rename to fb2cal/logger.py index 52b2c83..7d0358e 100644 --- a/src/logger.py +++ b/fb2cal/logger.py @@ -1,7 +1,7 @@ import os import logging -LOGGING_FILE_PATH = '../logs/fb2cal.log' +LOGGING_FILE_PATH = 'logs/fb2cal.log' class Logger: def __init__(self, name): diff --git a/src/transformer.py b/fb2cal/transformer.py similarity index 84% rename from src/transformer.py rename to fb2cal/transformer.py index 69cd751..ddf9767 100644 --- a/src/transformer.py +++ b/fb2cal/transformer.py @@ -1,18 +1,18 @@ -from facebook_user import FacebookUser +from .facebook_user import FacebookUser class Transformer: def transform_birthday_comet_root_to_birthdays(self, birthday_comet_root_json): """ Transforms outfrom from BirthdayCometRootQuery to list of Birthdays """ - birthdays = [] + facebook_users = [] for all_friends_by_birthday_month_edge in birthday_comet_root_json['data']['viewer']['all_friends_by_birthday_month']['edges']: for friend_edge in all_friends_by_birthday_month_edge['node']['friends']['edges']: friend = friend_edge['node'] # Create Birthday object - birthdays.append( + facebook_users.append( FacebookUser( friend["id"], friend["name"], @@ -22,4 +22,4 @@ def transform_birthday_comet_root_to_birthdays(self, birthday_comet_root_json): friend["birthdate"]["month"] )) - return birthdays \ No newline at end of file + return facebook_users \ No newline at end of file diff --git a/src/fb2cal.py b/src/fb2cal.py deleted file mode 100644 index b16b0e8..0000000 --- a/src/fb2cal.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python3 - -""" - fb2cal - Facebook Birthday Events to ICS file converter - Created by: mobeigi - - This program is free software: you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or (at your option) any later - version. - - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along with - this program. If not, see . -""" - -from __init__ import __version__, __status__, __website__, __license__ - -import os -import sys -import logging -from distutils import util - -from ics_writer import ICSWriter -from logger import Logger -from config import Config -from facebook_browser import FacebookBrowser -from transformer import Transformer - -if __name__ == '__main__': - # Set CWD to script directory - os.chdir(sys.path[0]) - - # Init logger - logger = Logger('fb2cal').getLogger() - logger.info(f'Starting fb2cal v{__version__} ({__status__}) [{__website__}]') - logger.info(f'This project is released under the {__license__} license.') - - try: - # Read config - logger.info(f'Attemping to parse config file...') - config = Config().getConfig() - logger.info('Config successfully loaded.') - - # Set logging level based on config - try: - logger.setLevel(getattr(logging, config['LOGGING']['level'])) - logging.getLogger().setLevel(logger.level) # Also set root logger level - except AttributeError: - logger.error(f'Invalid logging level specified. Level: {config["LOGGING"]["level"]}') - raise SystemError - - logger.info(f'Logging level set to: {logging.getLevelName(logger.level)}') - - # Init Facebook browser - facebook_browser = FacebookBrowser() - - # Attempt login - logger.info('Attemping to authenticate with Facebook...') - facebook_browser.authenticate(config['AUTH']['FB_EMAIL'], config['AUTH']['FB_PASS']) - logger.info('Successfully authenticated with Facebook.') - - # Fetch birthdays for a full calendar year and transform them - facebook_users = [] - transformer = Transformer() - - # Endpoint will return all birthdays for offset_month plus the following 2 consecutive months. - logger.info('Fetching all Birthdays via BirthdayCometRootQuery endpoint...') - for offset_month in [1, 4, 7, 10]: - birthday_comet_root_json = facebook_browser.query_graph_ql_birthday_comet_root(offset_month) - facebook_users_for_quarter = transformer.transform_birthday_comet_root_to_birthdays(birthday_comet_root_json) - facebook_users.extend(facebook_users_for_quarter) - - if len(facebook_users) == 0: - logger.warning(f'Facebook user list is empty. Failed to fetch any birthdays.') - raise SystemError - - logger.info(f'A total of {len(facebook_users)} birthdays were found.') - - # Generate ICS - ics_writer = ICSWriter(facebook_users) - logger.info('Creating birthday ICS file...') - ics_writer.generate() - logger.info('ICS file created successfully.') - - # Save to file system - if util.strtobool(config['FILESYSTEM']['SAVE_TO_FILE']): - ics_writer.write(config['FILESYSTEM']['ICS_FILE_PATH']) - - logger.info('Done! Terminating gracefully.') - except SystemExit: - logger.critical(f'Critical error encountered. Terminating.') - sys.exit() - finally: - logging.shutdown() diff --git a/tests/mocks/birthday_comet_root_mocks.py b/tests/mocks/birthday_comet_root_mocks.py new file mode 100644 index 0000000..89772bc --- /dev/null +++ b/tests/mocks/birthday_comet_root_mocks.py @@ -0,0 +1,3445 @@ +BIRTHDAY_COMET_ROOT_JANUARY_MOCK = { + "data":{ + "today":{ + "all_friends":{ + "edges":[ + + ] + } + }, + "recent":{ + "all_friends":{ + "edges":[ + { + "__typename":"AllFriendsEdge", + "node":{ + "__typename":"User", + "id":"100000000000001", + "birthdate":{ + "day":1, + "month":1, + "text":"1 January 2000", + "year":2000 + }, + "birthday_campaign":None, + "has_viewer_posted_for_birthday":False, + "name":"Test User", + "__isActor":"User", + "__isEntity":"User", + "profile_url":"https://www.facebook.com/test.user", + "story_bucket":{ + "nodes":[ + + ] + }, + "url":"https://www.facebook.com/test.user", + "profile_picture":{ + "uri":"https://scontent-syd2-1.xx.fbcdn.net/v/t1.30497-1/c29.0.100.100a/p100x100/84241059_189132118950875_4138507100605120512_n.jpg?_nc_cat=1&ccb=2&_nc_sid=7206a8&_nc_ohc=NcxDdcCWF5IAX9uLSTe&_nc_ht=scontent-syd2-1.xx&tp=27&oh=75cf4f4372f5eca63c50b94ca6d4949d&oe=5FD42D1E", + "width":100, + "height":100, + "scale":1.5 + }, + "can_viewer_message":True, + "can_viewer_post":True, + "fundraisers_owned":{ + "nodes":[ + + ] + }, + "gender":"MALE", + "__isNode":"User" + } + } + ] + } + }, + "upcoming":{ + "all_friends":{ + "edges":[ + { + "__typename":"AllFriendsEdge", + "node":{ + "__typename":"User", + "id":"1353772287", + "birthdate":{ + "day":2, + "month":2, + "text":"2 February", + "year":None + }, + "birthday_campaign":None, + "has_viewer_posted_for_birthday":False, + "name":"Crazy Captain", + "__isActor":"User", + "__isEntity":"User", + "profile_url":"https://www.facebook.com/crazy.captain", + "story_bucket":{ + "nodes":[ + + ] + }, + "url":"https://www.facebook.com/crazy.captain", + "profile_picture":{ + "uri":"https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/c0.17.100.100a/p100x100/480422_10201565103753467_1788826544_n.jpg?_nc_cat=103&ccb=2&_nc_sid=7206a8&_nc_ohc=oHFfGjW58VkAX8trdsg&_nc_ht=scontent-syd2-1.xx&tp=27&oh=b4921c5c9364d16a4617319b922d983a&oe=5FD52631", + "width":100, + "height":100, + "scale":1.5 + }, + "can_viewer_message":True, + "can_viewer_post":True, + "fundraisers_owned":{ + "nodes":[ + + ] + }, + "gender":"MALE", + "__isNode":"User" + } + } + ] + } + }, + "upcomingAll":{ + "all_friends":{ + "edges":[ + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + }, + { + "__typename":"AllFriendsEdge" + } + ] + } + }, + "viewer":{ + "actor":{ + "__typename":"User", + "id":"1000000017" + }, + "all_friends":{ + "edges":[ + + ] + }, + "all_friends_by_birthday_month":{ + "page_info":{ + "has_next_page":True, + "end_cursor":"2" + }, + "edges":[ + { + "node":{ + "month_name_in_iso8601":"November", + "friends_by_birthday_month_context_sentence":{ + "text":"Pirate Pete, Lorem Ipsum and 30 others", + "ranges":[ + { + "length":18, + "offset":0, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/pirate.pete", + "__isNode":"User", + "id":"600009847" + } + }, + { + "length":15, + "offset":20, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/lorem.ipsum", + "__isNode":"User", + "id":"1000021917" + } + } + ] + }, + "friends":{ + "edges":[ + { + "node":{ + "__typename":"User", + "id":"600009847", + "__isActor":"User", + "__isEntity":"User", + "profile_url":"https://www.facebook.com/pirate.pete", + "url":"https://www.facebook.com/pirate.pete", + "name":"Pirate Pete", + "profile_picture":{ + "uri":"https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/122897864_10161077510019848_299841799681806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7206a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0", + "width":60, + "height":60, + "scale":1 + }, + "birthdate":{ + "day":1, + "month":11 + }, + "__module_operation_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser_user$normalization.graphql" + }, + "__module_component_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser.react" + } + } + } + ] + }, + "__typename":"FriendsByBirthdayMonth" + }, + "cursor":"0" + }, + { + "node":{ + "month_name_in_iso8601":"December", + "friends_by_birthday_month_context_sentence":{ + "text":"Santa Claus, Lorem Ipsum and 30 others", + "ranges":[ + { + "length":18, + "offset":0, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/pirate.pete", + "__isNode":"User", + "id":"600009847" + } + }, + { + "length":15, + "offset":20, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/lorem.ipsum", + "__isNode":"User", + "id":"1000021917" + } + } + ] + }, + "friends":{ + "edges":[ + { + "node":{ + "__typename":"User", + "id":"1000023", + "__isActor":"User", + "__isEntity":"User", + "profile_url":"https://www.facebook.com/santa", + "url":"https://www.facebook.com/santa", + "name":"Santa Claus", + "profile_picture":{ + "uri":"https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/53497864_10161077510019848_299841799451806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7206a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0", + "width":60, + "height":60, + "scale":1 + }, + "birthdate":{ + "day":25, + "month":12 + }, + "__module_operation_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser_user$normalization.graphql" + }, + "__module_component_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser.react" + } + } + } + ] + }, + "__typename":"FriendsByBirthdayMonth" + }, + "cursor":"0" + }, + { + "node":{ + "month_name_in_iso8601":"January", + "friends_by_birthday_month_context_sentence":{ + "text":"Albus Dumbledore, Lorem Ipsum and 30 others", + "ranges":[ + { + "length":18, + "offset":0, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/prof.albus", + "__isNode":"User", + "id":"198041065" + } + }, + { + "length":15, + "offset":20, + "entity":{ + "__typename":"User", + "url":"https://www.facebook.com/lorem.ipsum", + "__isNode":"User", + "id":"1000021917" + } + } + ] + }, + "friends":{ + "edges":[ + { + "node":{ + "__typename":"User", + "id":"198041065", + "__isActor":"User", + "__isEntity":"User", + "profile_url":"https://www.facebook.com/prof.albus", + "url":"https://www.facebook.com/prof.albus", + "name":"Albus Dumbledore", + "profile_picture":{ + "uri":"https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/34f34864_10161077510019848_299841799681806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7406a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0", + "width":60, + "height":60, + "scale":1 + }, + "birthdate":{ + "day":17, + "month":1 + }, + "__module_operation_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser_user$normalization.graphql" + }, + "__module_component_BirthdayCometMonthlyBirthdaysCard_allFriendsByBirthdayMonthEdge":{ + "__dr":"BirthdayCometProfilePictureOnUser.react" + } + } + } + ] + }, + "__typename":"FriendsByBirthdayMonth" + }, + "cursor":"0" + } + ] + } + } + }, + "extensions":{ + "prefetch_uris":[ + "https://scontent-syd2-1.xx.fbcdn.net/v/t1.30497-1/c29.0.100.100a/p100x100/84688533_170842440872810_7559275468982059008_n.jpg?_nc_cat=1&ccb=2&_nc_sid=7206a8&_nc_ohc=B7Jv1F4fVZsAX8jxjwl&_nc_ht=scontent-syd2-1.xx&tp=27&oh=4f092f6be54b6c24c80e51dfe2819fbe&oe=5FD218CE" + ], + "is_final":True, + "sr_payload":{ + "ddd":{ + "hsrp":{ + "hsdp":{ + "ixData":{ + "701592":{ + "sprited":True, + "spriteCssClass":"sx_8d0011", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + }, + "702721":{ + "sprited":True, + "spriteCssClass":"sx_8923d1", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + }, + "897949":{ + "sprited":True, + "spriteCssClass":"sx_b4ea67", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + }, + "1739808":{ + "sprited":True, + "spriteCssClass":"sx_bdd481", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + }, + "478233":{ + "sprited":True, + "spriteCssClass":"sx_f7cd6d", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + }, + "512647":{ + "sprited":True, + "spriteCssClass":"sx_d42c2b", + "spriteMapCssClass":"sp_SUbCB3dvdK0_1_5x", + "_spi":"https://static.xx.fbcdn.net/rsrc.php/v3/yv/r/Vfci4zjeyyU.png" + } + }, + "clpData":{ + "1743887":{ + "r":1 + } + }, + "gkxData":{ + "708253":{ + "result":True, + "hash":"AT4s8T6k1U6g6vakamI" + }, + "946894":{ + "result":False, + "hash":"AT7EcfNCNduy84M28Yg" + }, + "996940":{ + "result":False, + "hash":"AT5Wu5uBZgaKb0yg_oY" + }, + "1224637":{ + "result":False, + "hash":"AT7JxliQI8hpWcLYC44" + }, + "1263340":{ + "result":True, + "hash":"AT40PfVfMMG5iOJ9bQk" + }, + "729630":{ + "result":False, + "hash":"AT7aWHNdCcW8bg5AdeE" + }, + "729631":{ + "result":False, + "hash":"AT5835nA6NdsgF1uYHs" + }, + "976093":{ + "result":False, + "hash":"AT7YEsoHBOYocQCCUCE" + }, + "1070056":{ + "result":False, + "hash":"AT5-7mU_qStuUGsRmEQ" + }, + "1070695":{ + "result":False, + "hash":"AT6jXq2HC2P1CAENTAw" + }, + "1099893":{ + "result":False, + "hash":"AT5HDPURDoeDlb3dzqQ" + }, + "1105608":{ + "result":True, + "hash":"AT5BaLfV2phcFH7SZuA" + }, + "1167394":{ + "result":False, + "hash":"AT4E9n3J1KIp5c5fbto" + }, + "1245813":{ + "result":False, + "hash":"AT6pGvb41vVhlcuwZic" + }, + "1281505":{ + "result":False, + "hash":"AT7npWLt2ugXwiRTtQM" + }, + "1291023":{ + "result":False, + "hash":"AT7EDSF6PM25YI-Tt6g" + }, + "1294182":{ + "result":False, + "hash":"AT7MnZiIYgs5RIBoDzM" + }, + "1381768":{ + "result":True, + "hash":"AT4BqIZWosiXKbec5dM" + }, + "1399218":{ + "result":True, + "hash":"AT6BGomHScy8eZTN_GI" + }, + "1401060":{ + "result":True, + "hash":"AT6cirC1qf8bBM3Vr_0" + }, + "1409295":{ + "result":False, + "hash":"AT6aZhsgR6NkuBIX5-8" + }, + "1435443":{ + "result":False, + "hash":"AT4aOt3fHvd2BvEbyfw" + }, + "1441635":{ + "result":True, + "hash":"AT4Sso_TaHj73uwrED4" + }, + "1465547":{ + "result":True, + "hash":"AT79chtpTi7EihEMiMA" + }, + "1470120":{ + "result":False, + "hash":"AT6E4MDSgjjJQxRkpRE" + }, + "1485055":{ + "result":True, + "hash":"AT6nJWRjY7HbW1NcfkU" + }, + "1584797":{ + "result":False, + "hash":"AT4_o2WiD3VWOU3pfUA" + }, + "1597642":{ + "result":True, + "hash":"AT7BwGB92felLmu0nK0" + }, + "1616314":{ + "result":False, + "hash":"AT4ZNJRNgTCqJqASJMA" + }, + "1620803":{ + "result":True, + "hash":"AT6rTvCs1vl2AxjMcwE" + }, + "1642984":{ + "result":False, + "hash":"AT5ooQM8glKKH-CzoCg" + }, + "1647260":{ + "result":False, + "hash":"AT5ydPABqMuMmGZ--0I" + }, + "1661070":{ + "result":False, + "hash":"AT67njNOJwjkVY_0bt8" + }, + "1695831":{ + "result":True, + "hash":"AT4AQHlAy-Wh6s9hxKQ" + }, + "1703328":{ + "result":True, + "hash":"AT4eRXDIPnp4HcuhXC4" + }, + "1721477":{ + "result":False, + "hash":"AT5e0GaCBSgjtSAjvNw" + }, + "1722014":{ + "result":False, + "hash":"AT7QX_LeDp2e36IwU9s" + }, + "1723588":{ + "result":False, + "hash":"AT5S-52CNi2u-l7KeZE" + }, + "1742795":{ + "result":False, + "hash":"AT62qHmLjEXnAPNoMIY" + }, + "1745526":{ + "result":False, + "hash":"AT6_uQKfxgg_wqIZWA0" + }, + "1748426":{ + "result":False, + "hash":"AT4DWqmLs1VcIzlnHR0" + }, + "1773564":{ + "result":False, + "hash":"AT61ePH-EL0ilhVE-RY" + }, + "1778302":{ + "result":False, + "hash":"AT4wx0cT40WtHfWNr4Q" + }, + "1458993":{ + "result":True, + "hash":"AT6nUTSUeQ-Mmm7t67A" + }, + "950768":{ + "result":False, + "hash":"AT4fNHWoUogfTCFOGTU" + }, + "1293035":{ + "result":False, + "hash":"AT4jMZhVALftNgFv1Kc" + }, + "1537962":{ + "result":False, + "hash":"AT4Cy3p0ttzxsO4wtTI" + }, + "1690028":{ + "result":False, + "hash":"AT5Fy9lH_f0wz7SUyGg" + }, + "894204":{ + "result":False, + "hash":"AT7W8ZoZGztAOuuOsrs" + }, + "1708607":{ + "result":False, + "hash":"AT6az_6A38u8_FULXjU" + }, + "676837":{ + "result":False, + "hash":"AT5b0rnWcFbVSiJz3R0" + }, + "1703425":{ + "result":True, + "hash":"AT6GLXz0bRQ0IfWdpVY" + }, + "1738831":{ + "result":False, + "hash":"AT6ChGdYH1sNe7-ZphE" + } + }, + "qexData":{ + "1530372":{ + "r":True + }, + "1768468":{ + "r":False + }, + "1495392":{ + "r":"br" + }, + "1505135":{ + "r":None + } + } + }, + "hblp":{ + "sr_revision":1002971549, + "consistency":{ + "rev":1002971549 + }, + "rsrcMap":{ + "csr:_1_0":{ + "type":"csr", + "src":":1,8518,18,5,15709,36,15702,15713,15,27,2184,15734,15732,15737,15712" + }, + "csr:_1_1":{ + "type":"csr", + "src":":1285,15716,15715" + }, + "csr:_1_2":{ + "type":"csr", + "src":":8518" + }, + "csr:_1_3":{ + "type":"csr", + "src":":18,5,15709,36,1,15702,15713,15,8518,27,2184,15734,15737,15732,15712" + }, + "csr:_1_4":{ + "type":"csr", + "src":":1285,15716,15715" + }, + "csr:_1_5":{ + "type":"csr", + "src":":18,1,2242,27,15737" + }, + "csr:_1_6":{ + "type":"csr", + "src":":18,1" + }, + "csr:_1_7":{ + "type":"csr", + "src":":1285" + }, + "csr:_1_8":{ + "type":"csr", + "src":":18,1" + }, + "csr:_1_9":{ + "type":"csr", + "src":":1285" + }, + "csr:_1_a":{ + "type":"csr", + "src":":1" + }, + "csr:_1_b":{ + "type":"csr", + "src":":18,1,15702" + }, + "csr:_1_c":{ + "type":"csr", + "src":":1285" + }, + "csr:_1_d":{ + "type":"csr", + "src":":18,15703,1,15702,15735,73,2213" + }, + "csr:_1_e":{ + "type":"csr", + "src":":1285,2" + }, + "csr:_1_f":{ + "type":"csr", + "src":":15735" + }, + "csr:_1_g":{ + "type":"csr", + "src":":1" + }, + "csr:_1_h":{ + "type":"csr", + "src":":18,1285" + }, + "csr:_1_i":{ + "type":"csr", + "src":":2170" + }, + "csr:_1_j":{ + "type":"csr", + "src":":18,1,1285" + }, + "csr:_1_k":{ + "type":"csr", + "src":":18,15709,1,15716,15715,2184,15734,15702,15737,15732,15712" + }, + "csr:_1_l":{ + "type":"csr", + "src":":1285" + }, + "pucNV":{ + "type":"js", + "src":"https://static.xx.fbcdn.net/rsrc.php/v3/yJ/r/OzSkrxWa1oa.js?_nc_x=hveG_eKFTvT", + "p":":15733" + }, + "tQht2":{ + "type":"js", + "src":"https://static.xx.fbcdn.net/rsrc.php/v3/yQ/r/xIDtOFZrDQF.js?_nc_x=hveG_eKFTvT", + "p":":2175" + }, + "NoTm2":{ + "type":"js", + "src":"https://static.xx.fbcdn.net/rsrc.php/v3iXO_4/yF/l/en_GB/f5dXIUuV0PM.js?_nc_x=hveG_eKFTvT", + "p":":16" + }, + "csr:_1_m":{ + "type":"csr", + "src":":18,5,15709,92,1026,2222,10,1,15702,96,15713,15735,15734,27,2184,15737,15732,836,15712" + }, + "csr:_1_n":{ + "type":"csr", + "src":":1285,15703,73,340,36,15716,15715,2,2213" + }, + "lTlS3":{ + "type":"js", + "src":"data:application/x-javascript; charset=utf-8;base64,aWYgKHNlbGYuQ2F2YWxyeUxvZ2dlcikgeyBDYXZhbHJ5TG9nZ2VyLnN0YXJ0X2pzKFsibFRsUzMiXSk7IH0KCl9fZCgiQ29tZXRWaXN1YWxDb21wbGV0aW9uQ29uc3RhbnRzIixbXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPSJkYXRhLXZpc3VhbGNvbXBsZXRpb24iO2YuQVRUUklCVVRFX05BTUU9YTtiPSJIZXJvVHJhY2luZyI7Zi5IRVJPX1RSQUNJTkdfSE9MRD1iO2M9Imlnbm9yZSI7Zi5JR05PUkU9YztkPSJpZ25vcmUtZHluYW1pYyI7Zi5JR05PUkVfRFlOQU1JQz1kO2U9Imlnbm9yZS1sYXRlLW11dGF0aW9uIjtmLklHTk9SRV9MQVRFX01VVEFUSU9OPWU7YT0ibG9hZGluZy1zdGF0ZSI7Zi5MT0FESU5HX1NUQVRFPWF9KSxudWxsKTsKX19kKCJOdW1iZXJGb3JtYXQiLFsiTnVtYmVyRm9ybWF0Q29uZmlnIiwiaW50bE51bVV0aWxzIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtmLmZvcm1hdEludGVnZXJXaXRoRGVsaW1pdGVyPWE7Zi5mb3JtYXRJbnRlZ2VyPWM7dmFyIGc9LyhcZHszfSkoPz1cZCkvZztmdW5jdGlvbiBoKGEpe3JldHVybigiIithKS5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpfWZ1bmN0aW9uIGEoYSxjKXtpZihNYXRoLmFicyhhKS50b1N0cmluZygpLmxlbmd0aDxiKCJOdW1iZXJGb3JtYXRDb25maWciKS5taW5EaWdpdHNGb3JUaG91c2FuZHNTZXBhcmF0b3IpcmV0dXJuIGEudG9TdHJpbmcoKTthPWgoIiIrYSk7cmV0dXJuIGgoYS5yZXBsYWNlKGcsIiQxIitjKSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYigiaW50bE51bVV0aWxzIikuZm9ybWF0TnVtYmVyV2l0aFRob3VzYW5kRGVsaW1pdGVycyhhKX19KSxudWxsKTsKX19kKCJSZWFjdEZlYXR1cmVGbGFncyIsWyJUcnVzdGVkVHlwZXNDb25maWciLCJna3giXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjtjPXtlbmFibGVGaWx0ZXJFbXB0eVN0cmluZ0F0dHJpYnV0ZXNET006KGE9YigiZ2t4IikpKCIxMzk5MjE4IiksZGVidWdSZW5kZXJQaGFzZVNpZGVFZmZlY3RzRm9yU3RyaWN0TW9kZTphKCI3Mjk2MzAiKSxkaXNhYmxlTW9kdWxlUGF0dGVybkNvbXBvbmVudHM6YSgiMTM4MTc2OCIpLGRpc2FibGVJbnB1dEF0dHJpYnV0ZVN5bmNpbmc6YSgiNzI5NjMxIiksZGlzYWJsZU9uU2Nyb2xsQnViYmxpbmc6YSgiMTYyMDgwMyIpLGVuYWJsZVRydXN0ZWRUeXBlc0ludGVncmF0aW9uOmIoIlRydXN0ZWRUeXBlc0NvbmZpZyIpLnVzZVRydXN0ZWRUeXBlcyx3YXJuQWJvdXRTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbjphKCIxMjgxNTA1IiksZGlzYWJsZVNjaGVkdWxlclRpbWVvdXRCYXNlZE9uUmVhY3RFeHBpcmF0aW9uVGltZTphKCIxMjkxMDIzIiksd2FybkFib3V0U3ByZWFkaW5nS2V5VG9KU1g6YSgiMTI5NDE4MiIpLGVuYWJsZUxlZ2FjeUZCU3VwcG9ydDphKCIxNDAxMDYwIiksZW5hYmxlQ29tcG9uZW50U3RhY2tMb2NhdGlvbnM6ITAsZGlzYWJsZUhpZGRlblByb3BEZXByaW9yaXRpemF0aW9uOmEoIjE0ODUwNTUiKSxkZWNvdXBsZVVwZGF0ZVByaW9yaXR5RnJvbVNjaGVkdWxlcjphKCIxNTg0Nzk3IiksZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyQ29tcG9uZW50U3RhY2tzOmEoIjE2NDcyNjAiKSxlbmFibGVGb3JtRXZlbnREZWxlZ2F0aW9uOmEoIjE1OTc2NDIiKSxza2lwVW5tb3VudGVkQm91bmRhcmllczphKCIxNzIyMDE0IiksZW5hYmxlRWFnZXJSb290TGlzdGVuZXJzOiEwLGRpc2FibGVTY2hlZHVsZXJUaW1lb3V0SW5Xb3JrTG9vcDphKCIxNjk1ODMxIiksZW5hYmxlRG91YmxlSW52b2tpbmdFZmZlY3RzOmEoIjE3NDI3OTUiKSxlbmFibGVVc2VSZWZBY2Nlc3NXYXJuaW5nOmEoIjE3NzgzMDIiKX07ZS5leHBvcnRzPWN9KSxudWxsKTsKX19kKCJTY2hlZHVsZXJUcmFjaW5nLWRldi5jbGFzc2ljIixbIlJlYWN0RmVhdHVyZUZsYWdzIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCJ9KSxudWxsKTsKX19kKCJTY2hlZHVsZXJUcmFjaW5nIixbInJlcXVpcmVDb25kIiwiU2NoZWR1bGVyVHJhY2luZy1kZXYuY2xhc3NpYyIsImNyOjEyOTIzNjkiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPWIoImNyOjEyOTIzNjkiKTtlLmV4cG9ydHM9YX0pLG51bGwpOwpfX2QoIkludGVyYWN0aW9uVHJhY2luZ01ldHJpY3MiLFsiQ29tZXRWaXN1YWxDb21wbGV0aW9uQ29uc3RhbnRzIiwiRXJyb3JHdWFyZCIsIkZCTG9nZ2VyIiwiSlNUcmFjaW5nIiwiU2NoZWR1bGVyVHJhY2luZyIsImdreCIsInBlcmZvcm1hbmNlTmF2aWdhdGlvblN0YXJ0IiwicGVyZm9ybWFuY2VOb3ciLCJyZWNvdmVyYWJsZVZpb2xhdGlvbiIsInJlbW92ZUZyb21BcnJheSIsInJlcXVpcmVDb25kIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7dmFyIGcsaCxpPW5ldyBNYXAoKSxqPW5ldyBNYXAoKSxrPXt9LGw9W10sbT1iKCJwZXJmb3JtYW5jZU5hdmlnYXRpb25TdGFydCIpKCk7YT1mdW5jdGlvbigpe3ZhciBhPWIoImdreCIpKCIxNDA5Mjk1Iik/bnVsbDpiKCJKU1RyYWNpbmciKS5nZXRDdXJyZW50X0RFUFJFQ0FURUQoKSxjPW5ldyBNYXAoYigiZ2t4IikoIjE0MDkyOTUiKT9qOm51bGwpLGQ9ZnVuY3Rpb24oZCl7YigiZ2t4IikoIjE0MDkyOTUiKT9jLmZvckVhY2goZnVuY3Rpb24oYSl7ZChhKX0pOmEmJmEuc2l6ZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9cS5nZXQoYS5uYW1lKTthJiZkKGEpfSl9LGU9e2FkZEJvb3Rsb2FkOmZ1bmN0aW9uKGEsYixjLGUpe2QoZnVuY3Rpb24oZCl7dmFyIGY9YS5qb2luKCI7Iik7ZC5ib290bG9hZHNbZl09e2FsbFJlc291cmNlc0Rvd25sb2FkZWQ6ZSxjb21wb25lbnRzOmEsZHVyYXRpb246YyxlbmQ6YitjLW0sc3RhcnQ6Yi1tfX0pfSxhZGRHbG9iYWxNZXRhZGF0YTpmdW5jdGlvbihhLGIpe2tbYV09YixlLmFkZE1ldGFkYXRhKGEsYil9LGFkZE1hcmtlclBvaW50OmZ1bmN0aW9uKGEsYyxlLGYpe3ZhciBoPShlPWUpIT1udWxsP2U6KGd8fChnPWIoInBlcmZvcm1hbmNlTm93IikpKSgpO2QoZnVuY3Rpb24oYil7aD49Yi5zdGFydCYmKGIubWFya2VyUG9pbnRzW2FdPXt0aW1lc3RhbXA6aCx0eXBlOmN9LGYmJihiLm1hcmtlclBvaW50c1thXS5kYXRhPWYpKX0pfSxhZGRNZXRhZGF0YTpmdW5jdGlvbihhLGIpe2QoZnVuY3Rpb24oYyl7Yy5tZXRhZGF0YVthXT1ifSl9LGFkZFJlcXVpcmVEZWZlcnJlZDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2QoZnVuY3Rpb24oZCl7aWYoZC5yZXF1aXJlRGVmZXJyZWRzW2FdIT1udWxsKXJldHVybjtkPWQucmVxdWlyZURlZmVycmVkc1thXT17c3RhcnQ6Yn07Yy5wdXNoKGQpfSk7cmV0dXJuIGZ1bmN0aW9uKGEsZCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuZW5kPWEsYy5kdXJhdGlvbj1hLWIsZCYmKGMuYWxyZWFkeVJlcXVpcmVkPSEwKX0pfX0sYWRkU3Vic3BhbjpmdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBnPXtkYXRhOmYsZW5kOmUsc3RhcnQ6Yyx0eXBlOmJ9O2QoZnVuY3Rpb24oYil7Yi5zdWJTcGFuc1thXT9iLnN1YlNwYW5zW2FdLnB1c2goZyk6Yi5zdWJTcGFuc1thXT1bZ119KX0sYWRkVGFnOmZ1bmN0aW9uKGEsYil7ZChmdW5jdGlvbihjKXtjLnRhZ1NldFthXXx8KGMudGFnU2V0W2FdPW5ldyBTZXQoKSksYy50YWdTZXRbYV0uYWRkKGIpfSl9LGZvckVhY2g6ZnVuY3Rpb24oYSl7ZChmdW5jdGlvbihiKXthKGIpfSl9fTtyZXR1cm4gZX07ZnVuY3Rpb24gbihhLGMsZCl7aWYobC5sZW5ndGgpe3ZhciBlPXtfX3R5cGU6YSxpbnRlcmFjdGlvbjpjLG5hbWU6Yy50cmFjZUlkLHRpbWVzdGFtcDpkfTtsLmZvckVhY2goZnVuY3Rpb24oYSl7KGh8fChoPWIoIkVycm9yR3VhcmQiKSkpLmFwcGx5V2l0aEd1YXJkKGEsbnVsbCxbZV0se25hbWU6IkludGVyYWN0aW9uVHJhY2luZ01ldHJpY3NMaXN0ZW5lciJ9KX0pfX12YXIgbz17b25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9aS5nZXQoYS5uYW1lKTtjfHwoYigicmVjb3ZlcmFibGVWaW9sYXRpb24iKSgiVW50cmFjZWQgaW50ZXJhY3Rpb24gaXMgbWFya2VkIGFzIGNvbXBsZXRlZDogIithLm5hbWUsImNvbWV0X2luZnJhIiksYz1xLmFkZFRyYWNlZEludGVyYWN0aW9uKGEpKTtjLmNvbXBsZXRlZD09bnVsbD8oYy5jb21wbGV0ZWQ9KGd8fChnPWIoInBlcmZvcm1hbmNlTm93IikpKSgpLG4oImNvbXBsZXRlIixjLGMuY29tcGxldGVkKSk6Yy5tZXRhZGF0YS5jYW5jZWxUeXBlPT1udWxsJiZjLm1ldGFkYXRhLmFib3J0ZWQ9PW51bGwmJmIoIkZCTG9nZ2VyIikoImNvbWV0X2luZnJhIikud2FybigiVHJhY2VkIGludGVyYWN0aW9uIGFscmVhZHkgbWFya2VkIGFzIGNvbXBsZXRlZDogJSIsYS5uYW1lKX0sb25JbnRlcmFjdGlvblRyYWNlZDpmdW5jdGlvbihhKXtpLmhhcyhhLm5hbWUpP2IoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlN0YXJ0aW5nIGEgdHJhY2Ugb2YgYW4gaW50ZXJhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBzdGFydGVkPyIsImNvbWV0X2luZnJhIik6cS5hZGRUcmFjZWRJbnRlcmFjdGlvbihhKX0sb25Xb3JrQ2FuY2VsZWQ6ZnVuY3Rpb24oYSxiKXt9LG9uV29ya1NjaGVkdWxlZDpmdW5jdGlvbihhLGIpe30sb25Xb3JrU3RhcnRlZDpmdW5jdGlvbihhLGIpe30sb25Xb3JrU3RvcHBlZDpmdW5jdGlvbihhLGIpe319LHA9ITEscT17YWRkRmFjdG9yeVRpbWluZzpmdW5jdGlvbihhLGMpe3ZhciBkPWkuZ2V0KGEpO2lmKCFkKXtiKCJna3giKSgiMTc0NTUyNiIpJiZiKCJyZWNvdmVyYWJsZVZpb2xhdGlvbiIpKCJUcmllZCB0byBhZGQgRmFjdG9yeVRpbWluZyB0byBhbiB1bnRyYWNlZCBpbnRlcmFjdGlvbjogIithLCJjb21ldF9pbmZyYSIpO3JldHVybn1kLmZhY3RvcnlUaW1pbmdzLnB1c2goYyl9LGFkZEdsb2JhbE1ldGFkYXRhOmZ1bmN0aW9uKGEsYixjKXtrW2JdPWMscS5hZGRNZXRhZGF0YShhLGIsYyl9LGFkZEhlcm9Cb290bG9hZDpmdW5jdGlvbihhLGIpe2E9aS5nZXQoYSk7aWYoIWEpcmV0dXJuO2EuaGVyb0Jvb3Rsb2Fkcy5wdXNoKGIpfSxhZGRIaWRkZW5UaW1pbmc6ZnVuY3Rpb24oYSxjKXt2YXIgZD1pLmdldChhKTtpZighZCl7YigiZ2t4IikoIjE3NDU1MjYiKSYmYigicmVjb3ZlcmFibGVWaW9sYXRpb24iKSgiVHJpZWQgdG8gYWRkIEhpZGRlblRpbWluZyB0byBhbiB1bnRyYWNlZCBpbnRlcmFjdGlvbjogIithLCJjb21ldF9pbmZyYSIpO3JldHVybn1kLmhpZGRlblRpbWluZ3M9Y30sYWRkSW1hZ2VQcmVsb2FkZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWkuZ2V0KGEpO2lmKCFlKXtiKCJna3giKSgiMTc0NTUyNiIpJiZiKCJyZWNvdmVyYWJsZVZpb2xhdGlvbiIpKCJUcmllZCB0byBhZGQgaW1hZ2VQcmVsb2FkZXIgdG8gYW4gdW50cmFjZWQgaW50ZXJhY3Rpb246ICIrYSwiY29tZXRfaW5mcmEiKTtyZXR1cm59ZS5pbWFnZVByZWxvYWRlclRpbWluZ3NbY109ZH0sYWRkTWFya2VyUG9pbnQ6ZnVuY3Rpb24oYSxjLGQsZSxmKXtlPT09dm9pZCAwJiYoZT0oZ3x8KGc9YigicGVyZm9ybWFuY2VOb3ciKSkpKCkpO3ZhciBoPWkuZ2V0KGEpO2lmKCFoKXtiKCJna3giKSgiMTc0NTUyNiIpJiZiKCJyZWNvdmVyYWJsZVZpb2xhdGlvbiIpKCJUcmllZCB0byBhZGQgbWFya2VyUG9pbnQgdG8gYW4gdW50cmFjZWQgaW50ZXJhY3Rpb246ICIrYSwiY29tZXRfaW5mcmEiKTtyZXR1cm59ZT49aC5zdGFydCYmKGgubWFya2VyUG9pbnRzW2NdPXt0aW1lc3RhbXA6ZSx0eXBlOmR9LGYmJihoLm1hcmtlclBvaW50c1tjXS5kYXRhPWYpKX0sYWRkTWV0YWRhdGE6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWkuZ2V0KGEpO2lmKCFlKXtiKCJna3giKSgiMTc0NTUyNiIpJiZiKCJyZWNvdmVyYWJsZVZpb2xhdGlvbiIpKCJUcmllZCB0byBhZGQgbWV0YWRhdGEgdG8gYW4gdW50cmFjZWQgaW50ZXJhY3Rpb246ICIrYSwiY29tZXRfaW5mcmEiKTtyZXR1cm59ZS5tZXRhZGF0YVtjXT1kfSxhZGRPZmZsaW5lVGltaW5nOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9aS5nZXQoYSk7aWYoIWQpe2IoImdreCIpKCIxNzQ1NTI2IikmJmIoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlRyaWVkIHRvIGFkZCBPZmZsaW5lVGltaW5nIHRvIGFuIHVudHJhY2VkIGludGVyYWN0aW9uOiAiK2EsImNvbWV0X2luZnJhIik7cmV0dXJufWQub2ZmbGluZVRpbWluZ3M9Y30sYWRkUGF5bG9hZFJlc291cmNlOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1pLmdldChhKTtpZighZSl7YigiZ2t4IikoIjE3NDU1MjYiKSYmYigicmVjb3ZlcmFibGVWaW9sYXRpb24iKSgiVHJpZWQgdG8gYWRkIHBheWxvYWRSZXNvdXJjZSB0byBhbiB1bnRyYWNlZCBpbnRlcmFjdGlvbjogIithLCJjb21ldF9pbmZyYSIpO3JldHVybn1lLnBheWxvYWRSZXNvdXJjZXNbY109ZH0sYWRkUGF5bG9hZFRpbWluZzpmdW5jdGlvbihhLGMsZCl7dmFyIGU9aS5nZXQoYSk7aWYoIWUpe2IoImdreCIpKCIxNzQ1NTI2IikmJmIoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlRyaWVkIHRvIGFkZCBwYXlsb2FkVGltaW5nIHRvIGFuIHVudHJhY2VkIGludGVyYWN0aW9uOiAiK2EsImNvbWV0X2luZnJhIik7cmV0dXJufWUucGF5bG9hZFRpbWluZ3NbY109ZH0sYWRkUmVhY3RSZW5kZXI6ZnVuY3Rpb24oYSxjLGQsZSxmLGcsaCl7dmFyIGo9aS5nZXQoYSk7aWYoIWope2IoImdreCIpKCIxNzQ1NTI2IikmJmIoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlRyaWVkIHRvIGFkZCBSZWFjdFJlbmRlciB0byBhbiB1bnRyYWNlZCBpbnRlcmFjdGlvbjogIithLCJjb21ldF9pbmZyYSIpO3JldHVybn1hPXthY3R1YWxEdXJhdGlvbjpmLGJhc2VEdXJhdGlvbjpnLGR1cmF0aW9uOmUtZCxlbmQ6ZSxwaGFzZTpoLHN0YXJ0OmR9O2oucmVhY3RSZW5kZXJbY10/ai5yZWFjdFJlbmRlcltjXS5wdXNoKGEpOmoucmVhY3RSZW5kZXJbY109W2FdO2ouY29tbWl0U2V0LmFkZChlKX0sYWRkU3Vic3BhbjpmdW5jdGlvbihhLGMsZCxlLGYsZyl7dmFyIGg9aS5nZXQoYSk7aWYoIWgpe2IoImdreCIpKCIxNzQ1NTI2IikmJmIoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlRyaWVkIHRvIGFkZCBzdWJzcGFuIHRvIGFuIHVudHJhY2VkIGludGVyYWN0aW9uOiAiK2EsImNvbWV0X2luZnJhIik7cmV0dXJufWE9e2RhdGE6ZyxlbmQ6ZixzdGFydDplLHR5cGU6ZH07aC5zdWJTcGFuc1tjXT9oLnN1YlNwYW5zW2NdLnB1c2goYSk6aC5zdWJTcGFuc1tjXT1bYV19LGFkZFRhZzpmdW5jdGlvbihhLGMsZCl7dmFyIGU9aS5nZXQoYSk7aWYoIWUpe2IoImdreCIpKCIxNzQ1NTI2IikmJmIoInJlY292ZXJhYmxlVmlvbGF0aW9uIikoIlRyaWVkIHRvIGFkZCB0YWcgdG8gYW4gdW50cmFjZWQgaW50ZXJhY3Rpb246ICIrYSwiY29tZXRfaW5mcmEiKTtyZXR1cm59ZS50YWdTZXRbY118fChlLnRhZ1NldFtjXT1uZXcgU2V0KCkpO2UudGFnU2V0W2NdLmFkZChkKX0sYWRkVHJhY2VkSW50ZXJhY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGI9e2Jvb3Rsb2Fkczp7fSxjb21taXRTZXQ6bmV3IFNldCgpLGZhY3RvcnlUaW1pbmdzOltdLGhhc1ZjUmVwb3J0OiExLGhlcm9Cb290bG9hZHM6W10saGlkZGVuVGltaW5nczpbXSxpbWFnZVByZWxvYWRlclRpbWluZ3M6e30sbWFya2VyUG9pbnRzOnt9LG1ldGFkYXRhOnt9LG5hdmlnYXRpb25UaW1pbmc6e30sb2ZmbGluZVRpbWluZ3M6W10scGF5bG9hZFJlc291cmNlczp7fSxwYXlsb2FkVGltaW5nczp7fSxyZWFjdFJlbmRlcjp7fSxyZXF1aXJlRGVmZXJyZWRzOnt9LHN0YXJ0OmEudGltZXN0YW1wLHN1YlNwYW5zOnt9LHRhZ1NldDp7fSx0cmFjZUlkOmEubmFtZSx3YXNDYW5jZWxlZDohMSx3YXNPZmZsaW5lOiExfTtmb3IodmFyIGMgaW4gayliLm1ldGFkYXRhW2NdPWtbY107aS5zZXQoYS5uYW1lLGIpO2ouc2V0KGEubmFtZSxiKTtyZXR1cm4gYn0sY29tcGxldGU6ZnVuY3Rpb24oYSl7dmFyIGM9aS5nZXQoYSk7IWM/YigiZ2t4IikoIjE3NDU1MjYiKSYmYigicmVjb3ZlcmFibGVWaW9sYXRpb24iKSgiVW50cmFjZWQgaW50ZXJhY3Rpb24gaXMgbWFya2VkIGFzIGNvbXBsZXRlZDogIithLCJjb21ldF9pbmZyYSIpOmMuY29tcGxldGVkPT1udWxsJiYoYy5tZXRhZGF0YS5lbmRlZEJ5SGVyb0NvbXBsZXRlPTEsYy5jb21wbGV0ZWQ9KGd8fChnPWIoInBlcmZvcm1hbmNlTm93IikpKSgpLG4oImNvbXBsZXRlIixjLGMuY29tcGxldGVkKSxqWyJkZWxldGUiXShhKSl9LGN1cnJlbnRJbnRlcmFjdGlvbkxvZ2dlcjphLGR1bXA6ZnVuY3Rpb24oKXt2YXIgYT17fTtpLmZvckVhY2goZnVuY3Rpb24oYixjKXthW2NdPWJhYmVsSGVscGVyc1siZXh0ZW5kcyJdKHt9LGIse2UyZTpiLmNvbXBsZXRlZCE9bnVsbD8oKGIuY29tcGxldGVkLWIuc3RhcnQpLzFlMykudG9GaXhlZCgyKToiPyJ9KX0pO3JldHVybiBhfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGkuZ2V0KGEpfSxpbml0OmZ1bmN0aW9uKCl7cHx8KHA9ITAsYigiZ2t4IikoIjE0MDkyOTUiKXx8YigiU2NoZWR1bGVyVHJhY2luZyIpLnVuc3RhYmxlX3N1YnNjcmliZShvKSl9LGxpc3RlbjpmdW5jdGlvbihhKXtwfHxxLmluaXQoKTtsLnB1c2goYSk7cmV0dXJue2NhbmNlbDpmdW5jdGlvbigpe2IoInJlbW92ZUZyb21BcnJheSIpKGwsYSl9fX0scmVtb3ZlTWFya2VyUG9pbnQ6ZnVuY3Rpb24oYSxiKXthPWkuZ2V0KGEpO2EmJmRlbGV0ZSBhLm1hcmtlclBvaW50c1tiXX0sc2V0SW50ZXJhY3Rpb25DbGFzczpmdW5jdGlvbihhLGIpe2E9aS5nZXQoYSk7YSYmKGEuaW50ZXJhY3Rpb25DbGFzcz1iKX0sc2V0SW50ZXJhY3Rpb25UeXBlOmZ1bmN0aW9uKGEsYixjLGQpe2E9aS5nZXQoYSk7YSYmKGEuaW50ZXJhY3Rpb25DbGFzcz1iLGEudHlwZT1jLGEucXBsRXZlbnQ9ZCl9fTtjPXE7ZS5leHBvcnRzPWN9KSxudWxsKTsKX19kKCJKU1RyYWNpbmciLFsiSW50ZXJhY3Rpb25UcmFjaW5nTWV0cmljcyIsIlNjaGVkdWxlclRyYWNpbmciLCJna3giLCJwZXJmb3JtYW5jZU5vdyJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2YuY2xlYXI9YTtmLmR1bXBBY3RpdmVDb250aW51YXRpb25zPWM7Zi5nZXRDdXJyZW50X0RFUFJFQ0FURUQ9aTtmLnRyYWNlPWQ7Zi53cmFwPWU7dmFyIGcsaD17fTtmdW5jdGlvbiBhKGEpe3JldHVybiBiKCJTY2hlZHVsZXJUcmFjaW5nIikudW5zdGFibGVfY2xlYXIoYSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4oYT1oW2FdKSE9bnVsbD9hOltdfWZ1bmN0aW9uIGkoKXtyZXR1cm4gYigiU2NoZWR1bGVyVHJhY2luZyIpLnVuc3RhYmxlX2dldEN1cnJlbnQoKX1mdW5jdGlvbiBkKGEsYyxkKXtkPT09dm9pZCAwJiYoZD0oZ3x8KGc9YigicGVyZm9ybWFuY2VOb3ciKSkpKCkpO2hbYV09W107aWYoYigiZ2t4IikoIjE0MDkyOTUiKSl7YigiSW50ZXJhY3Rpb25UcmFjaW5nTWV0cmljcyIpLmFkZFRyYWNlZEludGVyYWN0aW9uKHtuYW1lOmEsdGltZXN0YW1wOmR9KTtyZXR1cm4gYygpfWVsc2UgcmV0dXJuIGIoIlNjaGVkdWxlclRyYWNpbmciKS51bnN0YWJsZV90cmFjZShhLGQsYyl9ZnVuY3Rpb24gZShhLGMpe3ZhciBkPWkoKTtkJiZkLmZvckVhY2goZnVuY3Rpb24oYSl7aFthLm5hbWVdIT1udWxsJiZoW2EubmFtZV0ucHVzaChjKX0pO3JldHVybiBiKCJTY2hlZHVsZXJUcmFjaW5nIikudW5zdGFibGVfd3JhcChmdW5jdGlvbigpe2QmJmQuZm9yRWFjaChmdW5jdGlvbihhKXtpZihoW2EubmFtZV0hPW51bGwpe3ZhciBiPWhbYS5uYW1lXS5pbmRleE9mKGMpO2hbYS5uYW1lXS5zcGxpY2UoYiwxKX19KTtyZXR1cm4gYS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX0pfX0pLG51bGwpOwpfX2QoIm1hcE9iamVjdCIsW10sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWc7ZnVuY3Rpb24gZyhhLGIsYyl7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGQ9e307T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihlKXtkW2VdPWIuY2FsbChjLGFbZV0sZSxhKX0pO3JldHVybiBkfWZ1bmN0aW9uIGEoYSxiLGMpe3JldHVybiBnKGEsYixjKX1mdW5jdGlvbiBiKGEsYixjKXtyZXR1cm4gZyhhLGIsYyl9Zy51bnR5cGVkPWE7Zy5zaGFwZT1ifSksbnVsbCk7Cl9fZCgiUmVhY3QiLFsicmVxdWlyZUNvbmQiLCJna3giLCJjcjoxMTA4ODU3IiwiY3I6MTI5NDE1OCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7ZS5leHBvcnRzPWIoImNyOjEyOTQxNTgiKX0pLG51bGwpOwovKioKICogTGljZW5zZTogaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL2xlZ2FsL2xpY2Vuc2UvVjl2ZFlDb2xjNGsvCiAqLwpfX2QoInJlYWN0LTAuMC4wIixbIlJlYWN0Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShhKXtyZXR1cm4gYSYmdHlwZW9mIGE9PT0ib2JqZWN0IiYmImRlZmF1bHQiaW4gYT9hWyJkZWZhdWx0Il06YX12YXIgZz1hKGIoIlJlYWN0IikpO2Q9e307dmFyIGg9e2V4cG9ydHM6ZH07ZnVuY3Rpb24gaSgpe2guZXhwb3J0cz1nfXZhciBqPSExO2Z1bmN0aW9uIGsoKXtqfHwoaj0hMCxpKCkpO3JldHVybiBoLmV4cG9ydHN9ZnVuY3Rpb24gYyhhKXtzd2l0Y2goYSl7Y2FzZSB2b2lkIDA6cmV0dXJuIGsoKX19ZS5leHBvcnRzPWN9KSxudWxsKTsKX19kKCJyZWFjdCIsWyJyZWFjdC0wLjAuMCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7ZS5leHBvcnRzPWIoInJlYWN0LTAuMC4wIikoKX0pLG51bGwpOwpfX2QoInV1aWQiLFtdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7ZS5leHBvcnRzPWE7ZnVuY3Rpb24gYSgpe3JldHVybiJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgiLnJlcGxhY2UoL1t4eV0vZyxmdW5jdGlvbihhKXt2YXIgYj1NYXRoLnJhbmRvbSgpKjE2fDA7YT1hPT0ieCI/YjpiJjN8ODtyZXR1cm4gYS50b1N0cmluZygxNil9KX19KSxudWxsKTsKX19kKCIkSW50ZXJuYWxFbnVtIixbXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0Ijt2YXIgZz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGg9dHlwZW9mIFdlYWtNYXA9PT0iZnVuY3Rpb24iP25ldyBXZWFrTWFwKCk6bmV3IE1hcCgpO2Z1bmN0aW9uIGkoYSl7dmFyIGI9aC5nZXQoYSk7aWYoYiE9PXZvaWQgMClyZXR1cm4gYjtiPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpO2I9bmV3IFNldChiLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0pKTtoLnNldChhLGIpO3JldHVybiBifXZhciBqPU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPYmplY3QuY3JlYXRlKG51bGwpLHtpc1ZhbGlkOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gaSh0aGlzKS5oYXMoYSl9fSxjYXN0Ont2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKGEpP2E6dm9pZCAwfX0sbWVtYmVyczp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKS52YWx1ZXMoKX19fSkpO2Z1bmN0aW9uIGEoYSl7dmFyIGI9T2JqZWN0LmNyZWF0ZShqKTtmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsYyx7dmFsdWU6YVtjXX0pO09iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyhiKTtyZXR1cm4gYn12YXIgaz1PYmplY3QucHJldmVudEV4dGVuc2lvbnMoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT2JqZWN0LmNyZWF0ZShudWxsKSx7aXNWYWxpZDp7dmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT09InN0cmluZyI/Zy5jYWxsKHRoaXMsYSk6ITF9fSxjYXN0Ont2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKGEpP2E6dm9pZCAwfX0sbWVtYmVyczp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcyl9fX0pKTthLk1pcnJvcmVkPWZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5jcmVhdGUoayk7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtjPGQ7KytjKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLGFbY10se3ZhbHVlOmFbY119KTtPYmplY3QucHJldmVudEV4dGVuc2lvbnMoYik7cmV0dXJuIGJ9O09iamVjdC5mcmVlemUoYSk7T2JqZWN0LmZyZWV6ZShhLk1pcnJvcmVkKTtlLmV4cG9ydHM9YX0pLG51bGwpOwovLyMgc291cmNlVVJMPWh0dHBzOi8vc3RhdGljLnh4LmZiY2RuLm5ldC9yc3JjLnBocC92My95MS9yL1Z6ZUcyYkc0UU9XLmpzP19uY194PWh2ZUdfZUtGVHZUCg==", + "d":1, + "nc":1, + "p":":482" + }, + "4dAMZ":{ + "type":"js", + "src":"data:application/x-javascript; charset=utf-8;base64,aWYgKHNlbGYuQ2F2YWxyeUxvZ2dlcikgeyBDYXZhbHJ5TG9nZ2VyLnN0YXJ0X2pzKFsiNGRBTVoiXSk7IH0KCl9fZCgiUmVhY3QuY2xhc3NpYyIsWyJyZXF1aXJlQ29uZCIsImNyOjEyOTIzNjUiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2UuZXhwb3J0cz1iKCJjcjoxMjkyMzY1Iil9KSxudWxsKTsKX19kKCJSZWFjdEN1cnJlbnREaXNwYXRjaGVyX0RPX05PVF9VU0VfSVRfV0lMTF9CUkVBSyIsW10sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7YT17Y3VycmVudDpudWxsfTtlLmV4cG9ydHM9YX0pLG51bGwpOwpfX2QoIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiLFsiUmVhY3RDdXJyZW50RGlzcGF0Y2hlcl9ET19OT1RfVVNFX0lUX1dJTExfQlJFQUsiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9YigiUmVhY3RDdXJyZW50RGlzcGF0Y2hlcl9ET19OT1RfVVNFX0lUX1dJTExfQlJFQUsiKX0pLG51bGwpOwpfX2QoIlJlYWN0LXByb2QuY2xhc3NpYyIsWyJvYmplY3QtYXNzaWduIiwiUmVhY3RDdXJyZW50T3duZXIiLCJSZWFjdEZlYXR1cmVGbGFncyIsIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0Ijt2YXIgZyxoLGk9NjAxMDMsaj02MDEwNjtmLkZyYWdtZW50PTYwMTA3O2YuU3RyaWN0TW9kZT02MDEwODtmLlByb2ZpbGVyPTYwMTE0O3ZhciBrPTYwMTA5LGw9NjAxMTAsbT02MDExMjtmLlN1c3BlbnNlPTYwMTEzO2YudW5zdGFibGVfU3VzcGVuc2VMaXN0PTYwMTIwO3ZhciBuPTYwMTE1LG89NjAxMTY7Zi51bnN0YWJsZV9TY29wZT02MDExOTtmLnVuc3RhYmxlX0RlYnVnVHJhY2luZ01vZGU9NjAxMjk7Zi51bnN0YWJsZV9MZWdhY3lIaWRkZW49NjAxMzE7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbFsiZm9yIl0pe3ZhciBwPVN5bWJvbFsiZm9yIl07aT1wKCJyZWFjdC5lbGVtZW50Iik7aj1wKCJyZWFjdC5wb3J0YWwiKTtmLkZyYWdtZW50PXAoInJlYWN0LmZyYWdtZW50Iik7Zi5TdHJpY3RNb2RlPXAoInJlYWN0LnN0cmljdF9tb2RlIik7Zi5Qcm9maWxlcj1wKCJyZWFjdC5wcm9maWxlciIpO2s9cCgicmVhY3QucHJvdmlkZXIiKTtsPXAoInJlYWN0LmNvbnRleHQiKTttPXAoInJlYWN0LmZvcndhcmRfcmVmIik7Zi5TdXNwZW5zZT1wKCJyZWFjdC5zdXNwZW5zZSIpO2YudW5zdGFibGVfU3VzcGVuc2VMaXN0PXAoInJlYWN0LnN1c3BlbnNlX2xpc3QiKTtuPXAoInJlYWN0Lm1lbW8iKTtvPXAoInJlYWN0LmxhenkiKTtmLnVuc3RhYmxlX1Njb3BlPXAoInJlYWN0LnNjb3BlIik7Zi51bnN0YWJsZV9EZWJ1Z1RyYWNpbmdNb2RlPXAoInJlYWN0LmRlYnVnX3RyYWNlX21vZGUiKTtmLnVuc3RhYmxlX0xlZ2FjeUhpZGRlbj1wKCJyZWFjdC5sZWdhY3lfaGlkZGVuIil9dmFyIHE9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJih0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIj9TeW1ib2wuaXRlcmF0b3I6IkBAaXRlcmF0b3IiKTtmdW5jdGlvbiByKGEpe2lmKG51bGw9PT1hfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiBudWxsO2E9cSYmYVtxXXx8YVsiQEBpdGVyYXRvciJdO3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYT9hOm51bGx9ZnVuY3Rpb24gcyhhKXtmb3IodmFyIGI9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbY10pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIithKyI7IHZpc2l0ICIrYisiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciB0PXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSx1PXt9O2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMucHJvcHM9YSx0aGlzLmNvbnRleHQ9Yix0aGlzLnJlZnM9dSx0aGlzLnVwZGF0ZXI9Y3x8dH1hLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O2EucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoIm9iamVjdCIhPT10eXBlb2YgYSYmImZ1bmN0aW9uIiE9PXR5cGVvZiBhJiZudWxsIT1hKXRocm93IEVycm9yKHMoODUpKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsYSxiLCJzZXRTdGF0ZSIpfTthLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gYygpe31jLnByb3RvdHlwZT1hLnByb3RvdHlwZTtmdW5jdGlvbiBkKGEsYixjKXt0aGlzLnByb3BzPWEsdGhpcy5jb250ZXh0PWIsdGhpcy5yZWZzPXUsdGhpcy51cGRhdGVyPWN8fHR9cD1kLnByb3RvdHlwZT1uZXcgYygpO3AuY29uc3RydWN0b3I9ZDtPYmplY3QuYXNzaWduKHAsYS5wcm90b3R5cGUpO3AuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3PXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24geChhLGMsZCl7dmFyIGUsZj17fSxoPW51bGwsaj1udWxsO2lmKG51bGwhPWMpZm9yKGUgaW4gdm9pZCAwIT09Yy5yZWYmJihqPWMucmVmKSx2b2lkIDAhPT1jLmtleSYmKGg9IiIrYy5rZXkpLGMpdi5jYWxsKGMsZSkmJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodyxlKSYmKGZbZV09Y1tlXSk7dmFyIGs9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1rKWYuY2hpbGRyZW49ZDtlbHNlIGlmKDE8ayl7Zm9yKHZhciBsPUFycmF5KGspLG09MDttPGs7bSsrKWxbbV09YXJndW1lbnRzW20rMl07Zi5jaGlsZHJlbj1sfWlmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihlIGluIGs9YS5kZWZhdWx0UHJvcHMsayl2b2lkIDA9PT1mW2VdJiYoZltlXT1rW2VdKTtyZXR1cm57JCR0eXBlb2Y6aSx0eXBlOmEsa2V5OmgscmVmOmoscHJvcHM6Zixfb3duZXI6KGd8fChnPWIoIlJlYWN0Q3VycmVudE93bmVyIikpKS5jdXJyZW50fX1mdW5jdGlvbiB5KGEsYil7cmV0dXJueyQkdHlwZW9mOmksdHlwZTphLnR5cGUsa2V5OmIscmVmOmEucmVmLHByb3BzOmEucHJvcHMsX293bmVyOmEuX293bmVyfX1mdW5jdGlvbiB6KGEpe3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09aX1mdW5jdGlvbiBBKGEpe3ZhciBiPXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2EucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSl9dmFyIEI9L1wvKy9nO2Z1bmN0aW9uIEMoYSxiKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBhJiZudWxsIT09YSYmbnVsbCE9YS5rZXk/QSgiIithLmtleSk6Yi50b1N0cmluZygzNil9ZnVuY3Rpb24gRChhLGIsYyxkLGUpe3ZhciBmPXR5cGVvZiBhOygidW5kZWZpbmVkIj09PWZ8fCJib29sZWFuIj09PWYpJiYoYT1udWxsKTt2YXIgZz0hMTtpZihudWxsPT09YSlnPSEwO2Vsc2Ugc3dpdGNoKGYpe2Nhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6Zz0hMDticmVhaztjYXNlIm9iamVjdCI6c3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgaTpjYXNlIGo6Zz0hMH19aWYoZylyZXR1cm4gZz1hLGU9ZShnKSxhPSIiPT09ZD8iLiIrQyhnLDApOmQsQXJyYXkuaXNBcnJheShlKT8oYz0iIixudWxsIT1hJiYoYz1hLnJlcGxhY2UoQiwiJCYvIikrIi8iKSxEKGUsYixjLCIiLGZ1bmN0aW9uKGEpe3JldHVybiBhfSkpOm51bGwhPWUmJih6KGUpJiYoZT15KGUsYysoIWUua2V5fHxnJiZnLmtleT09PWUua2V5PyIiOigiIitlLmtleSkucmVwbGFjZShCLCIkJi8iKSsiLyIpK2EpKSxiLnB1c2goZSkpLDE7Zz0wO2Q9IiI9PT1kPyIuIjpkKyI6IjtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgaD0wO2g8YS5sZW5ndGg7aCsrKXtmPWFbaF07dmFyIGs9ZCtDKGYsaCk7Zys9RChmLGIsYyxrLGUpfWVsc2UgaWYoaz1yKGEpLCJmdW5jdGlvbiI9PT10eXBlb2Ygaylmb3IoYT1rLmNhbGwoYSksaD0wOyEoZj1hLm5leHQoKSkuZG9uZTspZj1mLnZhbHVlLGs9ZCtDKGYsaCsrKSxnKz1EKGYsYixjLGssZSk7ZWxzZSBpZigib2JqZWN0Ij09PWYpdGhyb3cgYj0iIithLEVycm9yKHMoMzEsIltvYmplY3QgT2JqZWN0XSI9PT1iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGEpLmpvaW4oIiwgIikrIn0iOmIpKTtyZXR1cm4gZ31mdW5jdGlvbiBFKGEsYixjKXtpZihudWxsPT1hKXJldHVybiBhO3ZhciBkPVtdLGU9MDtEKGEsZCwiIiwiIixmdW5jdGlvbihhKXtyZXR1cm4gYi5jYWxsKGMsYSxlKyspfSk7cmV0dXJuIGR9ZnVuY3Rpb24gRihhKXtpZigtMT09PWEuX3N0YXR1cyl7dmFyIGI9YS5fcmVzdWx0O2I9YigpO2EuX3N0YXR1cz0wO2EuX3Jlc3VsdD1iO2IudGhlbihmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYj1iWyJkZWZhdWx0Il0sYS5fc3RhdHVzPTEsYS5fcmVzdWx0PWIpfSxmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWIpfSl9aWYoMT09PWEuX3N0YXR1cylyZXR1cm4gYS5fcmVzdWx0O3Rocm93IGEuX3Jlc3VsdH1iKCJSZWFjdEZlYXR1cmVGbGFncyIpO2Z1bmN0aW9uIEcoKXt2YXIgYT0oaHx8KGg9YigiUmVhY3RDdXJyZW50RGlzcGF0Y2hlciIpKSkuY3VycmVudDtpZihudWxsPT09YSl0aHJvdyBFcnJvcihzKDMyMSkpO3JldHVybiBhfWZ1bmN0aW9uIGUoKXtyZXR1cm4gRygpLnVzZVRyYW5zaXRpb24oKX1mdW5jdGlvbiBIKGEpe3JldHVybiBHKCkudXNlRGVmZXJyZWRWYWx1ZShhKX1mdW5jdGlvbiBJKGEsYixjKXtyZXR1cm4gRygpLnVzZU11dGFibGVTb3VyY2UoYSxiLGMpfXZhciBKPXt0cmFuc2l0aW9uOjB9O2M9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6aHx8KGg9YigiUmVhY3RDdXJyZW50RGlzcGF0Y2hlciIpKSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzpKLFJlYWN0Q3VycmVudE93bmVyOmd8fChnPWIoIlJlYWN0Q3VycmVudE93bmVyIikpLElzU29tZVJlbmRlcmVyQWN0aW5nOntjdXJyZW50OiExfSxhc3NpZ246Yigib2JqZWN0LWFzc2lnbiIpfTtmdW5jdGlvbiBLKGEsYil7cmV0dXJue19nZXRWZXJzaW9uOmIsX3NvdXJjZTphLF93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5Om51bGwsX3dvcmtJblByb2dyZXNzVmVyc2lvblNlY29uZGFyeTpudWxsfX1mdW5jdGlvbiBMKGEpe3ZhciBiPUoudHJhbnNpdGlvbjtKLnRyYW5zaXRpb249MTt0cnl7YSgpfWZpbmFsbHl7Si50cmFuc2l0aW9uPWJ9fXZhciBNPWMuUmVhY3RDdXJyZW50T3duZXIsTj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LE89e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtmdW5jdGlvbiBQKGEsYixjKXt2YXIgZD17fSxlPW51bGwsZj1udWxsO3ZvaWQgMCE9PWMmJihlPSIiK2MpO3ZvaWQgMCE9PWIua2V5JiYoZT0iIitiLmtleSk7dm9pZCAwIT09Yi5yZWYmJihmPWIucmVmKTtmb3IoYyBpbiBiKU4uY2FsbChiLGMpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKE8sYykmJihkW2NdPWJbY10pO2lmKGEmJmEuZGVmYXVsdFByb3BzKWZvcihjIGluIGI9YS5kZWZhdWx0UHJvcHMsYil2b2lkIDA9PT1kW2NdJiYoZFtjXT1iW2NdKTtyZXR1cm57JCR0eXBlb2Y6aSx0eXBlOmEsa2V5OmUscmVmOmYscHJvcHM6ZCxfb3duZXI6TS5jdXJyZW50fX1mLkNoaWxkcmVuPXttYXA6RSxmb3JFYWNoOmZ1bmN0aW9uKGEsYixjKXtFKGEsZnVuY3Rpb24oKXtiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYyl9LGNvdW50OmZ1bmN0aW9uKGEpe3ZhciBiPTA7RShhLGZ1bmN0aW9uKCl7YisrfSk7cmV0dXJuIGJ9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSxmdW5jdGlvbihhKXtyZXR1cm4gYX0pfHxbXX0sb25seTpmdW5jdGlvbihhKXtpZigheihhKSl0aHJvdyBFcnJvcihzKDE0MykpO3JldHVybiBhfX07Zi5Db21wb25lbnQ9YTtmLlB1cmVDb21wb25lbnQ9ZDtmLlN1c3BlbnNlTGlzdD1mLnVuc3RhYmxlX1N1c3BlbnNlTGlzdDtmLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPWM7Zi5jbG9uZUVsZW1lbnQ9ZnVuY3Rpb24oYSxjLGQpe2lmKG51bGw9PT1hfHx2b2lkIDA9PT1hKXRocm93IEVycm9yKHMoMjY3LGEpKTt2YXIgZT1PYmplY3QuYXNzaWduKHt9LGEucHJvcHMpLGY9YS5rZXksaD1hLnJlZixqPWEuX293bmVyO2lmKG51bGwhPWMpe3ZvaWQgMCE9PWMucmVmJiYoaD1jLnJlZixqPShnfHwoZz1iKCJSZWFjdEN1cnJlbnRPd25lciIpKSkuY3VycmVudCk7dm9pZCAwIT09Yy5rZXkmJihmPSIiK2Mua2V5KTtpZihhLnR5cGUmJmEudHlwZS5kZWZhdWx0UHJvcHMpdmFyIGs9YS50eXBlLmRlZmF1bHRQcm9wcztmb3IobCBpbiBjKXYuY2FsbChjLGwpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHcsbCkmJihlW2xdPXZvaWQgMD09PWNbbF0mJnZvaWQgMCE9PWs/a1tsXTpjW2xdKX12YXIgbD1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWwpZS5jaGlsZHJlbj1kO2Vsc2UgaWYoMTxsKXtrPUFycmF5KGwpO2Zvcih2YXIgbT0wO208bDttKyspa1ttXT1hcmd1bWVudHNbbSsyXTtlLmNoaWxkcmVuPWt9cmV0dXJueyQkdHlwZW9mOmksdHlwZTphLnR5cGUsa2V5OmYscmVmOmgscHJvcHM6ZSxfb3duZXI6an19O2YuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihhLGIpe3ZvaWQgMD09PWImJihiPW51bGwpO2E9eyQkdHlwZW9mOmwsX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOmIsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjprLF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2YuY3JlYXRlRWxlbWVudD14O2YuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj14LmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07Zi5jcmVhdGVNdXRhYmxlU291cmNlPUs7Zi5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07Zi5mb3J3YXJkUmVmPWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjptLHJlbmRlcjphfX07Zi5pc1ZhbGlkRWxlbWVudD16O2YuanN4PVA7Zi5qc3hERVY9dm9pZCAwO2YuanN4cz1QO2YubGF6eT1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6byxfcGF5bG9hZDp7X3N0YXR1czotMSxfcmVzdWx0OmF9LF9pbml0OkZ9fTtmLm1lbW89ZnVuY3Rpb24oYSxiKXtyZXR1cm57JCR0eXBlb2Y6bix0eXBlOmEsY29tcGFyZTp2b2lkIDA9PT1iP251bGw6Yn19O2Yuc3RhcnRUcmFuc2l0aW9uPUw7Zi51bnN0YWJsZV9jcmVhdGVNdXRhYmxlU291cmNlPUs7Zi51bnN0YWJsZV9zdGFydFRyYW5zaXRpb249TDtmLnVuc3RhYmxlX3VzZURlZmVycmVkVmFsdWU9SDtmLnVuc3RhYmxlX3VzZU11dGFibGVTb3VyY2U9STtmLnVuc3RhYmxlX3VzZU9wYXF1ZUlkZW50aWZpZXI9ZnVuY3Rpb24oKXtyZXR1cm4gRygpLnVzZU9wYXF1ZUlkZW50aWZpZXIoKX07Zi51bnN0YWJsZV91c2VUcmFuc2l0aW9uPWU7Zi51c2VDYWxsYmFjaz1mdW5jdGlvbihhLGIpe3JldHVybiBHKCkudXNlQ2FsbGJhY2soYSxiKX07Zi51c2VDb250ZXh0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEcoKS51c2VDb250ZXh0KGEsYil9O2YudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe307Zi51c2VEZWZlcnJlZFZhbHVlPUg7Zi51c2VFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gRygpLnVzZUVmZmVjdChhLGIpfTtmLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBHKCkudXNlSW1wZXJhdGl2ZUhhbmRsZShhLGIsYyl9O2YudXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEcoKS51c2VMYXlvdXRFZmZlY3QoYSxiKX07Zi51c2VNZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEcoKS51c2VNZW1vKGEsYil9O2YudXNlTXV0YWJsZVNvdXJjZT1JO2YudXNlUmVkdWNlcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEcoKS51c2VSZWR1Y2VyKGEsYixjKX07Zi51c2VSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIEcoKS51c2VSZWYoYSl9O2YudXNlU3RhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIEcoKS51c2VTdGF0ZShhKX07Zi51c2VUcmFuc2l0aW9uPWU7Zi52ZXJzaW9uPSIxNy4wLjEifSksbnVsbCk7Ci8vIyBzb3VyY2VVUkw9aHR0cHM6Ly9zdGF0aWMueHguZmJjZG4ubmV0L3JzcmMucGhwL3YzL3lDL3IvWmltUDVaWnkzSnUuanM/X25jX3g9aHZlR19lS0ZUdlQK", + "d":1, + "nc":1, + "p":":15711" + }, + "qaRVw":{ + "type":"js", + "src":"data:application/x-javascript; charset=utf-8;base64,aWYgKHNlbGYuQ2F2YWxyeUxvZ2dlcikgeyBDYXZhbHJ5TG9nZ2VyLnN0YXJ0X2pzKFsicWFSVnciXSk7IH0KCl9fZCgiSGlkZGVuU3VidHJlZUNvbnRleHRQcm92aWRlci5yZWFjdCIsWyJIaWRkZW5TdWJ0cmVlQ29udGV4dCIsIkhpZGRlblN1YnRyZWVQYXNzaXZlQ29udGV4dCIsIlJlYWN0IiwicmVtb3ZlRnJvbUFycmF5IiwidXNlTGF5b3V0RWZmZWN0X1NBRkVfRk9SX1NTUiJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gaChhLGIpe3JldHVybiBhLmJhY2tncm91bmRlZD09PWIuYmFja2dyb3VuZGVkJiZhLmhpZGRlbj09PWIuaGlkZGVufWZ1bmN0aW9uIGkoYSxiKXt2YXIgYz1hLmJhY2tncm91bmRlZHx8Yi5iYWNrZ3JvdW5kZWQ7YT1hLmhpZGRlbnx8Yi5oaWRkZW47cmV0dXJue2JhY2tncm91bmRlZDpjLGhpZGRlbjphLGhpZGRlbk9yQmFja2dyb3VuZGVkOmN8fGEsaGlkZGVuT3JCYWNrZ3JvdW5kZWRfRklYTUU6Y3x8YX19ZnVuY3Rpb24gYShhKXt2YXIgYz1hLmNoaWxkcmVuLGQ9YS5pZ25vcmVQYXJlbnQsZT1hLmlzQmFja2dyb3VuZGVkLGY9ZT09PXZvaWQgMD8hMTplLGo9YS5pc0hpZGRlbjtlPWcudXNlQ29udGV4dChiKCJIaWRkZW5TdWJ0cmVlQ29udGV4dCIpKTt2YXIgaz1nLnVzZUNvbnRleHQoYigiSGlkZGVuU3VidHJlZVBhc3NpdmVDb250ZXh0IikpLGw9Zy51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJue2JhY2tncm91bmRlZDpmLGhpZGRlbjpqLGhpZGRlbk9yQmFja2dyb3VuZGVkOmZ8fGosaGlkZGVuT3JCYWNrZ3JvdW5kZWRfRklYTUU6Znx8an19LFtmLGpdKSxtPWcudXNlUmVmKGwpLG49Zy51c2VSZWYobnVsbCksbz1nLnVzZVJlZihbXSkscD1nLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKCl7dmFyIGE9ZD09PSEwP20uY3VycmVudDppKG0uY3VycmVudCxrLmdldEN1cnJlbnRTdGF0ZSgpKTtpZihuLmN1cnJlbnQ9PW51bGx8fCFoKGEsbi5jdXJyZW50KSl7bi5jdXJyZW50PWE7dmFyIGI9QXJyYXkuZnJvbShvLmN1cnJlbnQpO2IuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fSxbZCxrXSk7YigidXNlTGF5b3V0RWZmZWN0X1NBRkVfRk9SX1NTUiIpKGZ1bmN0aW9uKCl7bS5jdXJyZW50PWwscCgpfSxbbCxwXSk7Zy51c2VFZmZlY3QoZnVuY3Rpb24oKXtpZihkIT09ITApe3ZhciBhPWsuc3Vic2NyaWJlVG9DaGFuZ2VzKHApO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLnJlbW92ZSgpfX19LFtkLHAsa10pO2E9Zy51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJue2dldEN1cnJlbnRTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBkPT09ITA/bS5jdXJyZW50OmkobS5jdXJyZW50LGsuZ2V0Q3VycmVudFN0YXRlKCkpfSxzdWJzY3JpYmVUb0NoYW5nZXM6ZnVuY3Rpb24oYSl7dmFyIGM9by5jdXJyZW50O2MucHVzaChhKTtyZXR1cm57cmVtb3ZlOmZ1bmN0aW9uKCl7YigicmVtb3ZlRnJvbUFycmF5IikoYyxhKX19fX19LFtrLGRdKTt2YXIgcT1kPT09ITA/bDppKGwsZSk7ZT1nLnVzZU1lbW8oZnVuY3Rpb24oKXtyZXR1cm57YmFja2dyb3VuZGVkOnEuYmFja2dyb3VuZGVkLGhpZGRlbjpxLmhpZGRlbixoaWRkZW5PckJhY2tncm91bmRlZDpxLmJhY2tncm91bmRlZHx8cS5oaWRkZW4saGlkZGVuT3JCYWNrZ3JvdW5kZWRfRklYTUU6cS5iYWNrZ3JvdW5kZWR8fHEuaGlkZGVufX0sW3EuYmFja2dyb3VuZGVkLHEuaGlkZGVuXSk7cmV0dXJuIGcuanN4KGIoIkhpZGRlblN1YnRyZWVDb250ZXh0IikuUHJvdmlkZXIse3ZhbHVlOmUsY2hpbGRyZW46Zy5qc3goYigiSGlkZGVuU3VidHJlZVBhc3NpdmVDb250ZXh0IikuUHJvdmlkZXIse3ZhbHVlOmEsY2hpbGRyZW46Y30pfSl9fSksbnVsbCk7Cl9fZCgiQ29tZXREYXJrTW9kZUNvbnRleHQiLFsiUmVhY3QiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPWIoIlJlYWN0Iik7Yz1hLmNyZWF0ZUNvbnRleHQoe2lzRGFya01vZGVFbmFibGVkOiExLG9uRGFya01vZGVUb2dnbGU6ZnVuY3Rpb24oKXt9LHNldERhcmtNb2RlUHJlZmVyZW5jZTpmdW5jdGlvbigpe319KTtlLmV4cG9ydHM9Y30pLG51bGwpOwpfX2QoImdldENvbWV0QmFkZ2VDb2xvclN0eWxlIixbInN0eWxleCIsInVucmVjb3ZlcmFibGVWaW9sYXRpb24iXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9YTt2YXIgZz17Ymx1ZTp7YmFja2dyb3VuZENvbG9yOiJpczY3MDBvbSJ9LGRhcmtHcmF5OntiYWNrZ3JvdW5kQ29sb3I6Im12azI1OXV2In0sZ3JheTp7YmFja2dyb3VuZENvbG9yOiJwMm84bXM5biJ9LGdyZWVuOntiYWNrZ3JvdW5kQ29sb3I6ImpsbG00ZjRoIn0scmVkOntiYWNrZ3JvdW5kQ29sb3I6ImdreTgwNjN5In19O2Z1bmN0aW9uIGEoYSl7c3dpdGNoKGEpe2Nhc2UiYmx1ZSI6cmV0dXJuIGcuYmx1ZTtjYXNlImdyYXkiOnJldHVybiBnLmdyYXk7Y2FzZSJkYXJrR3JheSI6cmV0dXJuIGcuZGFya0dyYXk7Y2FzZSJncmVlbiI6cmV0dXJuIGcuZ3JlZW47Y2FzZSJyZWQiOnJldHVybiBnLnJlZDtkZWZhdWx0OmE7dGhyb3cgYigidW5yZWNvdmVyYWJsZVZpb2xhdGlvbiIpKCIgSW52YWxpZCBjb2xvciBpbiBnZXRDb21ldEJhZGdlQ29sb3JTdHlsZSIsImNvbWV0X3VpIil9fX0pLG51bGwpOwpfX2QoIkNvbWV0QmFkZ2UucmVhY3QiLFsiQ29tZXRWaXN1YWxDb21wbGV0aW9uQXR0cmlidXRlcyIsIlJlYWN0IiwiZ2V0Q29tZXRCYWRnZUNvbG9yU3R5bGUiLCJzdHlsZXgiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9YTt2YXIgZyxoPWIoIlJlYWN0IiksaT17aXNOb25lUHJvZmlsZUJhZGdlOnttYXJnaW5FbmQ6Im9pOTI0NGU4In0sbm9Cb3JkZXI6e2JvcmRlclRvcDoicXUweDA1MWYiLGJvcmRlckVuZDoiZXNyNW1oNnciLGJvcmRlckJvdHRvbToiZTk5ODl1ZTQiLGJvcmRlclN0YXJ0OiJyN2Q2a2djeiJ9LG5vcm1hbEJvcmRlclJhZGl1czp7Ym9yZGVyVG9wU3RhcnRSYWRpdXM6InM0NWtmbDc5Iixib3JkZXJUb3BFbmRSYWRpdXM6ImVtbHhsYXlhIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImJrbWhwNzV3Iixib3JkZXJCb3R0b21TdGFydFJhZGl1czoic3BiN3hidHYifSxyb290OntkaXNwbGF5OiJwcTZkcTQ2ZCJ9fSxqPShjPXt9LGNbNl09e2JvcmRlclRvcDoia3dlbWVvY2QiLGJvcmRlckVuZDoiZTBycnZ1Z2IiLGJvcmRlckJvdHRvbToibGZtaG9tZmEiLGJvcmRlclN0YXJ0OiJhZHF2MmU4ZiIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6Im12bjcwcmgyIixib3JkZXJUb3BFbmRSYWRpdXM6InI2cmtyeWYyIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImN2aTlwbDBnIixib3JkZXJCb3R0b21TdGFydFJhZGl1czoia3NpYnc2NmQiLGhlaWdodDoiYW0zOHI1amYiLHdpZHRoOiJteDlvczEwZSJ9LGNbN109e2JvcmRlclRvcDoiaXd1d3EybHUiLGJvcmRlckVuZDoiZzVvZWZxNzciLGJvcmRlckJvdHRvbToib284b3YxY2kiLGJvcmRlclN0YXJ0OiJjZTF4Y2FydCIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImppZTdlZjM0Iixib3JkZXJUb3BFbmRSYWRpdXM6InQ4djNtaWJvIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImxkcnlkeGd0Iixib3JkZXJCb3R0b21TdGFydFJhZGl1czoiaHJ6aGQyY3IiLGhlaWdodDoib29hc3lscWEiLHdpZHRoOiJjMHdrdDRrcCJ9LGNbOF09e2JvcmRlclRvcDoiaXd1d3EybHUiLGJvcmRlckVuZDoiZzVvZWZxNzciLGJvcmRlckJvdHRvbToib284b3YxY2kiLGJvcmRlclN0YXJ0OiJjZTF4Y2FydCIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImprNnNia2FqIixib3JkZXJUb3BFbmRSYWRpdXM6ImtkZ3Fxb3k2Iixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImloaDRoeTFnIixib3JkZXJCb3R0b21TdGFydFJhZGl1czoicXR0YzYxZmMiLGhlaWdodDoidDZuYTZwOXQiLHdpZHRoOiJjOXJybG10MSJ9LGNbOV09e2JvcmRlclRvcDoiaXd1d3EybHUiLGJvcmRlckVuZDoiZzVvZWZxNzciLGJvcmRlckJvdHRvbToib284b3YxY2kiLGJvcmRlclN0YXJ0OiJjZTF4Y2FydCIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImtuOGJqMHprIixib3JkZXJUb3BFbmRSYWRpdXM6Imx3M3B1djFvIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImYxMG5zejdvIixib3JkZXJCb3R0b21TdGFydFJhZGl1czoicXhubWE1em4iLGhlaWdodDoiZno2cTZoZGQiLHdpZHRoOiJzeDkwb3Z4NSJ9LGNbMTBdPXtib3JkZXJUb3A6Iml3dXdxMmx1Iixib3JkZXJFbmQ6Imc1b2VmcTc3Iixib3JkZXJCb3R0b206Im9vOG92MWNpIixib3JkZXJTdGFydDoiY2UxeGNhcnQiLGJvcmRlclRvcFN0YXJ0UmFkaXVzOiJkd2VyaGJhMyIsYm9yZGVyVG9wRW5kUmFkaXVzOiJrZ2plb29lMSIsYm9yZGVyQm90dG9tRW5kUmFkaXVzOiJreGNiNjhrYiIsYm9yZGVyQm90dG9tU3RhcnRSYWRpdXM6Im13dnpmcmRiIixoZWlnaHQ6ImJzb2RkM3piIix3aWR0aDoieHRoa3BwMHoifSxjWzEyXT17Ym9yZGVyVG9wOiJpd3V3cTJsdSIsYm9yZGVyRW5kOiJnNW9lZnE3NyIsYm9yZGVyQm90dG9tOiJvbzhvdjFjaSIsYm9yZGVyU3RhcnQ6ImNlMXhjYXJ0Iixib3JkZXJUb3BTdGFydFJhZGl1czoiYmVsdGNqNDciLGJvcmRlclRvcEVuZFJhZGl1czoicDg2ZDJpOWciLGJvcmRlckJvdHRvbUVuZFJhZGl1czoiYW90MTRjaDEiLGJvcmRlckJvdHRvbVN0YXJ0UmFkaXVzOiJrengyb2xzcyIsaGVpZ2h0OiJjeXlwYnR0NyIsd2lkdGg6ImZ3aXpxamZhIn0sY1sxNF09e2JvcmRlclRvcDoiaXd1d3EybHUiLGJvcmRlckVuZDoiZzVvZWZxNzciLGJvcmRlckJvdHRvbToib284b3YxY2kiLGJvcmRlclN0YXJ0OiJjZTF4Y2FydCIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImgxY2kybXFsIixib3JkZXJUb3BFbmRSYWRpdXM6Im1qZmU2anRyIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImM2dzZ1N2IxIixib3JkZXJCb3R0b21TdGFydFJhZGl1czoiaGMyMXkzcHoiLGhlaWdodDoiaTRxZ3BobjYiLHdpZHRoOiJnYWI3c3RteCJ9LGNbMTVdPXtib3JkZXJUb3A6Iml3dXdxMmx1Iixib3JkZXJFbmQ6Imc1b2VmcTc3Iixib3JkZXJCb3R0b206Im9vOG92MWNpIixib3JkZXJTdGFydDoiY2UxeGNhcnQiLGJvcmRlclRvcFN0YXJ0UmFkaXVzOiJhNmg3Y2FzbyIsYm9yZGVyVG9wRW5kUmFkaXVzOiJqejZqNXJ0MSIsYm9yZGVyQm90dG9tRW5kUmFkaXVzOiJtZzIzMGRlciIsYm9yZGVyQm90dG9tU3RhcnRSYWRpdXM6InQ3Y2ZrMTVkIixoZWlnaHQ6ImVkM3AxZ2ZpIix3aWR0aDoiZmh2ZnlzdzMifSxjWzE4XT17Ym9yZGVyVG9wOiJpd3V3cTJsdSIsYm9yZGVyRW5kOiJnNW9lZnE3NyIsYm9yZGVyQm90dG9tOiJvbzhvdjFjaSIsYm9yZGVyU3RhcnQ6ImNlMXhjYXJ0Iixib3JkZXJUb3BTdGFydFJhZGl1czoidDBxanlxcTQiLGJvcmRlclRvcEVuZFJhZGl1czoiam9zNzViN2kiLGJvcmRlckJvdHRvbUVuZFJhZGl1czoiajZzdHk5MGgiLGJvcmRlckJvdHRvbVN0YXJ0UmFkaXVzOiJrdjB0b2kxdCIsaGVpZ2h0OiJobTI3MXF3cyIsd2lkdGg6Im92OWZhY25zIn0sY1syMF09e2JvcmRlclRvcDoicTd6Mjk5MnkiLGJvcmRlckVuZDoiZGx1cm9uZzIiLGJvcmRlckJvdHRvbToidDlhdWlrMHoiLGJvcmRlclN0YXJ0OiJkcnIycXI0YSIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImZuaThhZGppIixib3JkZXJUb3BFbmRSYWRpdXM6ImhnYWlwcHdpIixib3JkZXJCb3R0b21FbmRSYWRpdXM6ImZ5a2J0NWx5Iixib3JkZXJCb3R0b21TdGFydFJhZGl1czoibnM0eWd3ZW0iLGhlaWdodDoiam5pZ3BnNzgiLHdpZHRoOiJvZHc4dWlxMyJ9LGNbMjJdPXtib3JkZXJUb3A6InE3ejI5OTJ5Iixib3JkZXJFbmQ6ImRsdXJvbmcyIixib3JkZXJCb3R0b206InQ5YXVpazB6Iixib3JkZXJTdGFydDoiZHJyMnFyNGEiLGJvcmRlclRvcFN0YXJ0UmFkaXVzOiJxdzZjMHIxNiIsYm9yZGVyVG9wRW5kUmFkaXVzOiJrYjh4NHJrciIsYm9yZGVyQm90dG9tRW5kUmFkaXVzOiJlZDU5N3BrYiIsYm9yZGVyQm90dG9tU3RhcnRSYWRpdXM6Im9tY3lvejU5IixoZWlnaHQ6InAxdWVpYTFlIix3aWR0aDoicGdjdGpmczUifSxjWzI0XT17Ym9yZGVyVG9wOiJxN3oyOTkyeSIsYm9yZGVyRW5kOiJkbHVyb25nMiIsYm9yZGVyQm90dG9tOiJ0OWF1aWsweiIsYm9yZGVyU3RhcnQ6ImRycjJxcjRhIixib3JkZXJUb3BTdGFydFJhZGl1czoibGl0N3BneHAiLGJvcmRlclRvcEVuZFJhZGl1czoibzNjNjNoY2UiLGJvcmRlckJvdHRvbUVuZFJhZGl1czoiaHFsemNvMTkiLGJvcmRlckJvdHRvbVN0YXJ0UmFkaXVzOiJsc2wyMjQ1biIsaGVpZ2h0OiJyZ21nOXV0eSIsd2lkdGg6ImI3M25ncWJwIn0sY1szMl09e2JvcmRlclRvcDoicTd6Mjk5MnkiLGJvcmRlckVuZDoiZGx1cm9uZzIiLGJvcmRlckJvdHRvbToidDlhdWlrMHoiLGJvcmRlclN0YXJ0OiJkcnIycXI0YSIsYm9yZGVyVG9wU3RhcnRSYWRpdXM6ImVtbWwxNmRlIixib3JkZXJUb3BFbmRSYWRpdXM6ImdtY3N6aHVsIixib3JkZXJCb3R0b21FbmRSYWRpdXM6Im9sczVlZGhpIixib3JkZXJCb3R0b21TdGFydFJhZGl1czoiZ29iODE5Y3QiLGhlaWdodDoiazdjejM1dzIiLHdpZHRoOiJic25idm1wNCJ9LGNbNDFdPXtib3JkZXJUb3A6InE3ejI5OTJ5Iixib3JkZXJFbmQ6ImRsdXJvbmcyIixib3JkZXJCb3R0b206InQ5YXVpazB6Iixib3JkZXJTdGFydDoiZHJyMnFyNGEiLGJvcmRlclRvcFN0YXJ0UmFkaXVzOiJkYWszZ2p0MCIsYm9yZGVyVG9wRW5kUmFkaXVzOiJ0bzlnbHU3NSIsYm9yZGVyQm90dG9tRW5kUmFkaXVzOiJtY2sxcDJjdCIsYm9yZGVyQm90dG9tU3RhcnRSYWRpdXM6ImUxcWVzNDRyIixoZWlnaHQ6ImM5eW9tY2hiIix3aWR0aDoiY2hzeWdnNWkifSxjKSxrPShkPXt9LGRbNl09e21hcmdpblN0YXJ0OiJoeXRibnQ4MSIsd2lkdGg6InN4OTBvdng1In0sZFs3XT17bWFyZ2luU3RhcnQ6InByc3UzcXFqIix3aWR0aDoiYnZhMGU2dmoifSxkWzhdPXttYXJnaW5TdGFydDoia2tmNDl0bnMiLHdpZHRoOiJmd2l6cWpmYSJ9LGRbOV09e21hcmdpblN0YXJ0OiJnejY5a2tibiIsd2lkdGg6InJqMm1sbDB2In0sZFsxMF09e21hcmdpblN0YXJ0OiJobnh6d2V2cyIsd2lkdGg6ImZodmZ5c3czIn0sZFsxMl09e21hcmdpblN0YXJ0OiJnZ3BoYnR5NCIsd2lkdGg6Im92OWZhY25zIn0sZFsxNF09e21hcmdpblN0YXJ0OiJndGFkNHhrbiIsd2lkdGg6InJnZWhkeTNpIn0sZFsxNV09e21hcmdpblN0YXJ0OiJzajE0b2o5eCIsd2lkdGg6ImNkNW82bTc4In0sZFsxOF09e21hcmdpblN0YXJ0OiJkb3d1czI2ZyIsd2lkdGg6ImRseTg0NXN0In0sZFsyMF09e21hcmdpblN0YXJ0OiJndTAwYzQzZCIsd2lkdGg6ImxhMHRpdnZlIn0sZFsyMl09e21hcmdpblN0YXJ0OiJubzY0NjRqYyIsd2lkdGg6InFsdnAxZjluIn0sZFsyNF09e21hcmdpblN0YXJ0OiJvenVmdGw5bSIsd2lkdGg6InRod280em1lIn0sZFszMl09e21hcmdpblN0YXJ0OiJkaGl4Njl0bSIsd2lkdGg6InRtcnNoaDl5In0sZFs0MV09e21hcmdpblN0YXJ0OiJxY3ZnY21ubiIsd2lkdGg6ImxzczZ1eTV1In0sZCksbD0oZj17fSxmWzZdPXttYXJnaW5TdGFydDoiZ2dwaGJ0eTQiLHdpZHRoOiJmd2l6cWpmYSJ9LGZbN109e21hcmdpblN0YXJ0OiJndGFkNHhrbiIsd2lkdGg6ImdhYjdzdG14In0sZls4XT17bWFyZ2luU3RhcnQ6Img2NzZubWR3Iix3aWR0aDoiaGh6NWxnZHUifSxmWzldPXttYXJnaW5TdGFydDoiZG93dXMyNmciLHdpZHRoOiJvdjlmYWNucyJ9LGZbMTBdPXttYXJnaW5TdGFydDoiZ3UwMGM0M2QiLHdpZHRoOiJvZHc4dWlxMyJ9LGZbMTJdPXttYXJnaW5TdGFydDoib3p1ZnRsOW0iLHdpZHRoOiJiNzNuZ3FicCJ9LGZbMTRdPXttYXJnaW5TdGFydDoibXd3OTh5bnYiLHdpZHRoOiJjaWFkeDFnbiJ9LGZbMTVdPXttYXJnaW5TdGFydDoiYW9lcDE3MnMiLHdpZHRoOiJsYTB0aXZ2ZSJ9LGZbMThdPXttYXJnaW5TdGFydDoiYXVkcms1ZWMiLHdpZHRoOiJ0aHdvNHptZSJ9LGZbMjBdPXttYXJnaW5TdGFydDoiaTB1MWJ4OTQiLHdpZHRoOiJxNjc2ajZvcCJ9LGZbMjJdPXttYXJnaW5TdGFydDoibWd5ZWwyeDUiLHdpZHRoOiJlaW0zMzdnayJ9LGZbMjRdPXttYXJnaW5TdGFydDoiZnJsdWN6eGMiLHdpZHRoOiJ0bXJzaGg5eSJ9LGZbMzJdPXttYXJnaW5TdGFydDoidDd5dXZic2EiLHdpZHRoOiJueGZtcjJ3aSJ9LGZbNDFdPXttYXJnaW5TdGFydDoic2x4cnF4NXUiLHdpZHRoOiJ0N3N6NjdkdCJ9LGYpO2Z1bmN0aW9uIGEoYSl7dmFyIGM9YS5ib3JkZXI7Yz1jPT09dm9pZCAwPyJub25lIjpjO3ZhciBkPWEuY2hpbGRyZW4sZT1hLmNvbG9yO2U9ZT09PXZvaWQgMD8iYmx1ZSI6ZTt2YXIgZj1hLmlzUHJvZmlsZUJhZGdlO2Y9Zj09PXZvaWQgMD8hMTpmO3ZhciBtPWEubGFiZWwsbj1hLnJvbGUsbz1hLnNpemU7bz1vPT09dm9pZCAwPzg6bzt2YXIgcD1hLndpZGU7cD1wPT09dm9pZCAwPyJub3JtYWwiOnA7cmV0dXJuIGguanN4KCJzcGFuIixiYWJlbEhlbHBlcnNbImV4dGVuZHMiXSh7ImFyaWEtbGFiZWwiOm0sY2xhc3NOYW1lOihnfHwoZz1iKCJzdHlsZXgiKSkpKGkucm9vdCwhZiYmaS5pc05vbmVQcm9maWxlQmFkZ2UsKG09YS5jb2xvck92ZXJyaWRlKSE9bnVsbD9tOmIoImdldENvbWV0QmFkZ2VDb2xvclN0eWxlIikoZSksaltvXSxwPT09IndpZGUiJiZrW29dLHA9PT0iZXh0cmFXaWRlIiYmbFtvXSxwPT09Im5vcm1hbCImJmkubm9ybWFsQm9yZGVyUmFkaXVzLGM9PT0ibm9uZSImJmkubm9Cb3JkZXIpfSxiKCJDb21ldFZpc3VhbENvbXBsZXRpb25BdHRyaWJ1dGVzIikuSUdOT1JFLHtyb2xlOm4sY2hpbGRyZW46ZH0pKX19KSxudWxsKTsKX19kKCJCYXNlSW1hZ2UucmVhY3QiLFsiUmVhY3QiLCJSZWNvdmVyYWJsZVZpb2xhdGlvbldpdGhDb21wb25lbnRTdGFjay5yZWFjdCIsIm1lcmdlUmVmcyIsInN0eWxleCIsInRlc3RJRCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO3ZhciBnLGg9YigiUmVhY3QiKSxpPXtjb250YWluOntvYmplY3RGaXQ6InIwMjk0aXB6In0sY292ZXI6e29iamVjdEZpdDoiYml4cnd0YjYifSxmaWxsOntvYmplY3RGaXQ6InI1MGR3OXVwIn19O2Z1bmN0aW9uIGEoYSxjKXt2YXIgZD1hLmFsdDtkPWQ9PT12b2lkIDA/IiI6ZDt2YXIgZT1hWyJhcmlhLWxhYmVsbGVkYnkiXSxmPWEub2JqZWN0Rml0O2Y9Zj09PXZvaWQgMD8ibm9uZSI6Zjt2YXIgaj1hLm9uTG9hZCxrPWEuc3JjLGw9YS50ZXN0aWQsbT1hLnhzdHlsZTthPWJhYmVsSGVscGVycy5vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKGEsWyJhbHQiLCJhcmlhLWxhYmVsbGVkYnkiLCJvYmplY3RGaXQiLCJvbkxvYWQiLCJzcmMiLCJ0ZXN0aWQiLCJ4c3R5bGUiXSk7dmFyIG49aC51c2VSZWYobnVsbCksbz1oLnVzZU1lbW8oZnVuY3Rpb24oKXtyZXR1cm4gYigibWVyZ2VSZWZzIikobixjKX0sW24sY10pO2gudXNlRWZmZWN0KGZ1bmN0aW9uKCl7dmFyIGE9bi5jdXJyZW50O2ohPW51bGwmJmEhPW51bGwmJmEuY29tcGxldGUmJmooKX0sW2pdKTtpZihrPT09IiIpcmV0dXJuIGguanN4KGIoIlJlY292ZXJhYmxlVmlvbGF0aW9uV2l0aENvbXBvbmVudFN0YWNrLnJlYWN0Iikse2Vycm9yTWVzc2FnZToiSW52YWxpZCBzcmMgcHJvdmlkZWQgdG8gaW1hZ2UiLHByb2plY3ROYW1lOiJjb21ldF91aSJ9KTt2YXIgcCxxPWsubWF0Y2goL1s/Jl1jYj0oW14mXSspLiokLyk7cSYmcS5sZW5ndGg+MSYmKHA9cVsxXSk7cmV0dXJuIGguanN4KCJpbWciLGJhYmVsSGVscGVyc1siZXh0ZW5kcyJdKHt9LGEsYigidGVzdElEIikobCkse2FsdDpkLCJhcmlhLWxhYmVsbGVkYnkiOmUsY2xhc3NOYW1lOmY9PT0ibm9uZSImJm09PW51bGw/dm9pZCAwOihnfHwoZz1iKCJzdHlsZXgiKSkpKGYhPT0ibm9uZSImJmlbZl0sbSksZWxlbWVudHRpbWluZzpwLG9uTG9hZDpqLHJlZjpvLHNyYzprfSkpfWM9aC5mb3J3YXJkUmVmKGEpO2UuZXhwb3J0cz1jfSksbnVsbCk7Cl9fZCgidXNlRmVlZEltYWdlRXJyb3JFdmVudExvZ2dlckNicyIsWyJCYW56YWkiLCJDb21ldEludGVyYWN0aW9uU291cmNlQ29udGV4dCIsIlJhbmRvbSIsIlJlYWN0Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWE7dmFyIGc9YigiUmVhY3QiKSxoPTFlMyxpPWZ1bmN0aW9uKGEpe3ZhciBjPWEucmVzdWx0LGQ9YS5zcmM7YT1hLnN1cmZhY2U7YigiUmFuZG9tIikuY29pbmZsaXAoaCkmJmIoIkJhbnphaSIpLnBvc3QoImxvZ2dlcjpXV1dJbWFnZUxvYWRTcmNFdmVudExvZ2dlckNvbmZpZyIse3N1cmZhY2U6YSxzcmM6ZCxyZXN1bHQ6Y30pfTtmdW5jdGlvbiBhKGEpe3ZhciBjPWEub25FcnJvcixkPWEub25Mb2FkLGU9YS5zcmMsZj1nLnVzZVJlZihudWxsKTthPWcudXNlQ29udGV4dChiKCJDb21ldEludGVyYWN0aW9uU291cmNlQ29udGV4dCIpKTt2YXIgaD1hPT09Mz8icHJvZmlsZSI6YT09PTA/ImZlZWQiOm51bGw7YT1nLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEpe2QhPW51bGwmJmQoYSk7aWYoZi5jdXJyZW50PT09ZSlyZXR1cm47dHlwZW9mIGU9PT0ic3RyaW5nIiYmKGkoe3Jlc3VsdDoic3VjY2VzcyIsc3JjOmUsc3VyZmFjZTpofSksZi5jdXJyZW50PWUpfSxbZCxlLGhdKTt2YXIgaj1nLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEpe2MhPW51bGwmJmMoYSk7aWYoZi5jdXJyZW50PT09ZSlyZXR1cm47dHlwZW9mIGU9PT0ic3RyaW5nIiYmKGkoe3Jlc3VsdDoiZXJyb3IiLHNyYzplLHN1cmZhY2U6aH0pLGYuY3VycmVudD1lKX0sW2MsZSxoXSk7cmV0dXJuIGg9PW51bGx8fHR5cGVvZiBlIT09InN0cmluZyI/e19vbkVycm9yOmMsX29uTG9hZDpkfTp7X29uRXJyb3I6aixfb25Mb2FkOmF9fX0pLG51bGwpOwpfX2QoInVzZUNvbWV0VmlzdWFsQ2hhbmdlVHJhY2tlciIsWyJSZWFjdCIsImdreCIsInJlcXVpcmVDb25kIiwiY3I6MTc5MTAxOCIsImNyOjY4MzA1OSJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYSgpe3ZhciBhPWcudXNlUmVmKG51bGwpLGM9Zy51c2VSZWYobnVsbCk7Zy51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtjLmN1cnJlbnQmJmMuY3VycmVudCgpLGMuY3VycmVudD1udWxsLGEuY3VycmVudD1udWxsfX0sW10pO3JldHVybiBnLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGQpe2lmKGEuY3VycmVudCE9PWQpe2MuY3VycmVudCYmKGMuY3VycmVudCgpLGMuY3VycmVudD1udWxsKTthLmN1cnJlbnQ9ZDtkJiZiKCJjcjoxNzkxMDE4IikmJiFiKCJna3giKSgiMTQwOTI5NSIpJiZiKCJjcjoxNzkxMDE4IikuYWRkTXV0YXRpb25Sb290Rm9yVHJhY2VUeXBlKGQsIklOVEVSQUNUSU9OIik7aWYoZCYmYigiY3I6NjgzMDU5Iikpe3ZhciBlPWIoImNyOjY4MzA1OSIpLmdldEN1cnJlbnROYXZpZ2F0aW9uVHJhY2UoKTtlJiYoYy5jdXJyZW50PWUuYWRkTXV0YXRpb25Sb290KGQpKX19fSxbXSl9fSksbnVsbCk7Cl9fZCgiRXZlbnRMaXN0ZW5lciIsWyJyZXF1aXJlQ29uZCIsImNyOjEzNTMzNTkiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPWIoImNyOjEzNTMzNTkiKTtlLmV4cG9ydHM9YX0pLG51bGwpOwpfX2QoIkxvZ0hpc3RvcnkiLFtdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7Zi5nZXRJbnN0YW5jZT1hO2YuZ2V0RW50cmllcz1iO2YuY2xlYXJFbnRyaWVzPWM7Zi5mb3JtYXRFbnRyaWVzPWQ7dmFyIGc9NTAwLGg9e30saT1bXTtmdW5jdGlvbiBqKGEsYixjLGQpe3ZhciBlPWRbMF07aWYodHlwZW9mIGUhPT0ic3RyaW5nInx8ZC5sZW5ndGghPT0xKXJldHVybjtpLnB1c2goe2RhdGU6RGF0ZS5ub3coKSxsZXZlbDphLGNhdGVnb3J5OmIsZXZlbnQ6YyxhcmdzOmV9KTtpLmxlbmd0aD5nJiZpLnNoaWZ0KCl9dmFyIGs9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3RoaXMuY2F0ZWdvcnk9YX12YXIgYj1hLnByb3RvdHlwZTtiLmRlYnVnPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMubGVuZ3RoLGM9bmV3IEFycmF5KGI+MT9iLTE6MCksZD0xO2Q8YjtkKyspY1tkLTFdPWFyZ3VtZW50c1tkXTtqKCJkZWJ1ZyIsdGhpcy5jYXRlZ29yeSxhLGMpO3JldHVybiB0aGlzfTtiLmxvZz1mdW5jdGlvbihhKXtmb3IodmFyIGI9YXJndW1lbnRzLmxlbmd0aCxjPW5ldyBBcnJheShiPjE/Yi0xOjApLGQ9MTtkPGI7ZCsrKWNbZC0xXT1hcmd1bWVudHNbZF07aigibG9nIix0aGlzLmNhdGVnb3J5LGEsYyk7cmV0dXJuIHRoaXN9O2Iud2Fybj1mdW5jdGlvbihhKXtmb3IodmFyIGI9YXJndW1lbnRzLmxlbmd0aCxjPW5ldyBBcnJheShiPjE/Yi0xOjApLGQ9MTtkPGI7ZCsrKWNbZC0xXT1hcmd1bWVudHNbZF07aigid2FybiIsdGhpcy5jYXRlZ29yeSxhLGMpO3JldHVybiB0aGlzfTtiLmVycm9yPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hcmd1bWVudHMubGVuZ3RoLGM9bmV3IEFycmF5KGI+MT9iLTE6MCksZD0xO2Q8YjtkKyspY1tkLTFdPWFyZ3VtZW50c1tkXTtqKCJlcnJvciIsdGhpcy5jYXRlZ29yeSxhLGMpO3JldHVybiB0aGlzfTtyZXR1cm4gYX0oKTtmdW5jdGlvbiBhKGEpe2hbYV18fChoW2FdPW5ldyBrKGEpKTtyZXR1cm4gaFthXX1mdW5jdGlvbiBiKCl7cmV0dXJuIGl9ZnVuY3Rpb24gYygpe2kubGVuZ3RoPTB9ZnVuY3Rpb24gZChhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI9L1xkXGQ6XGRcZDpcZFxkLy5leGVjKG5ldyBEYXRlKGEuZGF0ZSkudG9TdHJpbmcoKSk7cmV0dXJuW2ImJmJbMF0sYS5sZXZlbCxhLmNhdGVnb3J5LGEuZXZlbnQsYS5hcmdzXS5qb2luKCIgfCAiKX0pLmpvaW4oIlxuIil9fSksbnVsbCk7Cl9fZCgib2JqZWN0LWFzc2lnbiIsW10sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtlLmV4cG9ydHM9T2JqZWN0LmFzc2lnbn0pLG51bGwpOwpfX2QoIlJlYWN0Q3VycmVudE93bmVyIixbXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPXtjdXJyZW50Om51bGx9O2UuZXhwb3J0cz1hfSksbnVsbCk7Cl9fZCgicmVnZW5lcmF0b3JSdW50aW1lIixbIlByb21pc2UiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0Ijt2YXIgZz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGg9dHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJih0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIj9TeW1ib2wuaXRlcmF0b3I6IkBAaXRlcmF0b3IiKXx8IkBAaXRlcmF0b3IiLGk9ZS5leHBvcnRzO2Z1bmN0aW9uIGooYSxiLGMsZCl7Yj1PYmplY3QuY3JlYXRlKChifHxxKS5wcm90b3R5cGUpO2Q9bmV3IHooZHx8W10pO2IuX2ludm9rZT13KGEsYyxkKTtyZXR1cm4gYn1pLndyYXA9ajtmdW5jdGlvbiBrKGEsYixjKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOmEuY2FsbChiLGMpfX1jYXRjaChhKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzphfX19dmFyIGw9InN1c3BlbmRlZFN0YXJ0IixtPSJzdXNwZW5kZWRZaWVsZCIsbj0iZXhlY3V0aW5nIixvPSJjb21wbGV0ZWQiLHA9e307ZnVuY3Rpb24gcSgpe31mdW5jdGlvbiByKCl7fWZ1bmN0aW9uIHMoKXt9dmFyIHQ9cy5wcm90b3R5cGU9cS5wcm90b3R5cGU7ci5wcm90b3R5cGU9dC5jb25zdHJ1Y3Rvcj1zO3MuY29uc3RydWN0b3I9cjtyLmRpc3BsYXlOYW1lPSJHZW5lcmF0b3JGdW5jdGlvbiI7ZnVuY3Rpb24gYShhKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24oYil7YVtiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW52b2tlKGIsYSl9fSl9aS5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PT0iZnVuY3Rpb24iJiZhLmNvbnN0cnVjdG9yO3JldHVybiBhP2E9PT1yfHwoYS5kaXNwbGF5TmFtZXx8YS5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiI6ITF9O2kubWFyaz1mdW5jdGlvbihhKXtPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGEscyk6T2JqZWN0LmFzc2lnbihhLHMpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCk7cmV0dXJuIGF9O2kuYXdyYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB1KGEpfTtmdW5jdGlvbiB1KGEpe3RoaXMuYXJnPWF9ZnVuY3Rpb24gdihhKXtmdW5jdGlvbiBjKGMsZil7dmFyIGc9YVtjXShmKTtjPWcudmFsdWU7cmV0dXJuIGMgaW5zdGFuY2VvZiB1P2IoIlByb21pc2UiKS5yZXNvbHZlKGMuYXJnKS50aGVuKGQsZSk6YigiUHJvbWlzZSIpLnJlc29sdmUoYykudGhlbihmdW5jdGlvbihhKXtnLnZhbHVlPWE7cmV0dXJuIGd9KX10eXBlb2YgcHJvY2Vzcz09PSJvYmplY3QiJiZwcm9jZXNzLmRvbWFpbiYmKGM9cHJvY2Vzcy5kb21haW4uYmluZChjKSk7dmFyIGQ9Yy5iaW5kKGEsIm5leHQiKSxlPWMuYmluZChhLCJ0aHJvdyIpO2MuYmluZChhLCJyZXR1cm4iKTt2YXIgZjtmdW5jdGlvbiBnKGEsZCl7dmFyIGU9Zj9mLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYyhhLGQpfSk6bmV3KGIoIlByb21pc2UiKSkoZnVuY3Rpb24oYil7YihjKGEsZCkpfSk7Zj1lWyJjYXRjaCJdKGZ1bmN0aW9uKGEpe30pO3JldHVybiBlfXRoaXMuX2ludm9rZT1nfWEodi5wcm90b3R5cGUpO2kuYXN5bmM9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bmV3IHYoaihhLGIsYyxkKSk7cmV0dXJuIGkuaXNHZW5lcmF0b3JGdW5jdGlvbihiKT9lOmUubmV4dCgpLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9uZT9hLnZhbHVlOmUubmV4dCgpfSl9O2Z1bmN0aW9uIHcoYSxiLGMpe3ZhciBkPWw7cmV0dXJuIGZ1bmN0aW9uKGUsZil7aWYoZD09PW4pdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoZD09PW8pe2lmKGU9PT0idGhyb3ciKXRocm93IGY7cmV0dXJuIEIoKX13aGlsZSghMCl7dmFyIGc9Yy5kZWxlZ2F0ZTtpZihnKXtpZihlPT09InJldHVybiJ8fGU9PT0idGhyb3ciJiZnLml0ZXJhdG9yW2VdPT09dm9pZCAwKXtjLmRlbGVnYXRlPW51bGw7dmFyIGg9Zy5pdGVyYXRvclsicmV0dXJuIl07aWYoaCl7aD1rKGgsZy5pdGVyYXRvcixmKTtpZihoLnR5cGU9PT0idGhyb3ciKXtlPSJ0aHJvdyI7Zj1oLmFyZztjb250aW51ZX19aWYoZT09PSJyZXR1cm4iKWNvbnRpbnVlfWg9ayhnLml0ZXJhdG9yW2VdLGcuaXRlcmF0b3IsZik7aWYoaC50eXBlPT09InRocm93Iil7Yy5kZWxlZ2F0ZT1udWxsO2U9InRocm93IjtmPWguYXJnO2NvbnRpbnVlfWU9Im5leHQiO2Y9dm9pZCAwO3ZhciBpPWguYXJnO2lmKGkuZG9uZSljW2cucmVzdWx0TmFtZV09aS52YWx1ZSxjLm5leHQ9Zy5uZXh0TG9jO2Vsc2V7ZD1tO3JldHVybiBpfWMuZGVsZWdhdGU9bnVsbH1pZihlPT09Im5leHQiKWQ9PT1tP2Muc2VudD1mOmMuc2VudD12b2lkIDA7ZWxzZSBpZihlPT09InRocm93Iil7aWYoZD09PWwpe2Q9bzt0aHJvdyBmfWMuZGlzcGF0Y2hFeGNlcHRpb24oZikmJihlPSJuZXh0IixmPXZvaWQgMCl9ZWxzZSBlPT09InJldHVybiImJmMuYWJydXB0KCJyZXR1cm4iLGYpO2Q9bjtoPWsoYSxiLGMpO2lmKGgudHlwZT09PSJub3JtYWwiKXtkPWMuZG9uZT9vOm07dmFyIGk9e3ZhbHVlOmguYXJnLGRvbmU6Yy5kb25lfTtpZihoLmFyZz09PXApYy5kZWxlZ2F0ZSYmZT09PSJuZXh0IiYmKGY9dm9pZCAwKTtlbHNlIHJldHVybiBpfWVsc2UgaC50eXBlPT09InRocm93IiYmKGQ9byxlPSJ0aHJvdyIsZj1oLmFyZyl9fX1hKHQpO3RbaF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifTtmdW5jdGlvbiB4KGEpe3ZhciBiPXt0cnlMb2M6YVswXX07MSBpbiBhJiYoYi5jYXRjaExvYz1hWzFdKTsyIGluIGEmJihiLmZpbmFsbHlMb2M9YVsyXSxiLmFmdGVyTG9jPWFbM10pO3RoaXMudHJ5RW50cmllcy5wdXNoKGIpfWZ1bmN0aW9uIHkoYSl7dmFyIGI9YS5jb21wbGV0aW9ufHx7fTtiLnR5cGU9Im5vcm1hbCI7ZGVsZXRlIGIuYXJnO2EuY29tcGxldGlvbj1ifWZ1bmN0aW9uIHooYSl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLGEuZm9yRWFjaCh4LHRoaXMpLHRoaXMucmVzZXQoITApfWkua2V5cz1mdW5jdGlvbihhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSliLnB1c2goYyk7Yi5yZXZlcnNlKCk7cmV0dXJuIGZ1bmN0aW9uIGMoKXt3aGlsZShiLmxlbmd0aCl7dmFyIGQ9Yi5wb3AoKTtpZihkIGluIGEpe2MudmFsdWU9ZDtjLmRvbmU9ITE7cmV0dXJuIGN9fWMuZG9uZT0hMDtyZXR1cm4gY319O2Z1bmN0aW9uIEEoYSl7aWYoYSl7dmFyIGI9YVtoXTtpZihiKXJldHVybiBiLmNhbGwoYSk7aWYodHlwZW9mIGEubmV4dD09PSJmdW5jdGlvbiIpcmV0dXJuIGE7aWYoIWlzTmFOKGEubGVuZ3RoKSl7dmFyIGM9LTE7Yj1mdW5jdGlvbiBiKCl7d2hpbGUoKytjPGEubGVuZ3RoKWlmKGcuY2FsbChhLGMpKXtiLnZhbHVlPWFbY107Yi5kb25lPSExO3JldHVybiBifWIudmFsdWU9dm9pZCAwO2IuZG9uZT0hMDtyZXR1cm4gYn07cmV0dXJuIGIubmV4dD1ifX1yZXR1cm57bmV4dDpCfX1pLnZhbHVlcz1BO2Z1bmN0aW9uIEIoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXoucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp6LHJlc2V0OmZ1bmN0aW9uKGEpe3RoaXMucHJldj0wO3RoaXMubmV4dD0wO3RoaXMuc2VudD12b2lkIDA7dGhpcy5kb25lPSExO3RoaXMuZGVsZWdhdGU9bnVsbDt0aGlzLnRyeUVudHJpZXMuZm9yRWFjaCh5KTtpZighYSlmb3IodmFyIGIgaW4gdGhpcyliLmNoYXJBdCgwKT09PSJ0IiYmZy5jYWxsKHRoaXMsYikmJiFpc05hTigrYi5zbGljZSgxKSkmJih0aGlzW2JdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIGE9dGhpcy50cnlFbnRyaWVzWzBdO2E9YS5jb21wbGV0aW9uO2lmKGEudHlwZT09PSJ0aHJvdyIpdGhyb3cgYS5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5kb25lKXRocm93IGE7dmFyIGI9dGhpcztmdW5jdGlvbiBjKGMsZCl7Zi50eXBlPSJ0aHJvdyI7Zi5hcmc9YTtiLm5leHQ9YztyZXR1cm4hIWR9Zm9yKHZhciBkPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtkPj0wOy0tZCl7dmFyIGU9dGhpcy50cnlFbnRyaWVzW2RdLGY9ZS5jb21wbGV0aW9uO2lmKGUudHJ5TG9jPT09InJvb3QiKXJldHVybiBjKCJlbmQiKTtpZihlLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgaD1nLmNhbGwoZSwiY2F0Y2hMb2MiKSxpPWcuY2FsbChlLCJmaW5hbGx5TG9jIik7aWYoaCYmaSl7aWYodGhpcy5wcmV2PGUuY2F0Y2hMb2MpcmV0dXJuIGMoZS5jYXRjaExvYywhMCk7ZWxzZSBpZih0aGlzLnByZXY8ZS5maW5hbGx5TG9jKXJldHVybiBjKGUuZmluYWxseUxvYyl9ZWxzZSBpZihoKXtpZih0aGlzLnByZXY8ZS5jYXRjaExvYylyZXR1cm4gYyhlLmNhdGNoTG9jLCEwKX1lbHNlIGlmKGkpe2lmKHRoaXMucHJldjxlLmZpbmFsbHlMb2MpcmV0dXJuIGMoZS5maW5hbGx5TG9jKX1lbHNlIHRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKX19fSxhYnJ1cHQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2M+PTA7LS1jKXt2YXIgZD10aGlzLnRyeUVudHJpZXNbY107aWYoZC50cnlMb2M8PXRoaXMucHJldiYmZy5jYWxsKGQsImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PGQuZmluYWxseUxvYyl7dmFyIGU9ZDticmVha319ZSYmKGE9PT0iYnJlYWsifHxhPT09ImNvbnRpbnVlIikmJmUudHJ5TG9jPD1iJiZiPD1lLmZpbmFsbHlMb2MmJihlPW51bGwpO2Q9ZT9lLmNvbXBsZXRpb246e307ZC50eXBlPWE7ZC5hcmc9YjtlP3RoaXMubmV4dD1lLmZpbmFsbHlMb2M6dGhpcy5jb21wbGV0ZShkKTtyZXR1cm4gcH0sY29tcGxldGU6ZnVuY3Rpb24oYSxiKXtpZihhLnR5cGU9PT0idGhyb3ciKXRocm93IGEuYXJnO2EudHlwZT09PSJicmVhayJ8fGEudHlwZT09PSJjb250aW51ZSI/dGhpcy5uZXh0PWEuYXJnOmEudHlwZT09PSJyZXR1cm4iPyh0aGlzLnJ2YWw9YS5hcmcsdGhpcy5uZXh0PSJlbmQiKTphLnR5cGU9PT0ibm9ybWFsIiYmYiYmKHRoaXMubmV4dD1iKX0sZmluaXNoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7Yj49MDstLWIpe3ZhciBjPXRoaXMudHJ5RW50cmllc1tiXTtpZihjLmZpbmFsbHlMb2M9PT1hKXt0aGlzLmNvbXBsZXRlKGMuY29tcGxldGlvbixjLmFmdGVyTG9jKTt5KGMpO3JldHVybiBwfX19LCJjYXRjaCI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtiPj0wOy0tYil7dmFyIGM9dGhpcy50cnlFbnRyaWVzW2JdO2lmKGMudHJ5TG9jPT09YSl7dmFyIGQ9Yy5jb21wbGV0aW9uO2lmKGQudHlwZT09PSJ0aHJvdyIpe3ZhciBlPWQuYXJnO3koYyl9cmV0dXJuIGV9fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkEoYSkscmVzdWx0TmFtZTpiLG5leHRMb2M6Y307cmV0dXJuIHB9fX0pLG51bGwpOwovLyMgc291cmNlVVJMPWh0dHBzOi8vc3RhdGljLnh4LmZiY2RuLm5ldC9yc3JjLnBocC92My95Ri9yL2cwdy1BZWdhcHFqLmpzP19uY194PWh2ZUdfZUtGVHZUCg==", + "d":1, + "nc":1, + "p":":15736" + }, + "UrI7K":{ + "type":"js", + "src":"data:application/x-javascript; charset=utf-8;base64,aWYgKHNlbGYuQ2F2YWxyeUxvZ2dlcikgeyBDYXZhbHJ5TG9nZ2VyLnN0YXJ0X2pzKFsiVXJJN0siXSk7IH0KCl9fZCgicm91dGVCdWlsZGVyVXRpbHMiLFtdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2YuZ2V0UGF0aFBhcnRzPWE7ZnVuY3Rpb24gYShhKXthPWEuc3BsaXQoIi8iKTtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0iIn0pLm1hcChmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KC97fH0vKTtpZihiLmxlbmd0aDwzKXJldHVybntpc1Rva2VuOiExLHBhcnQ6YX07ZWxzZXthPWJbMF07dmFyIGM9YlsxXTtiPWJbMl07dmFyIGQ9Y1swXT09PSI/IixlPWNbZD8xOjBdPT09IioiO2M9Yy5zdWJzdHJpbmcoKGQ/MTowKSsoZT8xOjApKTtyZXR1cm57aXNUb2tlbjohMCxvcHRpb25hbDpkLHByZWZpeDphLHN1ZmZpeDpiLHRva2VuOmN9fX0pfX0pLG51bGwpOwpfX2QoImpzUm91dGVCdWlsZGVyIixbIkNvbnN0VXJpVXRpbHMiLCJGQkxvZ2dlciIsInJvdXRlQnVpbGRlclV0aWxzIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWE7ZnVuY3Rpb24gYShhLGMsZCxlLGYpe2Y9PT12b2lkIDAmJihmPSExKTt2YXIgZz1iKCJyb3V0ZUJ1aWxkZXJVdGlscyIpLmdldFBhdGhQYXJ0cyhhKTtmdW5jdGlvbiBoKGYpe3ZhciBoPWUhPW51bGw/YmFiZWxIZWxwZXJzWyJleHRlbmRzIl0oe30sZSxmKTpmLGk9e307Zj0iIjt2YXIgaj0hMTtmPWcucmVkdWNlKGZ1bmN0aW9uKGEsYil7aWYoIWIuaXNUb2tlbilyZXR1cm4gYSsiLyIrYi5wYXJ0O2Vsc2V7dmFyIGQsZT1iLm9wdGlvbmFsLGY9Yi5wcmVmaXgsZz1iLnN1ZmZpeDtiPWIudG9rZW47aWYoZSYmailyZXR1cm4gYTtkPShkPWhbYl0pIT1udWxsP2Q6Y1tiXTtpZihkPT1udWxsJiZlKXtqPSEwO3JldHVybiBhfWlmKGQ9PW51bGwpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJlcXVpcmVkIHRlbXBsYXRlIHBhcmFtZXRlcjogIitiKTtpZihkPT09IiIpdGhyb3cgbmV3IEVycm9yKCJSZXF1aXJlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgYW4gZW1wdHkgc3RyaW5nOiAiK2IpO2lbYl09ITA7cmV0dXJuIGErIi8iK2YrZCtnfX0sIiIpO2Euc2xpY2UoLTEpPT09Ii8iJiYoZis9Ii8iKTtmPT09IiImJihmPSIvIik7dmFyIGs9YigiQ29uc3RVcmlVdGlscyIpLmdldFVyaShmKTtmb3IodmFyIGwgaW4gaCl7dmFyIG09aFtsXTshaVtsXSYmbSE9bnVsbCYmayE9bnVsbCYmKGQhPW51bGwmJmQuaGFzKGwpP20hPT0hMSYmKGs9ay5hZGRRdWVyeVBhcmFtKGwsbnVsbCkpOms9ay5hZGRRdWVyeVBhcmFtKGwsbSkpfXJldHVybiBrPT1udWxsP2Y6ay50b1N0cmluZygpfXJldHVybntidWlsZFVSTDpmdW5jdGlvbihjKXt0cnl7cmV0dXJuIGgoYyl9Y2F0Y2goZSl7Yz1lPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2U7dmFyIGQ9YigiRkJMb2dnZXIiKSgiSlNSb3V0ZUJ1aWxkZXIiKS5ibGFtZVRvUHJldmlvdXNGcmFtZSgpO2YmJihkPWQuYmxhbWVUb1ByZXZpb3VzRnJhbWUoKSk7ZC5tdXN0Zml4KCJGYWlsZWQgYnVpbGRpbmcgVVJMIGZvciBiYXNlIHBhdGg6ICVzIG1lc3NhZ2U6ICVzIixhLGMpO3JldHVybiIjIn19fX19KSxudWxsKTsKX19kKCJYQ29tZXRDb250ZXh0dWFsUHJvZmlsZUNvbnRyb2xsZXJSb3V0ZUJ1aWxkZXIiLFsianNSb3V0ZUJ1aWxkZXIiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9YigianNSb3V0ZUJ1aWxkZXIiKSgiL2dyb3Vwcy97Z3JvdXBfaWR9L3VzZXIve21lbWJlcl9pZH0vIixPYmplY3QuZnJlZXplKHt9KSx2b2lkIDApO2M9YTtlLmV4cG9ydHM9Y30pLG51bGwpOwpfX2QoIkNvbWV0Um91dGVyUGFyZW50Um91dGVDb250ZXh0IixbIlJlYWN0Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7YT1iKCJSZWFjdCIpO2M9YS5jcmVhdGVDb250ZXh0KG51bGwpO2UuZXhwb3J0cz1jfSksbnVsbCk7Cl9fZCgidXNlUGFyZW50Um91dGUiLFsiQ29tZXRSb3V0ZXJQYXJlbnRSb3V0ZUNvbnRleHQiLCJSZWFjdCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYSgpe3JldHVybiBnLnVzZUNvbnRleHQoYigiQ29tZXRSb3V0ZXJQYXJlbnRSb3V0ZUNvbnRleHQiKSl9fSksbnVsbCk7Cl9fZCgiQ29tZXRJbWFnZUZyb21JWFZhbHVlLnJlYWN0IixbIkJhc2VJbWFnZS5yZWFjdCIsIlJlYWN0IiwiUmVjb3ZlcmFibGVWaW9sYXRpb25XaXRoQ29tcG9uZW50U3RhY2sucmVhY3QiLCJjb2VyY2VJbWFnZWlzaFNwcml0ZWQiLCJjb2VyY2VJbWFnZWlzaFVSTCIsImpvaW5DbGFzc2VzIiwidGVzdElEIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7dmFyIGc9YigiUmVhY3QiKTtmdW5jdGlvbiBhKGEsYyl7dmFyIGQ9YS5hbHQsZT1hLnNvdXJjZTthPWEudGVzdGlkO3ZhciBmPWIoImNvZXJjZUltYWdlaXNoU3ByaXRlZCIpKGUpO2lmKGYhPW51bGwpe3ZhciBoPWYuc3ByaXRlQ3NzQ2xhc3M7Zj1mLnNwcml0ZU1hcENzc0NsYXNzO3JldHVybiBnLmpzeCgiaSIsYmFiZWxIZWxwZXJzWyJleHRlbmRzIl0oe30sYigidGVzdElEIikoYSkseyJhcmlhLWxhYmVsIjpkPT09IiI/bnVsbDpkLGNsYXNzTmFtZTpiKCJqb2luQ2xhc3NlcyIpKGYsaCkscmVmOmMscm9sZTpkPT09IiI/bnVsbDoiaW1nIn0pKX1hPWIoImNvZXJjZUltYWdlaXNoVVJMIikoZSk7aWYoYSE9bnVsbCl7Zj1hLmhlaWdodDtoPWEudXJpO2U9YS53aWR0aDtyZXR1cm4gZy5qc3goYigiQmFzZUltYWdlLnJlYWN0Iikse2FsdDpkLGRyYWdnYWJsZTohMSxoZWlnaHQ6ZixyZWY6YyxzcmM6aCx0ZXN0aWQ6dm9pZCAwLHdpZHRoOmV9KX1yZXR1cm4gZy5qc3goYigiUmVjb3ZlcmFibGVWaW9sYXRpb25XaXRoQ29tcG9uZW50U3RhY2sucmVhY3QiKSx7ZXJyb3JNZXNzYWdlOiJhc3NldCBwcm92aWRlZCB0byBDb21ldEltYWdlRnJvbUlYVmFsdWUgY2Fubm90IGJlIHRyYW5zZm9ybWVkIGJ5IEhhc3RlIixwcm9qZWN0TmFtZToiY29tZXRfdWkifSl9Yz1nLmZvcndhcmRSZWYoYSk7ZS5leHBvcnRzPWN9KSxudWxsKTsKX19kKCJDb21ldEltYWdlLnJlYWN0IixbIkJhc2VJbWFnZS5yZWFjdCIsIkNvbWV0SW1hZ2VGcm9tSVhWYWx1ZS5yZWFjdCIsIlJlYWN0IiwidXNlRmVlZEltYWdlRXJyb3JFdmVudExvZ2dlckNicyJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYShhLGMpe3ZhciBkPWEuYWx0LGU9YS5vbkVycm9yLGY9YS5vbkxvYWQsaD1hLnNyYyxpPWEudGVzdGlkO2k9YmFiZWxIZWxwZXJzLm9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoYSxbImFsdCIsIm9uRXJyb3IiLCJvbkxvYWQiLCJzcmMiLCJ0ZXN0aWQiXSk7YT1iKCJ1c2VGZWVkSW1hZ2VFcnJvckV2ZW50TG9nZ2VyQ2JzIikoe29uRXJyb3I6ZSxvbkxvYWQ6ZixzcmM6aH0pO2U9YS5fb25FcnJvcjtmPWEuX29uTG9hZDtyZXR1cm4gdHlwZW9mIGg9PT0ic3RyaW5nIj9nLmpzeChiKCJCYXNlSW1hZ2UucmVhY3QiKSxiYWJlbEhlbHBlcnNbImV4dGVuZHMiXSh7fSxpLHthbHQ6ZCxvbkVycm9yOmUsb25Mb2FkOmYscmVmOmMsc3JjOmgsdGVzdGlkOnZvaWQgMH0pKTpnLmpzeChiKCJDb21ldEltYWdlRnJvbUlYVmFsdWUucmVhY3QiKSx7YWx0OmQscmVmOmMsc291cmNlOmgsdGVzdGlkOnZvaWQgMH0pfWM9Zy5mb3J3YXJkUmVmKGEpO2UuZXhwb3J0cz1jfSksbnVsbCk7Cl9fZCgiQ29tZXRMaW5rLnJlYWN0IixbIkJhc2VMaW5rLnJlYWN0IiwiUmVhY3QiLCJUZXRyYVRleHRDb250ZXh0IiwiVGV0cmFUZXh0VHlwb2dyYXBoeSIsImlzQ29tZXRSb3V0ZXJVcmwiLCJzdHlsZXgiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0Ijt2YXIgZz1iKCJSZWFjdCIpLGg9e2Rpc2FibGVkOntjb2xvcjoiZXJsc3c5bGQiLCI6aG92ZXIiOnt0ZXh0RGVjb3JhdGlvbjoicDhkYXdrN2wifX0scm9vdDp7Y29sb3I6ImdtcWwwbngwIiwiOmhvdmVyIjp7dGV4dERlY29yYXRpb246Imdwcm8wd2k4In19fSxpPXtibHVlTGluazp7Y29sb3I6InB5MzRpMWR4In0saGlnaGxpZ2h0Ontjb2xvcjoicTY2cHo5ODQifSxuZWdhdGl2ZTp7Y29sb3I6ImpkaXg0eXgzIn0scG9zaXRpdmU6e2NvbG9yOiJnNW8xeWdmcSJ9LHByaW1hcnk6e2NvbG9yOiJvbzlncjVpZCJ9LHNlY29uZGFyeTp7Y29sb3I6Im05b3NxYWluIn0sdGVydGlhcnk6e2NvbG9yOiJwaXBwdHVsNiJ9LHdoaXRlOntjb2xvcjoibGpxc251ZDEifX0saj17Ym9sZDp7Zm9udFdlaWdodDoiaG5oZGE4NnMifSxtZWRpdW06e2ZvbnRXZWlnaHQ6ImVremtyYmhnIn0sbm9ybWFsOntmb250V2VpZ2h0OiJiMXY4eG9rdyJ9LHNlbWlib2xkOntmb250V2VpZ2h0OiJscmF6emQ1cCJ9fSxrPXtibG9jazp7ZGlzcGxheToiYThjMzd4MWoifSwiaW5saW5lLWJsb2NrIjp7ZGlzcGxheToicTl1b3JpbGIifX07ZnVuY3Rpb24gYShhLGMpe3ZhciBkPWEuY29sb3IsZT1hLmRpc2FibGVkO2U9ZT09PXZvaWQgMD8hMTplO3ZhciBmPWEuZGlzcGxheTtmPWY9PT12b2lkIDA/ImlubGluZSI6Zjt2YXIgbj1hLmZiY2xpZCxvPWEuaHJlZixwPWEubHlueE1vZGUscT1hLnJvbGUscj1hLnRhcmdldCxzPWEud2VpZ2h0LHQ9YS54c3R5bGU7YT1iYWJlbEhlbHBlcnMub2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShhLFsiY29sb3IiLCJkaXNhYmxlZCIsImRpc3BsYXkiLCJmYmNsaWQiLCJocmVmIiwibHlueE1vZGUiLCJyb2xlIiwidGFyZ2V0Iiwid2VpZ2h0IiwieHN0eWxlIl0pO3ZhciB1PWcudXNlQ29udGV4dChiKCJUZXRyYVRleHRDb250ZXh0IikpLHY9cj09PSJfYmxhbmsifHxvIT1udWxsJiZvIT09IiMiJiYhYigiaXNDb21ldFJvdXRlclVybCIpKG8pO2Q9KGQ9ZCkhPW51bGw/ZDp1IT1udWxsP2wodS50eXBlLHYpOiJpbmhlcml0IjtzPShzPXMpIT1udWxsP3M6dSE9bnVsbD9tKHUudHlwZSx2KToiaW5oZXJpdCI7dT1xPT1udWxsJiYobz09bnVsbHx8bz09PSIjIik/ImJ1dHRvbiI6cTtyZXR1cm4gZy5qc3goYigiQmFzZUxpbmsucmVhY3QiKSxiYWJlbEhlbHBlcnNbImV4dGVuZHMiXSh7fSxhLHtkaXNhYmxlZDplLGRpc3BsYXk6ImlubGluZSIsZmJjbGlkOm4saHJlZjpvLGx5bnhNb2RlOnAscmVmOmMscm9sZTp1LHRhcmdldDp2PyJfYmxhbmsiOnIseHN0eWxlOltoLnJvb3QsZCE9PSJpbmhlcml0IiYmaVtkXSxzIT09ImluaGVyaXQiJiZqW3NdLGUmJmguZGlzYWJsZWQsZiE9PSJpbmxpbmUiJiZrW2ZdLHRdfSkpfWZ1bmN0aW9uIGwoYSxiKXtzd2l0Y2goYSl7Y2FzZSJoZWFkbGluZTMiOmNhc2UiaGVhZGxpbmU0IjpjYXNlImJvZHkxIjpjYXNlImJvZHkyIjpjYXNlImJvZHkzIjpjYXNlImJvZHk0IjpyZXR1cm4gYj8iYmx1ZUxpbmsiOiJwcmltYXJ5IjtjYXNlIm1ldGExIjpjYXNlIm1ldGEyIjpjYXNlIm1ldGEzIjpjYXNlIm1ldGE0IjpyZXR1cm4gYj8iYmx1ZUxpbmsiOiJpbmhlcml0IjtkZWZhdWx0OnJldHVybiJpbmhlcml0In19ZnVuY3Rpb24gbShhLGMpe2lmKCFjKXtjPW4oYSk7cmV0dXJuIGIoIlRldHJhVGV4dFR5cG9ncmFwaHkiKVtjXS5mb250V2VpZ2h0fXJldHVybiJpbmhlcml0In1mdW5jdGlvbiBuKGEpe3N3aXRjaChhKXtjYXNlImhlYWRsaW5lMyI6cmV0dXJuImhlYWRsaW5lRW1waGFzaXplZDMiO2Nhc2UiaGVhZGxpbmU0IjpyZXR1cm4iaGVhZGxpbmVFbXBoYXNpemVkNCI7Y2FzZSJib2R5MSI6cmV0dXJuImJvZHlMaW5rMSI7Y2FzZSJib2R5MiI6cmV0dXJuImJvZHlMaW5rMiI7Y2FzZSJib2R5MyI6cmV0dXJuImJvZHlMaW5rMyI7Y2FzZSJib2R5NCI6cmV0dXJuImJvZHlMaW5rNCI7ZGVmYXVsdDpyZXR1cm4gYX19Yz1nLmZvcndhcmRSZWYoYSk7ZS5leHBvcnRzPWN9KSxudWxsKTsKX19kKCJDb21ldE1pZGRvdC5yZWFjdCIsWyJSZWFjdCIsInN0eWxleCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYShhKXtyZXR1cm4gZy5qc3hzKCJzcGFuIixiYWJlbEhlbHBlcnNbImV4dGVuZHMiXSh7fSxhLHtjaGlsZHJlbjpbZy5qc3goInNwYW4iLHtjbGFzc05hbWU6InJmdWEweGRrIHBtazdqbnFnIHN0amdudHhzIG5pOGRibW80IGF5N2RqcGNsIHE0NXpvaGkxIixjaGlsZHJlbjoiXHhhMCJ9KSxnLmpzeCgic3BhbiIseyJhcmlhLWhpZGRlbiI6InRydWUiLGNoaWxkcmVuOiIgXHhiNyAifSldfSkpfX0pLG51bGwpOwpfX2QoIkJhc2VBY2Nlc3NpYmxlRWxlbWVudF9ERVBSRUNBVEVELnJlYWN0IixbIlJlYWN0Iiwic3R5bGV4Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWE7dmFyIGc9YigiUmVhY3QiKTtmdW5jdGlvbiBhKGEpe3ZhciBiPWEuY2hpbGRyZW47YT1hLmlkO3JldHVybiBnLmpzeCgic3BhbiIse2NsYXNzTmFtZToicmZ1YTB4ZGsgcG1rN2pucWcgcGZ4M3Vla20gYXk3ZGpwY2wgZW1hMWU0MGggcTQ1em9oaTEiLCJkYXRhLWh0bWwyY2FudmFzLWlnbm9yZSI6InRydWUiLGlkOmEsY2hpbGRyZW46Yn0pfX0pLG51bGwpOwpfX2QoInVzZVNldEF0dHJpYnV0ZVJlZiIsWyJSZWFjdCJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBnLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGMpe2MhPW51bGwmJmMuc2V0QXR0cmlidXRlKGEsYil9LFthLGJdKX19KSxudWxsKTsKX19kKCJDb21ldEZlZWROb1JvdXRpbmdOYXZpZ2F0aW9uRXZlbnRzTG9nZ2VySW1wbCIsWyJKU1NjaGVkdWxlciIsIlJlYWN0IiwicmVxdWlyZURlZmVycmVkIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWE7dmFyIGc9YigiUmVhY3QiKSxoPWIoInJlcXVpcmVEZWZlcnJlZCIpKCJCYW56YWkiKTtmdW5jdGlvbiBhKGEsYyxkKXt2YXIgZT1nLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGIsZSxmLGcpe2lmKGM9PW51bGx8fGM9PT0iIilyZXR1cm47dmFyIGg9YmFiZWxIZWxwZXJzWyJleHRlbmRzIl0oe30sYi5WSVRBTCx7c2lnbmFsOiEwfSk7Yi5wb3N0KCJjb21ldF9tZXRyaWNzOm5hdmlnYXRpb24iLHtkZXN0X21vZHVsZTpnLGV4dHJhOmQsaHJlZjpmLHRuOmEuam9pbigiIiksdHM6ZSx4dDpjfSxoKX0sW2EsYyxkXSk7cmV0dXJuIGcudXNlQ2FsbGJhY2soZnVuY3Rpb24oYSxjLGQpe2IoIkpTU2NoZWR1bGVyIikuc2NoZWR1bGVMb2dnaW5nUHJpQ2FsbGJhY2soZnVuY3Rpb24oKXtyZXR1cm4gaC5vblJlYWR5KGZ1bmN0aW9uKGIpe3JldHVybiBlKGIsYSxjLGQpfSl9KX0sW2VdKX19KSxudWxsKTsKX19kKCJ1c2VDb21ldEZlZWROb1JvdXRpbmdOYXZpZ2F0aW9uRXZlbnRMb2dnZXIiLFsiQ29tZXRGZWVkTG9nZ2luZ0V4dHJhRmllbGRzQ29udGV4dCIsIkNvbWV0RmVlZE5vUm91dGluZ05hdmlnYXRpb25FdmVudHNMb2dnZXJJbXBsIiwiQ29tZXRUcmFja2luZ0NvZGVDb250ZXh0IiwiQ29tZXRUcmFja2luZ05vZGVzQ29udGV4dCIsIlJlYWN0IiwiZW1wdHlGdW5jdGlvbiJdLChmdW5jdGlvbihhLGIsYyxkLGUsZil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1hO3ZhciBnPWIoIlJlYWN0Iik7ZnVuY3Rpb24gYShhKXt2YXIgYz1nLnVzZUNvbnRleHQoYigiQ29tZXRUcmFja2luZ05vZGVzQ29udGV4dCIpKSxkPWcudXNlQ29udGV4dChiKCJDb21ldFRyYWNraW5nQ29kZUNvbnRleHQiKSk7ZD1kLmVuY3J5cHRlZF90cmFja2luZ1swXTt2YXIgZT1nLnVzZUNvbnRleHQoYigiQ29tZXRGZWVkTG9nZ2luZ0V4dHJhRmllbGRzQ29udGV4dCIpKTtyZXR1cm4gZD09PW51bGx8fGQ9PT12b2lkIDA/YigiZW1wdHlGdW5jdGlvbiIpOmIoIkNvbWV0RmVlZE5vUm91dGluZ05hdmlnYXRpb25FdmVudHNMb2dnZXJJbXBsIikoKGE9YSkhPW51bGw/YTpjLGQsZSl9fSksbnVsbCk7Cl9fZCgiUHJvZmlsZUNvbWV0TGlua0NvbnRleHQiLFsiUmVhY3QiXSwoZnVuY3Rpb24oYSxiLGMsZCxlLGYpeyJ1c2Ugc3RyaWN0IjthPWIoIlJlYWN0Iik7Yz1hLmNyZWF0ZUNvbnRleHQoe2dyb3VwSUQ6bnVsbH0pO2UuZXhwb3J0cz1jfSksbnVsbCk7Cl9fZCgiRE9NUmVjdElzRXF1YWwiLFsiRE9NUmVjdFJlYWRPbmx5Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWE7ZnVuY3Rpb24gYShhLGIpe2lmKCFhJiYhYilyZXR1cm4hMDtlbHNlIGlmKCFhfHwhYilyZXR1cm4hMTtyZXR1cm4gYS54PT09Yi54JiZhLnk9PT1iLnkmJmEud2lkdGg9PT1iLndpZHRoJiZhLmhlaWdodD09PWIuaGVpZ2h0fX0pLG51bGwpOwpfX2QoIkZidExvZ2dpbmciLFsicmVxdWlyZUNvbmQiLCJjcjoxMDk0OTA3Il0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7YT1iKCJjcjoxMDk0OTA3Iik9PW51bGw/dm9pZCAwOmIoImNyOjEwOTQ5MDciKS5sb2dJbXByZXNzaW9uO2YubG9nSW1wcmVzc2lvbj1hfSksbnVsbCk7Cl9fZCgiTHlueEFzeW5jQ2FsbGJhY2tGYWxjb0V2ZW50IixbIkZhbGNvTG9nZ2VySW50ZXJuYWwiLCJnZXRGYWxjb0xvZ1BvbGljeV9ET19OT1RfVVNFIl0sKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXsidXNlIHN0cmljdCI7YT1iKCJnZXRGYWxjb0xvZ1BvbGljeV9ET19OT1RfVVNFIikoIjE3NDM4ODciKTtjPWIoIkZhbGNvTG9nZ2VySW50ZXJuYWwiKS5jcmVhdGUoImx5bnhfYXN5bmNfY2FsbGJhY2siLGEpO2UuZXhwb3J0cz1jfSksbnVsbCk7Ci8vIyBzb3VyY2VVUkw9aHR0cHM6Ly9zdGF0aWMueHguZmJjZG4ubmV0L3JzcmMucGhwL3YzL3kzL3IvZTR4MElNdkI0c0QuanM/X25jX3g9aHZlR19lS0ZUdlQK", + "d":1, + "nc":1, + "p":":21" + } + }, + "compMap":{ + "BirthdayCometProfilePictureOnUser_user$normalization.graphql":{ + "r":[ + "csr:_1_2" + ] + }, + "BirthdayCometProfilePictureOnUser.react":{ + "r":[ + "lTlS3", + "UrI7K", + "qaRVw", + "4dAMZ", + "csr:_1_3" + ], + "rds":{ + "m":[ + "Banzai", + "BanzaiODS", + "FbtLogging", + "LynxAsyncCallbackFalcoEvent", + "BanzaiScuba", + "CometConfirmationDialogImpl.react" + ], + "r":[ + "csr:_1_4" + ] + } + }, + "CometHovercardQueryRenderer.react":{ + "r":[ + "lTlS3", + "qaRVw", + "4dAMZ", + "csr:_1_5" + ], + "be":1 + }, + "BanzaiODS":{ + "r":[ + "csr:_1_6" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba" + ], + "r":[ + "csr:_1_7" + ] + } + }, + "Banzai":{ + "r":[ + "csr:_1_8" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba" + ], + "r":[ + "csr:_1_9" + ] + } + }, + "FbtLogging":{ + "r":[ + "UrI7K", + "csr:_1_a" + ] + }, + "LynxAsyncCallbackFalcoEvent":{ + "r":[ + "UrI7K", + "qaRVw", + "csr:_1_b" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba" + ], + "r":[ + "csr:_1_c" + ] + } + }, + "BladeRunnerClient":{ + "r":[ + "lTlS3", + "qaRVw", + "csr:_1_d" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba", + "MqttLongPollingRunner", + "BladeRunnerClient" + ], + "r":[ + "csr:_1_e" + ] + }, + "be":1 + }, + "BladeRunnerStreamHandler":{ + "r":[ + "csr:_1_f" + ], + "be":1 + }, + "WebSession":{ + "r":[ + "csr:_1_g" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba" + ], + "r":[ + "csr:_1_h" + ] + }, + "be":1 + }, + "FalcoBladeRunnerTransport":{ + "r":[ + "csr:_1_i" + ], + "be":1 + }, + "BanzaiScuba":{ + "r":[ + "csr:_1_j" + ], + "rds":{ + "m":[ + "BanzaiODS", + "BanzaiScuba" + ] + } + }, + "CometConfirmationDialogImpl.react":{ + "r":[ + "lTlS3", + "4dAMZ", + "qaRVw", + "csr:_1_k" + ], + "rds":{ + "m":[ + "Banzai", + "BanzaiODS", + "FbtLogging", + "LynxAsyncCallbackFalcoEvent", + "CometConfirmationDialogImpl.react", + "BanzaiScuba" + ], + "r":[ + "UrI7K", + "csr:_1_l" + ] + } + }, + "CometCompatModal.react":{ + "r":[ + "pucNV", + "tQht2", + "lTlS3", + "UrI7K", + "qaRVw", + "NoTm2", + "4dAMZ", + "csr:_1_m" + ], + "rds":{ + "m":[ + "Banzai", + "BanzaiODS", + "BanzaiScuba", + "BladeRunnerClient", + "SkywalkerUtils", + "CometToast.react", + "FleetBeaconSubscriptionLauncher", + "MWChatMultitabCookieWriter.bs", + "FbtLogging", + "LynxAsyncCallbackFalcoEvent", + "CometConfirmationDialogImpl.react", + "MqttLongPollingRunner" + ], + "r":[ + "csr:_1_n" + ] + }, + "be":1 + } + } + } + }, + "jsmods":{ + "define":[ + [ + "cr:696703", + [ + "JSScheduler" + ], + { + "__rc":[ + "JSScheduler", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:717822", + [ + "TimeSliceSham" + ], + { + "__rc":[ + "TimeSliceSham", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:806696", + [ + "clearTimeoutComet" + ], + { + "__rc":[ + "clearTimeoutComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:807042", + [ + "setTimeoutComet" + ], + { + "__rc":[ + "setTimeoutComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:896462", + [ + "setIntervalComet" + ], + { + "__rc":[ + "setIntervalComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:986633", + [ + "setTimeoutComet" + ], + { + "__rc":[ + "setTimeoutComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1003267", + [ + "clearIntervalComet" + ], + { + "__rc":[ + "clearIntervalComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:683059", + [ + "CometVisualCompletion" + ], + { + "__rc":[ + "CometVisualCompletion", + "Aa2h0s3bk_0fQH0kV4Gt8TL6qA1Lf8Mf9xUyllLxXoYx_oqHozb0m6x8icR_Bzq2TWjVY9I8RhMs6hPROSGXipAXXFjPBUIcUdBpy0qt" + ] + }, + -1 + ], + [ + "cr:888908", + [ + "warningComet" + ], + { + "__rc":[ + "warningComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:894130", + [ + + ], + { + "__rc":[ + None, + "Aa0GI2ylcJkbu-MzLuIgP92iAeRmpU9N179YFcl-uSfQf9fiy7H3t8DgQEDWkZv4gguc0-jJPo0YTSh2OT-Y2A" + ] + }, + -1 + ], + [ + "cr:956931", + [ + "useCometPrerendererImpl" + ], + { + "__rc":[ + "useCometPrerendererImpl", + "Aa246Z3gbniBxppTn4mhaHV0QDEUFXGoRfPunrPlGb8gmEZDNjFDz1PDUUBYTxLZVuVCe8UFt25Mgk0VT3zTKr-5UdbY8vk" + ] + }, + -1 + ], + [ + "cr:1064332", + [ + + ], + { + "__rc":[ + None, + "Aa3mialHKK4bJQsKT56h9lhFUtWu09PD7cTahsYoZ43wKs_Og6Zg8qcid4h9ADQOsf9MivstwlQ" + ] + }, + -1 + ], + [ + "cr:1105154", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1106516", + [ + + ], + { + "__rc":[ + None, + "Aa1uT4ogJFl3g_LBBke-dT4E4T3zbwgQ_J6AhVHa9nQD16Y9I5UU8wBaJsJ92M8tvmnh_rWZQzxC" + ] + }, + -1 + ], + [ + "cr:1108857", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1183579", + [ + "InlineFbtResultImplComet" + ], + { + "__rc":[ + "InlineFbtResultImplComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1294158", + [ + "React.classic" + ], + { + "__rc":[ + "React.classic", + "Aa3fN-ajIp4UM5j229dx1IpS1hdgu0TYlCUNxrVy5HkK5WcOaVMwDgBDLBeawslF-d4YBGfjspE9jA5sbpLnCWF4" + ] + }, + -1 + ], + [ + "cr:1294159", + [ + "ReactDOM.classic" + ], + { + "__rc":[ + "ReactDOM.classic", + "Aa3fN-ajIp4UM5j229dx1IpS1hdgu0TYlCUNxrVy5HkK5WcOaVMwDgBDLBeawslF-d4YBGfjspE9jA5sbpLnCWF4" + ] + }, + -1 + ], + [ + "cr:1506469", + [ + + ], + { + "__rc":[ + None, + "Aa2KZrpj49Vz3M9dTjLQkZ3l0Ol0pi-eWMyAVNGOSgASaTXXmsHCiRWppeURVhyO4hJHEvU" + ] + }, + -1 + ], + [ + "cr:1522191", + [ + "CometLinkTrackingUtils.facebook" + ], + { + "__rc":[ + "CometLinkTrackingUtils.facebook", + "Aa21AzYjEKPjXGIxMMbxH1f8IuZ2s_s6cho5FCdmgGevOr2yaDuJg1KFogcSAkfWtkrsf1S96JCxij2Y2qiS2nNzYxHfn3YdHw" + ] + }, + -1 + ], + [ + "cr:1637900", + [ + "CometDarkModeContext" + ], + { + "__rc":[ + "CometDarkModeContext", + "Aa2KZrpj49Vz3M9dTjLQkZ3l0Ol0pi-eWMyAVNGOSgASaTXXmsHCiRWppeURVhyO4hJHEvU" + ] + }, + -1 + ], + [ + "cr:1642797", + [ + "BanzaiComet" + ], + { + "__rc":[ + "BanzaiComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1645510", + [ + + ], + { + "__rc":[ + None, + "Aa3HkjX8N1jQu8dOaJkkCGGpbfB7ECynhOResTJ4IL_hgSQg-I7bQK0_Fk4MzvLl7BM9uFUFtKvSPrxgpFF9Kxoo3A" + ] + }, + -1 + ], + [ + "cr:1651548", + [ + "useCometPreloaderImpl" + ], + { + "__rc":[ + "useCometPreloaderImpl", + "Aa246Z3gbniBxppTn4mhaHV0QDEUFXGoRfPunrPlGb8gmEZDNjFDz1PDUUBYTxLZVuVCe8UFt25Mgk0VT3zTKr-5UdbY8vk" + ] + }, + -1 + ], + [ + "cr:1654107", + [ + "emptyFunction" + ], + { + "__rc":[ + "emptyFunction", + "Aa1KGvqfUC1Z3CtCorPRKxcZmZAO--NKqSIJxYmFbfQwOraqfJN46dsNWnmzEe9KUZuF5aFlw9MSKczf23zTa87qah8nSLc" + ] + }, + -1 + ], + [ + "cr:1789196", + [ + + ], + { + "__rc":[ + None, + "Aa3VvMT-nvaC8wiIjNWPI_yCD0_HqxcQxMHdEteMQsrcZsYgo62-KPwZk4uRkNpHUuZhSNkK-B4O1E5pGnVgtsYcHpsjnPS1p83SPC7O-KV68gz3uXI" + ] + }, + -1 + ], + [ + "cr:1791018", + [ + "CometInteractionVC" + ], + { + "__rc":[ + "CometInteractionVC", + "Aa2h0s3bk_0fQH0kV4Gt8TL6qA1Lf8Mf9xUyllLxXoYx_oqHozb0m6x8icR_Bzq2TWjVY9I8RhMs6hPROSGXipAXXFjPBUIcUdBpy0qt" + ] + }, + -1 + ], + [ + "cr:1791501", + [ + "CometVCTracker" + ], + { + "__rc":[ + "CometVCTracker", + "Aa2h0s3bk_0fQH0kV4Gt8TL6qA1Lf8Mf9xUyllLxXoYx_oqHozb0m6x8icR_Bzq2TWjVY9I8RhMs6hPROSGXipAXXFjPBUIcUdBpy0qt" + ] + }, + -1 + ], + [ + "cr:1808490", + [ + + ], + { + "__rc":[ + None, + "Aa1HcQbkQwbM2tWyGFWOFvGQeC0i3Iih6Xj-2oOsnJSj3NnI1S71de-or_FwFz_5bUoZVH9u_ARE65afpHHYhGAu_GY" + ] + }, + -1 + ], + [ + "cr:1094907", + [ + + ], + { + "__rc":[ + None, + "Aa0yYX8JGTUIMafKT4gG7xlZyQBv-LN3jyWiHbW3Fs2DetdGsJgyB5fvMjqfsobRo-BV86jTwg3PuZmawbw" + ] + }, + -1 + ], + [ + "cr:1292369", + [ + "SchedulerTracing-prod.classic" + ], + { + "__rc":[ + "SchedulerTracing-prod.classic", + "Aa0CRjKV8Si3sLO4Rw1gm1Yj2YYRnvE2v_sBMcyjVshQwhpWqfehg0iTsx2zTN3on4Y6UNlcjMMxxZ1tObBnz38kGIalGw" + ] + }, + -1 + ], + [ + "cr:1642790", + [ + "vc-tracker.WWW" + ], + { + "__rc":[ + "vc-tracker.WWW", + "Aa0g8P5_LaRC6A5wd499xvQilgrvv8RPj90TtHBvk-6k3nHjvrqcXtJtpmCBJlIonlcS97yg5OCqsg" + ] + }, + -1 + ], + [ + "cr:983844", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1072546", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1072547", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1072549", + [ + + ], + { + "__rc":[ + None, + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:860400", + [ + "CometDialogContextComet" + ], + { + "__rc":[ + "CometDialogContextComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:896461", + [ + "setIntervalComet" + ], + { + "__rc":[ + "setIntervalComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:925100", + [ + "RunComet" + ], + { + "__rc":[ + "RunComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:947162", + [ + "useCometConfirmationDialogComet" + ], + { + "__rc":[ + "useCometConfirmationDialogComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1292365", + [ + "React-prod.classic" + ], + { + "__rc":[ + "React-prod.classic", + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:1344485", + [ + "ReactDOM.classic.prod-or-profiling" + ], + { + "__rc":[ + "ReactDOM.classic.prod-or-profiling", + "Aa15wWoKq1MNyTw8b_pgjdUi0JBQ82Zkx8hCuDlgYb6TpFXyWCC0k_Y2lvZp_X96hc43nRVelt8TbQ" + ] + }, + -1 + ], + [ + "cr:692209", + [ + "cancelIdleCallbackComet" + ], + { + "__rc":[ + "cancelIdleCallbackComet", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1268629", + [ + "setTimeoutCometLoggingPri" + ], + { + "__rc":[ + "setTimeoutCometLoggingPri", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1268630", + [ + "setTimeoutCometSpeculative" + ], + { + "__rc":[ + "setTimeoutCometSpeculative", + "Aa0FnMC5SXrQVaDT7G0SUrGuuMLDUVjiLFqCLx1bOJ8tnE52V4KQbg57Lz975DdLqK2ggtnseohmn7oY3T3A4rA" + ] + }, + -1 + ], + [ + "cr:1344486", + [ + "ReactDOM.classic.prod" + ], + { + "__rc":[ + "ReactDOM.classic.prod", + "Aa0CRjKV8Si3sLO4Rw1gm1Yj2YYRnvE2v_sBMcyjVshQwhpWqfehg0iTsx2zTN3on4Y6UNlcjMMxxZ1tObBnz38kGIalGw" + ] + }, + -1 + ], + [ + "cr:1344487", + [ + "ReactDOM-prod.classic" + ], + { + "__rc":[ + "ReactDOM-prod.classic", + "Aa03m8F45skRh2Pfu8gmIPRnnX54O3XFaYQ-EP4DtWQ-daU257CAEnfK1jPln9Wp8ccIeS2tdrX0Chx5VnXz8T-Fy9GsJuKRZODU" + ] + }, + -1 + ], + [ + "cr:1353359", + [ + "CometEventListener" + ], + { + "__rc":[ + "CometEventListener", + "Aa1cMwVm6D99GxnKao1GvFJT0EySQ2DkPy01iN-4wjd-aBqeZpmsz1r4KiSvGlFAiDlJzCfVM0aHxf0oAp3c9TZK33pcAA" + ] + }, + -1 + ] + ], + "require":[ + [ + "BirthdayCometProfilePictureOnUser_user$normalization.graphql" + ], + [ + "BirthdayCometProfilePictureOnUser.react" + ], + [ + "emptyFunction", + "thatReturns", + [ + "RequireDeferredReference" + ], + [ + [ + { + "__dr":"BirthdayCometProfilePictureOnUser_user$normalization.graphql" + }, + { + "__dr":"BirthdayCometProfilePictureOnUser.react" + } + ] + ] + ], + [ + "BanzaiODS" + ], + [ + "Banzai" + ], + [ + "FbtLogging" + ], + [ + "LynxAsyncCallbackFalcoEvent" + ], + [ + "BanzaiScuba" + ], + [ + "CometConfirmationDialogImpl.react" + ], + [ + "Bootloader", + "markComponentsAsImmediate", + [ + + ], + [ + [ + "BirthdayCometProfilePictureOnUser_user$normalization.graphql", + "BirthdayCometProfilePictureOnUser.react" + ] + ] + ], + [ + "Bootloader", + "markComponentsAsImmediate", + [ + + ], + [ + [ + "BanzaiODS", + "Banzai", + "FbtLogging", + "LynxAsyncCallbackFalcoEvent", + "BanzaiScuba", + "CometConfirmationDialogImpl.react" + ] + ] + ] + ] + }, + "allResources":[ + "lTlS3", + "UrI7K", + "qaRVw", + "4dAMZ", + "csr:_1_0", + "csr:_1_1" + ] + } + } + } +} \ No newline at end of file diff --git a/tests/test_ics_writer.py b/tests/test_ics_writer.py new file mode 100644 index 0000000..f5ae44b --- /dev/null +++ b/tests/test_ics_writer.py @@ -0,0 +1,136 @@ +import unittest +from unittest.mock import patch +from datetime import datetime, date +from ics import Calendar, Event + +from fb2cal import ICSWriter, FacebookUser + +class TestICSWriter(unittest.TestCase): + def setUp(self): + self.facebook_users = [ + FacebookUser( + '100000000', + 'John Smith', + 'https://www.facebook.com/john.smith.23', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000001_10161077510019848_299841799451806933_o.jpg', + 20, + 1, + ), + FacebookUser( + '100000001', + 'Laura Daisy', + 'https://www.facebook.com/laura.dasy.2', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000002_10161077510019848_299841799451806933_o.jpg', + 12, + 3, + ), + FacebookUser( + '100000002', + '韩忠清', + 'https://www.facebook.com/韩忠清', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000002_10161077510019848_299841799451806933_o.jpg', + 6, + 6, + ), + FacebookUser( + '100000003', + 'حكيم هديّة', + 'https://www.facebook.com/hadiyya', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000003_10161077510019848_299841799451806933_o.jpg', + 26, + 10, + ), + FacebookUser( + '100000004', + 'Leap Year', + 'https://www.facebook.com/leap.year', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000004_10161077510019848_299841799451806933_o.jpg', + 29, + 2, + ), + FacebookUser( + '100000005', + 'Mónica Bellucci', + 'https://www.facebook.com/mo.lucci', + 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/00000005_10161077510019848_299841799451806933_o.jpg', + 31, + 12, + ), + ] + self.ics_writer = ICSWriter(self.facebook_users) + self.maxDiff = None + + def test_ics_writer_equivalence(self): + + with patch('datetime.date') as mock_date: + mock_date.now.return_value = date(2010, 10, 8) + print(datetime.now()) + + self.ics_writer.generate() + actual_calendar = self.ics_writer.get_birthday_calendar() + expected = """BEGIN:VCALENDAR +X-WR-CALNAME:Facebook Birthdays (fb2cal) +X-PUBLISHED-TTL:PT12H +X-ORIGINAL-URL:/events/birthdays/ +CALSCALE:GREGORIAN +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20210120 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:John Smith's Birthday +UID:100000000 +END:VEVENT +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20210312 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:Laura Daisy's Birthday +UID:100000001 +END:VEVENT +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20210606 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:韩忠清's Birthday +UID:100000002 +END:VEVENT +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20211026 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:حكيم هديّة's Birthday +UID:100000003 +END:VEVENT +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20210228 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:Leap Year's Birthday +UID:100000004 +END:VEVENT +BEGIN:VEVENT +RRULE:FREQ=YEARLY +DTSTART;VALUE=DATE:20201231 +DTSTAMP:20201113T071402Z +DURATION:P1D +SUMMARY:Mónica Bellucci's Birthday +UID:100000005 +END:VEVENT +METHOD:PUBLISH +PRODID:fb2cal v1.2.0 (Production) [https://git.io/fjMwr] +VERSION:2.0 +END:VCALENDAR +""" + + expected_calendar = Calendar(expected) + + for actual, expected in zip(actual_calendar.events, expected_calendar.events): + self.assertEqual(actual.uid, expected.uid) + self.assertEqual(actual.name, expected.name) + self.assertEqual(actual.begin, expected.begin) + self.assertEqual(actual.duration, expected.duration) \ No newline at end of file diff --git a/tests/test_transformer.py b/tests/test_transformer.py new file mode 100644 index 0000000..f8da915 --- /dev/null +++ b/tests/test_transformer.py @@ -0,0 +1,42 @@ +import unittest +from fb2cal import Transformer + +from mocks.birthday_comet_root_mocks import BIRTHDAY_COMET_ROOT_JANUARY_MOCK + +class TestTransformer(unittest.TestCase): + def setUp(self): + self.transformer = Transformer() + self.facebook_users = self.transformer.transform_birthday_comet_root_to_birthdays(BIRTHDAY_COMET_ROOT_JANUARY_MOCK) + + def test_count(self): + self.assertEqual(len(self.facebook_users), 3) + + def test_friend_in_november(self): + friend = self.facebook_users[0] + self.assertEqual(friend.id, '600009847') + self.assertEqual(friend.name, 'Pirate Pete') + self.assertEqual(friend.profile_url, 'https://www.facebook.com/pirate.pete') + self.assertEqual(friend.profile_picture_uri, 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/122897864_10161077510019848_299841799681806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7206a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0') + self.assertEqual(friend.birthday_day, 1) + self.assertEqual(friend.birthday_month, 11) + + def test_friend_in_december(self): + friend = self.facebook_users[1] + self.assertEqual(friend.id, '1000023') + self.assertEqual(friend.name, 'Santa Claus') + self.assertEqual(friend.profile_url, 'https://www.facebook.com/santa') + self.assertEqual(friend.profile_picture_uri, 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/53497864_10161077510019848_299841799451806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7206a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0') + self.assertEqual(friend.birthday_day, 25) + self.assertEqual(friend.birthday_month, 12) + + def test_friend_in_january(self): + friend = self.facebook_users[2] + self.assertEqual(friend.id, '198041065') + self.assertEqual(friend.name, 'Albus Dumbledore') + self.assertEqual(friend.profile_url, 'https://www.facebook.com/prof.albus') + self.assertEqual(friend.profile_picture_uri, 'https://scontent-syd2-1.xx.fbcdn.net/v/t1.0-1/cp0/p60x60/34f34864_10161077510019848_299841799681806933_o.jpg?_nc_cat=107&ccb=2&_nc_sid=7406a8&_nc_ohc=yzAYhtdvoMYAX9Zxo1e&_nc_ht=scontent-syd2-1.xx&tp=27&oh=dc48247e31223151bc5d55781a572e2f&oe=5FD254D0') + self.assertEqual(friend.birthday_day, 17) + self.assertEqual(friend.birthday_month, 1) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file